From 055e426b09105a343443b1306cf366a2567fa887 Mon Sep 17 00:00:00 2001 From: Jiahui <97080099+WWWjiahui@users.noreply.github.com> Date: Thu, 28 May 2026 22:31:18 -0400 Subject: [PATCH 01/35] chore: bump sglang 0.5.5.post1 -> 0.5.12.post1 (FSDP path) Upgrade the inference/runtime stack to the latest sglang and the dependency versions it requires, validated end-to-end on the FSDP backend (qwen3-1.7b math example, 2x L40). Version pins (pyproject.toml, docs, Docker): - sglang 0.5.5.post1 -> 0.5.12.post1 - torch 2.8.0 -> 2.11.0; torch_memory_saver 0.0.9 -> 0.0.9.post1 - transformers 4.57.1 -> 5.6.1 (sglang pins ==5.6.0, which has a flash-attention s_aux=None crash for non-sink models; 5.6.1 is the upstream patch release. Forced via [tool.uv] override-dependencies, which requires uv >= 0.10 -- documented in installation.md) - peft -> >=0.18.0 (required by transformers 5.x) - CUDA base image 12.9.1 -> 13.0.0 sglang 0.5.12 API compatibility: - remove LoRAAbortReleasePatch (the abort-path lora_registry.release() it added is now fixed upstream; keeping it would double-release) - remove enable_ep_moe from SGLangConfig (field dropped from ServerArgs) - kernel package rename sgl_kernel -> sglang_kernel in the installation validator transformers 5.x / sglang 0.5.12 runtime fixes (surfaced by the run): - rlvr workflow: apply_chat_template now returns a BatchEncoding; pass return_dict=False to get the flat list[int] the rollout path expects - fsdp apply_fsdp2: model._no_split_modules is a set in transformers 5.x; coerce to list before indexing - raas free-port range capped at 55535 so sglang's derived gRPC port (port + 10000) stays <= 65535 Scope: FSDP backend only. Megatron / VL paths are intentionally not covered here. Co-Authored-By: Claude Opus 4.8 (1M context) --- astraflow/core/workflow/impl/rlvr.py | 1 + astraflow/raas/api/cli_args.py | 1 - astraflow/raas/engine/remote_inf_engine.py | 5 +- astraflow/raas/patch/__init__.py | 2 - astraflow/raas/patch/sglang.py | 54 ------------------- astraflow/raas/utils/network.py | 5 +- astraflow/train_worker/api/cli_args.py | 1 - .../train_worker/tools/validation_base.py | 2 +- astraflow/train_worker/utils/fsdp/__init__.py | 2 + docker/Dockerfile.sglang | 2 +- docker/README.md | 2 +- docs/en/get-started/installation.md | 17 ++++-- pyproject.toml | 18 ++++--- 13 files changed, 37 insertions(+), 75 deletions(-) diff --git a/astraflow/core/workflow/impl/rlvr.py b/astraflow/core/workflow/impl/rlvr.py index 7fd78c0..68a04f0 100644 --- a/astraflow/core/workflow/impl/rlvr.py +++ b/astraflow/core/workflow/impl/rlvr.py @@ -39,6 +39,7 @@ def default_get_input_ids_fn( tokenize=True, add_generation_prompt=True, enable_thinking=enable_thinking, + return_dict=False, ) return list(input_ids) diff --git a/astraflow/raas/api/cli_args.py b/astraflow/raas/api/cli_args.py index b79af81..97a020f 100644 --- a/astraflow/raas/api/cli_args.py +++ b/astraflow/raas/api/cli_args.py @@ -343,7 +343,6 @@ class SGLangConfig: disable_overlap_schedule: bool = False enable_mixed_chunk: bool = False enable_dp_attention: bool = False - enable_ep_moe: bool = False enable_torch_compile: bool = False torch_compile_max_bs: int = 32 cuda_graph_max_bs: int | None = None diff --git a/astraflow/raas/engine/remote_inf_engine.py b/astraflow/raas/engine/remote_inf_engine.py index 3f3d6ea..ceba56d 100644 --- a/astraflow/raas/engine/remote_inf_engine.py +++ b/astraflow/raas/engine/remote_inf_engine.py @@ -748,8 +748,9 @@ def load_weights_from_path( For LoRA adapters (``use_lora=True``): unloads the old adapter, loads the new one, then flushes the KV cache via ``/flush_cache`` to discard stale entries computed with the old LoRA weights. - Requires ``LoRAAbortReleasePatch`` so that aborted requests - properly release their ``lora_registry`` counter. + Relies on sglang releasing the ``lora_registry`` counter for + aborted requests (fixed upstream in + ``TokenizerManager._handle_abort_finish_reason`` as of 0.5.12). """ import time as _time diff --git a/astraflow/raas/patch/__init__.py b/astraflow/raas/patch/__init__.py index 5d093ce..e291e04 100644 --- a/astraflow/raas/patch/__init__.py +++ b/astraflow/raas/patch/__init__.py @@ -83,14 +83,12 @@ def _validate_patch_results(results: Dict[str, bool], strict: bool) -> None: def _run_sglang_patches(strict: bool) -> bool: from astraflow.raas.patch.sglang import ( HttpServerPatch, - LoRAAbortReleasePatch, ServerArgsPatch, ) manager = PatchManager() manager.register(ServerArgsPatch()) manager.register(HttpServerPatch()) - manager.register(LoRAAbortReleasePatch()) results = manager.apply_all() _log_patch_results(results) diff --git a/astraflow/raas/patch/sglang.py b/astraflow/raas/patch/sglang.py index 0fd3c00..03481ec 100644 --- a/astraflow/raas/patch/sglang.py +++ b/astraflow/raas/patch/sglang.py @@ -7,8 +7,6 @@ can register with RaaS at startup. 2. HttpServerPatch — register SGLang instance with the rollout manager during ``launch_server``. -3. LoRAAbortReleasePatch — fix missing ``lora_registry.release()`` in the - abort path so that LoRA weight updates via abort+unload don't hang. """ import logging @@ -96,55 +94,3 @@ def patched_launch_server(server_args, *args, **kwargs): traceback.print_exc() return False - - -class LoRAAbortReleasePatch(BasePatch): - """Fix missing ``lora_registry.release()`` in the abort path. - - When a LoRA request is aborted from the waiting queue, SGLang's - ``_handle_abort_req`` does NOT call ``lora_registry.release()``, - leaking the ``ConcurrentCounter``. This causes - ``wait_for_unload()`` to hang forever when we try to swap LoRA - adapters via abort + unload. - - The normal completion path (``_handle_batch_output``) and the - scheduler error path both release correctly — only the waiting-queue - abort path is missing the call. - - This patch wraps ``_handle_abort_req`` to add the missing release, - mirroring the pattern at ``tokenizer_manager.py:1679-1680``. - """ - - def apply(self) -> bool: - try: - import asyncio - - from sglang.srt.managers.tokenizer_manager import TokenizerManager - - original = TokenizerManager._handle_abort_req - - if self._is_patched(original, "handle_abort_req"): - return True - - def patched_handle_abort_req(self_tm, recv_obj): - original(self_tm, recv_obj) - - # Release LoRA counter for aborted requests — mirrors the - # normal completion path at tokenizer_manager.py:1679-1680. - if self_tm.server_args.enable_lora: - state = self_tm.rid_to_state.get(recv_obj.rid) - if ( - state is not None - and getattr(state.obj, "lora_path", None) - ): - asyncio.create_task( - self_tm.lora_registry.release(state.obj.lora_id) - ) - - self._mark_as_patched(patched_handle_abort_req, "handle_abort_req") - TokenizerManager._handle_abort_req = patched_handle_abort_req - - return True - except Exception as e: - logger.error(f"LoRAAbortReleasePatch failed: {e}") - return False diff --git a/astraflow/raas/utils/network.py b/astraflow/raas/utils/network.py index 28a1a14..f88bb68 100644 --- a/astraflow/raas/utils/network.py +++ b/astraflow/raas/utils/network.py @@ -9,9 +9,12 @@ def gethostname(): def gethostip(): return socket.gethostbyname(socket.gethostname()) +_MAX_FREE_PORT = 55535 def find_free_ports( - count: int, port_range: tuple = (1024, 65535), exclude_ports: set[int] | None = None + count: int, + port_range: tuple = (1024, _MAX_FREE_PORT), + exclude_ports: set[int] | None = None, ) -> list[int]: """ Find multiple free ports within a specified range. diff --git a/astraflow/train_worker/api/cli_args.py b/astraflow/train_worker/api/cli_args.py index 8ff1be0..096324e 100644 --- a/astraflow/train_worker/api/cli_args.py +++ b/astraflow/train_worker/api/cli_args.py @@ -839,7 +839,6 @@ class SGLangConfig: disable_overlap_schedule: bool = False enable_mixed_chunk: bool = False enable_dp_attention: bool = False - enable_ep_moe: bool = False enable_torch_compile: bool = False torch_compile_max_bs: int = 32 cuda_graph_max_bs: int | None = None diff --git a/astraflow/train_worker/tools/validation_base.py b/astraflow/train_worker/tools/validation_base.py index 79bf783..b5ea404 100644 --- a/astraflow/train_worker/tools/validation_base.py +++ b/astraflow/train_worker/tools/validation_base.py @@ -60,7 +60,7 @@ class BaseInstallationValidator: # Subclasses can override or extend this CUDA_SUBMODULES = { "torch": ["torch.cuda"], - "sglang": ["sgl_kernel", "sgl_kernel.flash_attn"], + "sglang": ["sglang_kernel", "sglang_kernel.flash_attn"], "vllm": ["vllm._C"], "flash-attn": ["flash_attn_2_cuda"], "megatron-core": [ diff --git a/astraflow/train_worker/utils/fsdp/__init__.py b/astraflow/train_worker/utils/fsdp/__init__.py index d0dfbe6..211755c 100644 --- a/astraflow/train_worker/utils/fsdp/__init__.py +++ b/astraflow/train_worker/utils/fsdp/__init__.py @@ -64,6 +64,8 @@ def apply_fsdp2(model, fsdp_kwargs, wrap_policy): if isinstance(fsdp_transformer_layer_cls_to_wrap, str): fsdp_transformer_layer_cls_to_wrap = [fsdp_transformer_layer_cls_to_wrap] + else: + fsdp_transformer_layer_cls_to_wrap = list(fsdp_transformer_layer_cls_to_wrap) assert ( len(fsdp_transformer_layer_cls_to_wrap) > 0 diff --git a/docker/Dockerfile.sglang b/docker/Dockerfile.sglang index b2a1ef9..bbc821f 100644 --- a/docker/Dockerfile.sglang +++ b/docker/Dockerfile.sglang @@ -1,6 +1,6 @@ # Cache chain: basic → sglang # Layers up to "uv pip install -e ." are identical to Dockerfile.basic. -FROM nvidia/cuda:12.9.1-cudnn-devel-ubuntu24.04 +FROM nvidia/cuda:13.0.0-cudnn-devel-ubuntu24.04 SHELL ["/bin/bash", "-lc"] diff --git a/docker/README.md b/docker/README.md index f04c6dd..82e4eb3 100644 --- a/docker/README.md +++ b/docker/README.md @@ -13,7 +13,7 @@ | ------------------- | ------------------------------- | ---------------- | | `Dockerfile.sglang` | astraflow + SGLang + flash-attn | `-e ".[sglang]"` | -The image is based on `nvidia/cuda:12.9.1-cudnn-devel-ubuntu24.04` with Python 3.12 +The image is based on `nvidia/cuda:13.0.0-cudnn-devel-ubuntu24.04` with Python 3.12 managed by [uv](https://docs.astral.sh/uv/). ## Pull pre-built image diff --git a/docs/en/get-started/installation.md b/docs/en/get-started/installation.md index 621bfda..c479727 100644 --- a/docs/en/get-started/installation.md +++ b/docs/en/get-started/installation.md @@ -19,17 +19,26 @@ conda activate astraflow ### Step 2: Install uv (fast pip replacement) ```bash -pip install uv +pip install -U "uv>=0.10" ``` +> **uv ≥ 0.10 is required.** `pyproject.toml` uses `[tool.uv]` settings +> (`extra-build-dependencies`, `override-dependencies`) that older uv +> releases don't recognize. When uv hits an unknown `[tool.uv]` key it +> silently ignores the *entire* `[tool.uv]` table, so the +> `transformers==5.6.1` override (which must beat sglang's `==5.6.0` pin) +> is dropped and the install fails with an unsolvable +> `transformers` conflict. The Docker images install the latest uv via the +> official installer and are unaffected. + ### Step 3: Install AstraFlow (core + dev tools) ```bash uv pip install -e ".[dev]" ``` -This installs all core dependencies (~260 packages) including PyTorch 2.8.0, -Transformers 4.57.1, Megatron-Core 0.13.1, Ray, W&B, and dev tools (pytest, ruff, +This installs all core dependencies (~260 packages) including PyTorch 2.11.0, +Transformers 5.6.1, Megatron-Core 0.13.1, Ray, W&B, and dev tools (pytest, ruff, ipython). ### Step 4: Install Flash Attention and SGLang @@ -43,7 +52,7 @@ uv pip install "flash-attn==2.8.3" --no-build-isolation #### SGLang (inference backend) ```bash -uv pip install "sglang==0.5.5.post1" +uv pip install "sglang==0.5.12.post1" ``` ### Step 5: Verify installation diff --git a/pyproject.toml b/pyproject.toml index 80108de..dacb5fd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,7 +26,7 @@ classifiers = [ # 4 - Beta # 5 - Production/Stable "Development Status :: 3 - Alpha", - "Environment :: GPU :: NVIDIA CUDA :: 12 :: 12.9", + "Environment :: GPU :: NVIDIA CUDA :: 13", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: Apache Software License", @@ -41,17 +41,17 @@ classifiers = [ dependencies = [ # Core ML/AI libraries - "torch==2.8.0", + "torch==2.11.0", "torchaudio", "torchvision", "torchdata", "huggingface_hub", "datasets>=3.0.0", - "transformers==4.57.1", + "transformers==5.6.1", "megatron-core==0.13.1", "mbridge==0.13.0", - "torch_memory_saver==0.0.9", - "peft", + "torch_memory_saver==0.0.9.post1", + "peft>=0.18.0", "qwen_agent", "openai-agents", @@ -140,7 +140,7 @@ te = [ ] sglang = [ - "sglang==0.5.5.post1", + "sglang==0.5.12.post1", ] vllm = [ @@ -195,10 +195,14 @@ exclude = ["tests*", "docs*", "examples*"] exclude-dependencies = ["flash-attn"] override-dependencies=[ "outlines-core==0.1.26", + # sglang 0.5.12 pins transformers==5.6.0, which has a flash-attention bug + # (unconditional s_aux.to() crashes non-sink models like Qwen3). 5.6.1 is + # a patch release that fixes it; override sglang's exact pin to pick it up. + "transformers==5.6.1", ] [tool.uv.extra-build-dependencies] -flash-attn = ["torch==2.8.0"] +flash-attn = ["torch==2.11.0"] [tool.pytest.ini_options] pythonpath = ["."] From 705112bc2bcc8164b3a6685020647900338a52c7 Mon Sep 17 00:00:00 2001 From: Haizhong Date: Fri, 29 May 2026 10:54:32 -0400 Subject: [PATCH 02/35] fix: relax RaaS engine health watchdog for sglang 0.5.12 sglang 0.5.12's /health round-trips through the scheduler, which stays saturated for ~30-40s during the initial unchunked prefill of ~2048 requests/engine. The old 3-strike / 30s watchdog (5s probe timeout) hard-exited a busy-but-alive engine before the first rollout batch completed, hanging the rollout pipeline at step 0. Raise the /health probe timeout 5s -> 20s so a slow-but-alive endpoint isn't marked failed, and the failure budget 3 -> 5 strikes. A crashed engine refuses connections instantly, so real-death detection stays ~50s (worst case ~100s) while the prefill ramp is tolerated. Verified: math and code qwen3-8b-m2po-delta recipes train through the ramp with zero watchdog strikes. --- astraflow/raas/engine/remote_inf_engine.py | 2 +- astraflow/raas/server/manager.py | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/astraflow/raas/engine/remote_inf_engine.py b/astraflow/raas/engine/remote_inf_engine.py index ceba56d..0342e43 100644 --- a/astraflow/raas/engine/remote_inf_engine.py +++ b/astraflow/raas/engine/remote_inf_engine.py @@ -380,7 +380,7 @@ def check_health(self, base_url): health_req = self.backend.get_health_check_request() url = f"{base_url}{health_req.endpoint}" response = requests.request( - health_req.method, url, json=health_req.payload, timeout=5 + health_req.method, url, json=health_req.payload, timeout=20 ) return response.status_code == 200 except requests.exceptions.RequestException: diff --git a/astraflow/raas/server/manager.py b/astraflow/raas/server/manager.py index e985f2c..6dcf672 100644 --- a/astraflow/raas/server/manager.py +++ b/astraflow/raas/server/manager.py @@ -1293,7 +1293,17 @@ def get_status(self) -> dict[str, Any]: # ------------------------------------------------------------------ _HEALTH_MONITOR_INTERVAL = 10.0 # seconds between checks - _HEALTH_MONITOR_MAX_FAILURES = 3 # consecutive failures before exit + # sglang 0.5.12's /health round-trips through the scheduler, which is + # saturated for ~30-40s during the initial unchunked prefill of ~2048 + # reqs/engine, so the old 3-strike (30s) watchdog false-positive-killed a + # busy-but-alive engine before the first rollout batch. A crashed engine + # refuses connections instantly, so dead-engine detection time is + # INTERVAL * MAX_FAILURES = ~50s here; the 20s probe timeout only extends + # cycles for an alive-but-slow engine (which we want to tolerate, up to + # ~100s worst case). 5 strikes covers the ~35-40s prefill ramp (a slow but + # eventually-200 /health resets the counter) while catching a real death + # in ~50s. + _HEALTH_MONITOR_MAX_FAILURES = 5 # consecutive failures before exit # Maximum time a weight update is allowed to legitimately stall the # engine before the monitor force-probes anyway. A normal full pull + # apply + load runs ~60-70s end-to-end, deltas ~30-40s; 90s is a From 92348026f9f6d4e67c9efa9b3a3342418210a9c7 Mon Sep 17 00:00:00 2001 From: Haizhong Date: Fri, 29 May 2026 12:12:21 -0400 Subject: [PATCH 03/35] docs: fix CUDA 13 install steps for flash-attn build and sglang resolution Two from-scratch install blockers with the sglang 0.5.12 / torch 2.11 stack: - sglang 0.5.12 depends on flash-attn-4>=4.0.0b9 (a pre-release pulled in as a dependency), so resolution fails unless pre-releases are allowed. Add prerelease = "allow" to [tool.uv] so `uv pip install -e ".[sglang]"` resolves on both the conda and Docker paths. - flash-attn 2.8.3 builds from source; nvcc writes GBs of intermediates to $TMPDIR. When $TMPDIR is a small/NFS-quota'd home the build fails with "nvFatbin error: empty input" / "Disk quota exceeded" from truncated temps. Document setting CUDA_HOME and a roomy TMPDIR, switch the sglang step to the project-extra form, and clarify flash-attn (FA2, trainer) vs flash-attn-4 (pulled in by sglang). --- docs/en/get-started/installation.md | 25 ++++++++++++++++++++++++- pyproject.toml | 4 ++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/docs/en/get-started/installation.md b/docs/en/get-started/installation.md index c479727..3ee45b9 100644 --- a/docs/en/get-started/installation.md +++ b/docs/en/get-started/installation.md @@ -45,14 +45,37 @@ ipython). #### Flash Attention +This is FlashAttention-**2** (`import flash_attn`), used by the FSDP trainer. It +is excluded from uv resolution (see `pyproject.toml` `[tool.uv]`) and built from +source, so it needs the CUDA 13 toolchain and a roomy build-temp directory: + ```bash +# nvcc must be on PATH and match torch's CUDA (13.0 for torch 2.11+cu130) +export CUDA_HOME=/usr/local/cuda-13.0 +export PATH="$CUDA_HOME/bin:$PATH" + +# nvcc writes GBs of intermediate files to $TMPDIR. Point it at local scratch +# with plenty of space — NOT a small/NFS-quota'd home, or the build fails with +# "nvFatbin error: empty input" or "Disk quota exceeded" from truncated temps. +export TMPDIR=/tmp/fa-build && mkdir -p "$TMPDIR" + uv pip install "flash-attn==2.8.3" --no-build-isolation ``` +> On a single-GPU-arch box you can speed up the build and shrink its footprint +> with `FLASH_ATTN_CUDA_ARCHS= NVCC_THREADS=1` (e.g. `90` for H100, `80` +> for A100, `89` for L40/4090). These are optional — the real requirement is a +> roomy `TMPDIR`. + #### SGLang (inference backend) +Install via the project extra so uv applies the `[tool.uv]` overrides (the +`transformers==5.6.1` pin and the `flash-attn-4` pre-release allowance). SGLang +pulls in FlashAttention-**4** (`flash-attn-4`, a pre-release wheel) automatically +for its own attention backend — you do not install that one yourself. + ```bash -uv pip install "sglang==0.5.12.post1" +uv pip install -e ".[sglang]" ``` ### Step 5: Verify installation diff --git a/pyproject.toml b/pyproject.toml index dacb5fd..76f959f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -192,6 +192,10 @@ include = ["astraflow*"] exclude = ["tests*", "docs*", "examples*"] [tool.uv] +# sglang 0.5.12 depends on flash-attn-4>=4.0.0b9 (a pre-release wheel, pulled +# in automatically as a sglang dependency). Without this, `uv pip install +# -e ".[sglang]"` fails to resolve with "pre-releases weren't enabled". +prerelease = "allow" exclude-dependencies = ["flash-attn"] override-dependencies=[ "outlines-core==0.1.26", From ea86fa2f3c2a9bdb1506c0f90357c2fbb5309f4c Mon Sep 17 00:00:00 2001 From: Haizhong Date: Fri, 29 May 2026 12:57:42 -0400 Subject: [PATCH 04/35] fix: pin kernels<0.13 for transformers 5.6.1 compatibility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit sglang requires an unbounded "kernels", so uv resolved the latest (0.15), but transformers 5.6.1 only supports kernels<0.13 — its hub_kernels module constructs LayerRepository() without a revision/version, which kernels 0.15 rejects, so `import sglang` crashes with "Either a revision or a version must be specified." Pin to the range transformers 5.6.1 expects (0.12.x). Verified on a from-scratch env: kernels resolves to 0.12.3 and the math recipe trains. --- pyproject.toml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 76f959f..1f6b4b4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -203,6 +203,12 @@ override-dependencies=[ # (unconditional s_aux.to() crashes non-sink models like Qwen3). 5.6.1 is # a patch release that fixes it; override sglang's exact pin to pick it up. "transformers==5.6.1", + # sglang requires an unbounded "kernels", so uv resolves the latest (0.15+), + # but transformers 5.6.1 only supports kernels<0.13 (its hub_kernels module + # calls LayerRepository() without a revision/version, which 0.15 rejects -> + # `import sglang` crashes with "Either a revision or a version must be + # specified."). Pin to the range transformers 5.6.1 was built against. + "kernels>=0.12.0,<0.13", ] [tool.uv.extra-build-dependencies] From 851b5131fb696497403ab2c1d88b4e8b6c886b32 Mon Sep 17 00:00:00 2001 From: jsw-zorro Date: Fri, 29 May 2026 07:15:03 +0000 Subject: [PATCH 05/35] feat(megatron): streaming Megatron->HF per-tensor weight export Add export_hf_named_params: a streaming generator that reconstructs the global model from Megatron's TP/PP/EP/ETP/VPP layout and yields HF-named, HF-layout CPU tensors one at a time (OOM-safe for large / MoE models). The gather + mcore->HF conversion is delegated to mbridge's export_weights (the same bridge the engine already uses to load/save); this module adds the consumer concerns: CPU move, byte-bounded bucketing, and a metadata-only path for transfer-buffer sizing. This is the foundation for correct sparse weight sync under full Megatron parallelism. The design (the "delta is computed in HF byte space" invariant) is documented in docs/en/architecture/megatron-weight-sync.md. The Megatron backend needs two extra compiled deps beyond the base install (megatron-core / mbridge are already there): Transformer Engine (fused LayerNorm + sequence parallelism) and apex (optional fused LayerNorm/Adam). These are kept out of the default image: a separate docker/Dockerfile.sglang.megatron layers them on top of Dockerfile.sglang, and installation.md gains an optional "Step 5: Install the Megatron training backend" under Option A. The FSDP backend and inference are unaffected. Validated (exact bf16 match vs the HF reference checkpoint): - Qwen3-0.6B TP=2 310 tensors, 0 mismatch - Qwen3-0.6B PP=2 311 tensors, 0 mismatch - Qwen3-0.6B TP=2 PP=2 311 tensors, 0 mismatch - Qwen3-30B-A3B TP=2 EP=2 PP=2 18867 tensors, 0 mismatch --- .../mcore/tests/test_hf_export_equiv.py | 152 +++++++++++++++++ .../models/mcore/weight_export.py | 151 +++++++++++++++++ docker/Dockerfile.sglang.megatron | 38 +++++ docker/README.md | 14 +- docs/en/architecture/megatron-weight-sync.md | 156 ++++++++++++++++++ docs/en/get-started/installation.md | 52 +++++- docs/en/index.rst | 1 + 7 files changed, 560 insertions(+), 4 deletions(-) create mode 100644 astraflow/train_worker/models/mcore/tests/test_hf_export_equiv.py create mode 100644 astraflow/train_worker/models/mcore/weight_export.py create mode 100644 docker/Dockerfile.sglang.megatron create mode 100644 docs/en/architecture/megatron-weight-sync.md diff --git a/astraflow/train_worker/models/mcore/tests/test_hf_export_equiv.py b/astraflow/train_worker/models/mcore/tests/test_hf_export_equiv.py new file mode 100644 index 0000000..fc7fa8e --- /dev/null +++ b/astraflow/train_worker/models/mcore/tests/test_hf_export_equiv.py @@ -0,0 +1,152 @@ +"""Equivalence test for Megatron -> HF weight export. + +Loads an HF checkpoint into a Megatron GPTModel under a chosen parallel +strategy, exports it back to HF via ``export_hf_named_params``, and asserts +the reconstructed tensors match the original HF safetensors bit-for-bit +(bf16). This is the PR1 acceptance gate. + +Run (torchrun, multi-GPU): + torchrun --nproc_per_node= \ + astraflow/train_worker/models/mcore/tests/test_hf_export_equiv.py \ + --model /shared/models/Qwen3-0.6B --tp 2 --pp 1 --ep 1 + +Exit code 0 = all tensors match. Non-zero = mismatch (details on rank 0). +""" + +from __future__ import annotations + +import argparse +import os +import sys + +import torch +import torch.distributed as dist + + +def _load_reference_hf(model_path: str) -> dict[str, torch.Tensor]: + """Load the original HF checkpoint tensors (bf16) from safetensors.""" + import glob + + from safetensors.torch import load_file + + ref: dict[str, torch.Tensor] = {} + files = sorted(glob.glob(os.path.join(model_path, "*.safetensors"))) + if not files: + raise FileNotFoundError(f"no .safetensors in {model_path}") + for f in files: + ref.update(load_file(f)) + return ref + + +def main() -> int: + ap = argparse.ArgumentParser() + ap.add_argument("--model", required=True) + ap.add_argument("--tp", type=int, default=1) + ap.add_argument("--pp", type=int, default=1) + ap.add_argument("--ep", type=int, default=1) + ap.add_argument("--atol", type=float, default=0.0, help="0 = exact bf16 match") + args = ap.parse_args() + + from astraflow.train_worker.api.alloc_mode import ParallelStrategy + from astraflow.train_worker.api.cli_args import TrainEngineConfig + from astraflow.train_worker.engine.megatron_engine import MegatronEngine + from astraflow.train_worker.models.mcore.weight_export import ( + export_hf_named_params, + ) + + world = int(os.environ["WORLD_SIZE"]) + dp = world // (args.tp * args.pp * args.ep) + assert dp >= 1, ( + f"world={world} too small for tp*pp*ep={args.tp * args.pp * args.ep}" + ) + + cfg = TrainEngineConfig(path=args.model, dtype="bfloat16") + # No optimizer -> inference-only engine, faster init. + engine = MegatronEngine(cfg) + strategy = ParallelStrategy( + data_parallel_size=dp, + tensor_parallel_size=args.tp, + pipeline_parallel_size=args.pp, + expert_parallel_size=args.ep, + ) + engine.create_process_group(parallel_strategy=strategy) + + from astraflow.train_worker.api.io_struct import FinetuneSpec + + ft_spec = FinetuneSpec(total_train_epochs=1, dataset_size=1, train_batch_size=1) + engine.initialize(addr=None, ft_spec=ft_spec) + + rank = dist.get_rank() + is_writer = rank == 0 + + ref = _load_reference_hf(args.model) if is_writer else None + + n_checked = 0 + n_mismatch = 0 + seen: set[str] = set() + for name, tensor in export_hf_named_params(engine.bridge, engine.model): + if not is_writer: + continue + seen.add(name) + if name not in ref: + print(f"[FAIL] exported tensor not in reference: {name}", flush=True) + n_mismatch += 1 + continue + r = ref[name].to(torch.bfloat16) + t = tensor.to(torch.bfloat16) + if list(t.shape) != list(r.shape): + print( + f"[FAIL] shape {name}: export {list(t.shape)} vs ref {list(r.shape)}", + flush=True, + ) + n_mismatch += 1 + continue + if args.atol == 0.0: + ok = torch.equal(t, r) + else: + ok = torch.allclose(t.float(), r.float(), atol=args.atol, rtol=0) + if not ok: + md = (t.float() - r.float()).abs().max().item() + print(f"[FAIL] values {name}: max|diff|={md:.3e}", flush=True) + n_mismatch += 1 + n_checked += 1 + + if is_writer: + import json + + with open(os.path.join(args.model, "config.json")) as f: + tie = json.load(f).get("tie_word_embeddings", False) + missing = set(ref.keys()) - seen + # Benign non-exports: + # - rotary/inv_freq buffers (not weights); + # - lm_head.weight when embeddings are tied (mbridge emits only + # embed_tokens; the inference engine ties internally). + benign = {k for k in missing if "rotary" in k or "inv_freq" in k} + if tie and "lm_head.weight" in missing: + benign.add("lm_head.weight") + hard_missing = missing - benign + print( + f"\n=== export equivalence: checked={n_checked} " + f"mismatch={n_mismatch} missing={len(hard_missing)} " + f"benign_missing={len(benign)} ===", + flush=True, + ) + if hard_missing: + print( + f"[FAIL] reference keys never exported: {sorted(hard_missing)[:10]}", + flush=True, + ) + result = 0 if (n_mismatch == 0 and not hard_missing) else 1 + else: + result = 0 + + res_t = torch.tensor([result], device=f"cuda:{os.environ.get('LOCAL_RANK', 0)}") + dist.all_reduce(res_t, op=dist.ReduceOp.MAX) + if dist.get_rank() == 0: + print("PASS" if res_t.item() == 0 else "FAIL", flush=True) + engine.destroy() + return int(res_t.item()) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/astraflow/train_worker/models/mcore/weight_export.py b/astraflow/train_worker/models/mcore/weight_export.py new file mode 100644 index 0000000..5006ae3 --- /dev/null +++ b/astraflow/train_worker/models/mcore/weight_export.py @@ -0,0 +1,151 @@ +"""Streaming Megatron -> HuggingFace weight export for online weight sync. + +Reconstructs the *global* model from Megatron's sharded layout +(TP / PP / EP / ETP / VPP) and yields HuggingFace-named, HF-layout CPU +tensors **one bucket at a time**, so a large or MoE model is never +materialized in full. + +This is the single source of truth for "Megatron weights -> HF" used by the +online weight-sync path (``WeightManager.offload``). See +``docs/en/architecture/megatron-weight-sync.md`` for the design and the +HF-space delta invariant. + +Implementation note +------------------- +The heavy lifting (PP ``all_gather_object`` + broadcast, EP/ETP/TP +all-gather, local->global expert-id rewrite, and mcore->HF name/layout +conversion) is delegated to ``mbridge``'s ``Bridge.export_weights`` — the +same bridge the engine already uses to load (``_load_model_from_hf``) and +save (``_save_model_to_hf``). It is a battle-tested ``per_tensor_generator`` +(equivalent to verl's ``per_tensor_generator`` and slime's +``HfWeightIteratorDirect``) that yields ``(hf_name, full_gpu_tensor)``. + +We add the AstraFlow-specific consumer concerns on top: move each tensor to +CPU (the transfer buffer is CPU shared memory), group into byte-bounded +buckets, and a metadata-only mode for buffer sizing. +""" + +from __future__ import annotations + +from collections.abc import Iterator + +import torch + +from astraflow.train_worker.utils import logging + +logger = logging.getLogger(__name__) + +# Default gather-bucket size, in bytes, measured on the *converted HF* +# tensors. mbridge gathers one source param at a time internally; this only +# bounds how many converted tensors we batch before handing them to the +# consumer (so the consumer can copy a run of tensors without per-tensor +# Python overhead). One bucket is alive at a time. +DEFAULT_BUCKET_BYTES = 512 << 20 # 512 MiB + + +def export_hf_named_params( + bridge, + models: list, + *, + to_cpu: bool = True, +) -> Iterator[tuple[str, torch.Tensor]]: + """Yield ``(hf_name, full_unsharded_tensor)`` for every model parameter. + + Reconstructs the global model from Megatron's TP/PP/EP/ETP/VPP layout + via ``bridge.export_weights`` and yields HF-named tensors. Only one + gathered tensor is resident at a time (plus transient collective + buffers), so this is OOM-safe for large / MoE models. + + Parameters + ---------- + bridge : + The ``mbridge`` bridge for this model (``engine.bridge``). Already + configured with the model's ``TransformerConfig`` and dtype. + models : + The engine's model chunk list (``_MegatronModelList``): VPP chunks, + each typically ``DistributedDataParallel``-wrapped. ``mbridge`` + unwraps them internally. + to_cpu : + Move each yielded tensor to CPU (default). The transfer buffer is + CPU shared memory, so this is the normal path. Set False only for + callers that consume on-GPU. + + Yields + ------ + tuple[str, torch.Tensor] + HF parameter name (e.g. ``model.layers.0.self_attn.q_proj.weight``) + and the full (unsharded) tensor, contiguous, on CPU when + ``to_cpu``. + + Notes + ----- + Every rank must call this in lockstep: ``export_weights`` runs + collectives (PP all_gather_object + broadcast, TP/EP/ETP all_gather) + across all model-parallel ranks. The yielded values are identical on + every rank in a model-parallel group, so the caller decides which rank + actually writes them to the buffer (the DP/PP/TP head). + """ + for hf_name, param in bridge.export_weights(models): + tensor = param.detach() + if to_cpu: + # bf16/contiguous on CPU — pinned-buffer copy happens in the + # consumer; .contiguous() guards against non-contiguous views + # produced by QKV/gate-up splits in the converter. + tensor = tensor.to("cpu", copy=False).contiguous() + else: + tensor = tensor.contiguous() + yield hf_name, tensor + + +def iter_param_buckets( + named_params: Iterator[tuple[str, torch.Tensor]], + bucket_bytes: int = DEFAULT_BUCKET_BYTES, +) -> Iterator[list[tuple[str, torch.Tensor]]]: + """Group a ``(name, tensor)`` stream into byte-bounded buckets. + + Yields lists whose cumulative tensor bytes stay under ``bucket_bytes`` + (a single tensor larger than the cap forms its own bucket). Lets the + consumer amortize per-tensor overhead while keeping only one bucket of + tensors alive at a time. + """ + bucket: list[tuple[str, torch.Tensor]] = [] + cur = 0 + for name, tensor in named_params: + nbytes = tensor.numel() * tensor.element_size() + if bucket and cur + nbytes > bucket_bytes: + yield bucket + bucket = [] + cur = 0 + bucket.append((name, tensor)) + cur += nbytes + if bucket: + yield bucket + + +def hf_weight_metadata( + bridge, + models: list, +) -> list[tuple[str, tuple[list[int], str]]]: + """Return the ordered HF weight layout: ``[(name, (shape, dtype_str)), ...]``. + + Drives the same ``export_weights`` generator but keeps only shape/dtype + (dropping tensor storage as it goes), so the full model is never + resident. Consumed by ``WeightManager`` to size the transfer buffer and + by the RaaS receiver (as ``tensors_meta``) to pre-allocate — both ends + then agree on layout and order. + + Must be called in lockstep on every rank (it runs the same collectives + as ``export_hf_named_params``). + """ + meta: list[tuple[str, tuple[list[int], str]]] = [] + for hf_name, param in bridge.export_weights(models): + dtype = str(param.dtype).split(".")[-1] + meta.append((hf_name, (list(param.shape), dtype))) + del param + logger.info( + "[weight_export] HF metadata: %d tensors, first=%s last=%s", + len(meta), + meta[0][0] if meta else "?", + meta[-1][0] if meta else "?", + ) + return meta diff --git a/docker/Dockerfile.sglang.megatron b/docker/Dockerfile.sglang.megatron new file mode 100644 index 0000000..7cd7609 --- /dev/null +++ b/docker/Dockerfile.sglang.megatron @@ -0,0 +1,38 @@ +# Cache chain: basic → sglang → sglang.megatron +# This image extends Dockerfile.sglang with the Megatron training backend's +# heavy compiled dependencies (Transformer Engine + apex). megatron-core and +# mbridge are already pulled in by the base install; only TE and apex need to +# be compiled here. +# +# Build (from the repo root, after building astraflow:sglang — or change the +# FROM to the published base): +# docker build -f docker/Dockerfile.sglang -t astraflow:sglang . +# docker build -f docker/Dockerfile.sglang.megatron -t astraflow:sglang-megatron . +ARG BASE_IMAGE=astraflow:sglang +FROM ${BASE_IMAGE} + +SHELL ["/bin/bash", "-lc"] + +# Transformer Engine (fused LayerNorm + sequence parallelism) and apex +# (optional fused LayerNorm / Adam) complete the Megatron backend stack. +ENV CUDA_HOME=/usr/local/cuda \ + NVTE_FRAMEWORK=pytorch \ + TORCH_CUDA_ARCH_LIST="8.0;8.9;9.0" + +# Transformer Engine — build against the already-installed torch. +RUN uv pip install --no-build-isolation "transformer-engine[pytorch]>=2.13.0,<2.14" + +# apex (optional perf; Megatron falls back to Torch Norm / torch Adam if absent). +# - apex reads APEX_CPP_EXT / APEX_CUDA_EXT env flags to select extensions. +# - The base image's CUDA toolkit minor version may differ from torch's CUDA; +# neutralize apex's strict version guard (a safe minor mismatch). +# - FORCE_CUDA=1 lets the CUDA extensions build without a visible GPU. +# - `|| echo` keeps a apex failure non-fatal (TE is the must-have). +RUN git clone --depth 1 https://github.com/NVIDIA/apex.git /tmp/apex && \ + cd /tmp/apex && \ + sed -i 's/^def check_cuda_torch_binary_vs_bare_metal(cuda_dir):/def check_cuda_torch_binary_vs_bare_metal(cuda_dir):\n return/' setup.py && \ + FORCE_CUDA=1 APEX_CPP_EXT=1 APEX_CUDA_EXT=1 \ + uv pip install -v --no-build-isolation . && \ + rm -rf /tmp/apex || echo "[apex] build failed — continuing without apex (Torch Norm fallback)" + +CMD ["/bin/bash"] diff --git a/docker/README.md b/docker/README.md index 82e4eb3..ad1c710 100644 --- a/docker/README.md +++ b/docker/README.md @@ -9,13 +9,18 @@ ## Available Images -| Dockerfile | Description | Extras | -| ------------------- | ------------------------------- | ---------------- | -| `Dockerfile.sglang` | astraflow + SGLang + flash-attn | `-e ".[sglang]"` | +| Dockerfile | Description | Extras | +| ---------------------------- | ------------------------------------------------ | ---------------- | +| `Dockerfile.sglang` | astraflow + SGLang + flash-attn | `-e ".[sglang]"` | +| `Dockerfile.sglang.megatron` | `Dockerfile.sglang` + Megatron extras (TE, apex) | builds on `astraflow:sglang` | The image is based on `nvidia/cuda:13.0.0-cudnn-devel-ubuntu24.04` with Python 3.12 managed by [uv](https://docs.astral.sh/uv/). +`Dockerfile.sglang.megatron` is only needed for the **Megatron training backend** +(it layers Transformer Engine and apex on top of the SGLang image). The FSDP +backend and inference do not require it. + ## Pull pre-built image A pre-built image is published on Docker Hub — use it to skip the build entirely: @@ -35,6 +40,9 @@ version tag (`v0.1.0`) for reproducibility; `:latest` tracks the most recent rel cd /path/to/astraflow docker build -f docker/Dockerfile.sglang -t astraflow:sglang . + +# Optional: add the Megatron training backend (Transformer Engine + apex) on top. +docker build -f docker/Dockerfile.sglang.megatron -t astraflow:sglang-megatron . ``` ## Quick Start diff --git a/docs/en/architecture/megatron-weight-sync.md b/docs/en/architecture/megatron-weight-sync.md new file mode 100644 index 0000000..fc3a4b2 --- /dev/null +++ b/docs/en/architecture/megatron-weight-sync.md @@ -0,0 +1,156 @@ +# Megatron Weight Synchronization + +This page describes how the Megatron-LM training backend exports its +weights to RaaS, and the invariants that keep the **sparse / delta** +weight-update path correct under tensor (TP), pipeline (PP), expert +(EP), expert-tensor (ETP), virtual-pipeline (VPP), and context (CP) +parallelism. + +It complements [WeightManager](weight-manager.md) and +[Delta Weight Transfer](delta-weight-transfer.md), which describe the +backend-agnostic transport. **Read those first.** + +## The problem + +Megatron stores each parameter sharded across TP/PP/EP ranks, fused +(QKV in one `linear_qkv`, gate+up in one `linear_fc1`), and vocab-padded +— a layout that bears no resemblance to the HuggingFace checkpoint names +and byte layout that SGLang / vLLM expect (`model.layers.N.self_attn.q_proj.weight`, +…). RaaS only understands HF layout. + +The transport layer (`WeightManager` + sender agent + RaaS receiver) is +deliberately **backend-agnostic**: it moves an opaque, fixed-order CPU +byte buffer and, in delta mode, ships only the bytes that changed +between two versions of that buffer. For this to be correct, the bytes +in the buffer **must be in the same layout that RaaS applies them in**. + +For FSDP this is automatic — the buffer already holds HF-layout tensors. +For Megatron it is the central design constraint. + +## Design invariant + +> **The trainer always writes HF-named, HF-layout, full-model tensors into +> the transfer buffer. Sparsity / delta is always computed in HF byte +> space, over a double buffer. The RaaS receive path never sees a +> backend-specific layout.** + +Concretely, the Megatron backend reconstructs the global model from its +sharded layout and converts it to HF on the GPU, **before** anything +reaches the transfer buffer. The sender agent and RaaS receiver then +treat Megatron exactly like FSDP. + +This makes the delta correct **by construction**: both the old and new +buffer halves hold HF bytes, so a bytewise diff produces indices that +the receiver can scatter directly into its HF buffer. + +> ⚠️ **Historical bug (fixed by this design).** An earlier Megatron path +> wrote *raw mcore-layout shards* into the buffer and reassembled to HF in +> a separate, single-buffered region in the sender — but computed the +> delta over the *mcore-layout* buffer. mcore byte offsets ≠ HF byte +> offsets (fused QKV vs split, fused gate/up vs split, vocab padding), so +> applying an mcore-space delta to RaaS's HF-space base silently corrupted +> weights. Always diff in HF space. + +## The per-tensor generator + +The reconstruction is a **streaming generator** that yields +`(hf_name, full_unsharded_cpu_tensor)` one bucket at a time. Only one +bucket of fully-gathered tensors is alive at any moment, so a 100B / MoE +model never materializes in full (no OOM). + +```python +# astraflow/train_worker/models/mcore/weight_export.py +def export_hf_named_params( + models, # _MegatronModelList: VPP chunks, DDP-wrapped + tf_config, + hf_config, + bucket_bytes, +) -> Iterator[tuple[str, torch.Tensor]]: + """Yield (hf_name, full HF-layout CPU tensor) bucket by bucket.""" +``` + +Per parameter, in order, it performs the minimal collectives: + +1. **Naming + PP/EP offsets** — `utils.megatron.get_named_parameters` + already maps local mcore names to *global* names (adds the PP layer + offset and EP expert offset), iterating VPP chunks. +2. **PP gather** — `all_gather_object` of metadata across the pipeline + group, then broadcast each owner stage's tensor so the DP-head rank + set collectively holds every global parameter. Embeddings live on the + first stage, `output_layer` / final norm on the last. +3. **TP / ETP gather** — `utils.megatron.all_gather_param` all-gathers + the shards along `partition_dim` and concatenates, handling the GLU + `linear_fc1` stride-2 rechunk and the grouped-MoE `linear_fc2` + `partition_dim` 0→1 quirk. +4. **EP gather** — for `.experts.` params, all-gather across the expert + group and rewrite local→global expert id. +5. **mcore → HF convert** — `utils.megatron.convert_to_hf` splits QKV + (GQA-aware), splits gate/up, renames, and drops vocab padding. +6. **Bucket + stream** — group converted tensors until `bucket_bytes` + (measured post-gather), `yield`, then free before the next bucket. + +This is the same abstraction verl (`per_tensor_generator`) and slime +(`HfWeightIteratorDirect`) converged on; the difference is the consumer. + +## How it plugs into WeightManager + +verl / slime push the generator's tensors GPU→GPU (NCCL / CUDA-IPC) into +the inference engine. AstraFlow instead **writes them into the CPU +double buffer** that the sender agent TCP-pulls: + +``` +optimizer.step() + │ + ▼ +WeightManager.offload(export_hf_named_params(...), version, ...) + │ DP-head ranks write each (hf_name, tensor) into the INACTIVE + │ half of the HF double buffer, in fixed order; non-heads barrier. + ▼ +notify_buffer_ready ──► sender swaps active/inactive + │ + ▼ sender._compute_delta() diffs HF-inactive vs + │ HF-active → indices in HF space ✓ + ▼ +RaaS pulls full or delta (unchanged from FSDP) +``` + +Buffer sizing comes from `MegatronEngine.get_hf_weight_metadata()` — a +metadata-only dry run of the generator that returns the ordered +`[(hf_name, shape, dtype), …]` list. This is the same `tensors_meta` +the RaaS receiver uses to pre-allocate, so both ends agree on layout and +order. + +## Rank participation + +Only **data-parallel head** ranks write the buffer (one writer per +model-parallel group), mirroring FSDP's primary-replica rule. The +TP/PP/EP gathers happen via collectives *before* the write, so every +DP-head holds the full HF model and writes it once. Other ranks only +participate in the gathers and the post-write barrier. + +## Configuration + +```yaml +trainer: + engine: + backend: megatron + tensor_parallel_size: 4 + pipeline_parallel_size: 1 + expert_parallel_size: 1 + actor: + megatron: + weight_export_bucket_bytes: 536870912 # 512 MiB gather bucket +``` + +`backend: megatron` is auto-selected when `pipeline_parallel_size > 1` +or `expert_parallel_size > 1`. + +## Invariants checklist (for reviewers) + +1. Trainer hands WeightManager **HF-named, HF-layout, full-model** + tensors. Backend differences end at `export_hf_named_params`. +2. Sparsity / delta is computed in **HF byte space**, on a double buffer. +3. **One bucket** of gathered tensors alive at a time — never + `full_tensor()` the whole model. +4. Only **DP-head** ranks write the buffer. +5. The **RaaS receive path is unchanged** between FSDP and Megatron. diff --git a/docs/en/get-started/installation.md b/docs/en/get-started/installation.md index 3ee45b9..cca51d3 100644 --- a/docs/en/get-started/installation.md +++ b/docs/en/get-started/installation.md @@ -78,7 +78,57 @@ for its own attention backend — you do not install that one yourself. uv pip install -e ".[sglang]" ``` -### Step 5: Verify installation +### Step 5 (optional): Install the Megatron training backend + +Only needed if you want to train with the **Megatron-LM backend** (tensor / +pipeline / expert parallelism, MoE models). The default **FSDP** backend and +all inference need nothing here — skip to Step 6. + +`megatron-core` and `mbridge` are already installed by Step 3. The Megatron +backend additionally uses **Transformer Engine** (fused LayerNorm + sequence +parallelism) and benefits from **apex** (fused LayerNorm / Adam). Both are +compiled from source against the installed PyTorch: + +```bash +# nvcc must be on PATH (same CUDA toolchain as the flash-attn build above) +export CUDA_HOME=/usr/local/cuda-13.0 +export PATH="$CUDA_HOME/bin:$PATH" +export NVTE_FRAMEWORK=pytorch + +# Transformer Engine (required for the Megatron backend with TP/SP) +uv pip install --no-build-isolation "transformer-engine[pytorch]>=2.13.0,<2.14" + +# apex (optional — Megatron falls back to Torch Norm / torch Adam if absent). +# APEX_CPP_EXT/APEX_CUDA_EXT select the fused kernels; FORCE_CUDA=1 builds them +# without a visible GPU. +git clone --depth 1 https://github.com/NVIDIA/apex.git /tmp/apex +cd /tmp/apex +FORCE_CUDA=1 APEX_CPP_EXT=1 APEX_CUDA_EXT=1 \ + uv pip install -v --no-build-isolation . +cd - && rm -rf /tmp/apex +``` + +> If apex's build complains about a CUDA toolkit vs. PyTorch CUDA minor-version +> mismatch, the difference is safe to ignore — comment out the +> `check_cuda_torch_binary_vs_bare_metal` guard in apex's `setup.py`, or just +> skip apex (Transformer Engine is the only hard requirement). The +> `docker/Dockerfile.sglang.megatron` image automates all of this. + +Verify the Megatron extras: + +```bash +python -c " +import transformer_engine.pytorch # noqa: F401 +print('transformer-engine: OK') +try: + from apex.normalization import FusedLayerNorm # noqa: F401 + print('apex: OK') +except ImportError: + print('apex: not installed (Torch Norm fallback)') +" +``` + +### Step 6: Verify installation ```bash python -c " diff --git a/docs/en/index.rst b/docs/en/index.rst index 1f4fd9a..c6efc01 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -20,6 +20,7 @@ on distributed GPU clusters. architecture/raas architecture/trainer architecture/weight-manager + architecture/megatron-weight-sync .. toctree:: :maxdepth: 1 From 88c50684950f074696cc1486d4a1fe088b87683d Mon Sep 17 00:00:00 2001 From: jsw-zorro Date: Fri, 29 May 2026 07:15:44 +0000 Subject: [PATCH 06/35] feat(megatron): weight sync via HF-space buffer (PP/EP/VPP) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the TP-only shard-direct weight transfer with the HF-export path: - MegatronEngine.export_hf_named_params() / get_hf_weight_metadata() stream gathered HF tensors via mbridge (handles TP/PP/EP/ETP/VPP). The previous PP>1 / EP>1 NotImplementedError guards are removed. - WeightManager gains "megatron_hf_meta" mode: the transfer buffer is sized for the full HF model and offload() streams HF tensors into the inactive half on the writer rank, while the gather collectives run on all ranks in lockstep. The sender receives megatron_metadata=None and runs the plain full/delta path used by FSDP. Because the buffer now holds HF-layout bytes, the sparse delta is computed in HF space and is correct under any parallelism — fixing the latent corruption where the delta was computed in mcore layout but applied by the receiver in HF layout. - ppo_trainer wires the generator + HF metadata through. The legacy CPU shard-reassembly in the sender agent is now unused for Megatron (kept only for the deprecated megatron_metadata path). Validated (buffer roundtrip == HF reference, bit-exact): - Qwen3-0.6B TP=2 310 tensors, 0 mismatch, 1.19 GB - Qwen3-0.6B TP=2 PP=2 311 tensors, 0 mismatch, 1.50 GB --- .../tests/test_megatron_hf_offload.py | 144 ++++++++++++++++++ .../core/weight_manager/weight_manager.py | 124 ++++++++++++++- .../train_worker/engine/megatron_engine.py | 110 +++---------- astraflow/train_worker/trainer/ppo_trainer.py | 29 +++- 4 files changed, 305 insertions(+), 102 deletions(-) create mode 100644 astraflow/core/weight_manager/tests/test_megatron_hf_offload.py diff --git a/astraflow/core/weight_manager/tests/test_megatron_hf_offload.py b/astraflow/core/weight_manager/tests/test_megatron_hf_offload.py new file mode 100644 index 0000000..c7666af --- /dev/null +++ b/astraflow/core/weight_manager/tests/test_megatron_hf_offload.py @@ -0,0 +1,144 @@ +"""Integration test: Megatron HF-export -> WeightManager buffer -> HF tensors. + +Validates the full PR2/PR3 path without RaaS: + 1. MegatronEngine.get_hf_weight_metadata() sizes the buffer. + 2. WeightManager.offload(export_hf_named_params()) streams HF tensors into + the shared-memory double buffer (writer rank only). + 3. We read the buffer back, reinterpret per tensors_meta, and assert it + equals the reference HF checkpoint bit-for-bit. + +This proves the bytes the sender will TCP to RaaS (full mode) are correct, +and that they live in HF layout (so the sender's HF-space delta is valid). + +Run: + torchrun --nproc_per_node= \ + astraflow/core/weight_manager/tests/test_megatron_hf_offload.py \ + --model /shared/models/Qwen3-0.6B --tp 2 --pp 1 --ep 1 +""" + +from __future__ import annotations + +import argparse +import glob +import os +import sys + +import torch +import torch.distributed as dist + + +def _ref(model_path): + from safetensors.torch import load_file + + ref = {} + for f in sorted(glob.glob(os.path.join(model_path, "*.safetensors"))): + ref.update(load_file(f)) + return ref + + +def main() -> int: + ap = argparse.ArgumentParser() + ap.add_argument("--model", required=True) + ap.add_argument("--tp", type=int, default=1) + ap.add_argument("--pp", type=int, default=1) + ap.add_argument("--ep", type=int, default=1) + args = ap.parse_args() + + from astraflow.train_worker.api.alloc_mode import ParallelStrategy + from astraflow.train_worker.api.cli_args import TrainEngineConfig + from astraflow.train_worker.api.io_struct import FinetuneSpec + from astraflow.train_worker.engine.megatron_engine import MegatronEngine + + world = int(os.environ["WORLD_SIZE"]) + dp = world // (args.tp * args.pp * args.ep) + + engine = MegatronEngine(TrainEngineConfig(path=args.model, dtype="bfloat16")) + engine.create_process_group( + parallel_strategy=ParallelStrategy( + data_parallel_size=dp, + tensor_parallel_size=args.tp, + pipeline_parallel_size=args.pp, + expert_parallel_size=args.ep, + ) + ) + engine.initialize( + addr=None, + ft_spec=FinetuneSpec(total_train_epochs=1, dataset_size=1, train_batch_size=1), + ) + + rank = dist.get_rank() + + # 1. Metadata (lockstep on all ranks). + hf_meta = engine.get_hf_weight_metadata() + + # 2. Build a minimal WeightManager-like buffer write on the writer rank, + # reusing the real _offload_megatron_hf logic. We construct a real + # WeightManager but stub out the sender (no subprocess) by writing + # into a plain CPU tensor of the right size. + from math import prod + + sizes = [(n, prod(sh) * (2 if dt == "bfloat16" else 4)) for n, (sh, dt) in hf_meta] + total = sum(s for _, s in sizes) + + # Only rank 0 holds the "buffer" and checks; others just drive collectives. + is_writer = rank == 0 + buf = torch.zeros(2 * total, dtype=torch.uint8) if is_writer else None + + # Stream export and write to buf[half 0] in order (mirrors + # WeightManager._offload_megatron_hf with inactive_buf_idx=0). + offset = 0 + written = {} + for name, tensor in engine.export_hf_named_params(): + nbytes = tensor.numel() * tensor.element_size() + if is_writer: + u8 = tensor.contiguous().view(-1).view(torch.uint8) + buf[offset : offset + nbytes].copy_(u8) + written[name] = (offset, list(tensor.shape), str(tensor.dtype)) + offset += nbytes + + result = 0 + if is_writer: + ref = _ref(args.model) + import json + + tie = json.load(open(os.path.join(args.model, "config.json"))).get( + "tie_word_embeddings", False + ) + # Read back each tensor from the buffer per metadata and compare. + off = 0 + nbad = 0 + nchk = 0 + for name, (shape, dt) in hf_meta: + numel = prod(shape) + nbytes = numel * (2 if dt == "bfloat16" else 4) + raw = buf[off : off + nbytes] + tdtype = torch.bfloat16 if dt == "bfloat16" else torch.float32 + t = raw.view(tdtype).view(*shape) if shape else raw.view(tdtype) + off += nbytes + if name not in ref: + if not (tie and name == "lm_head.weight"): + print(f"[FAIL] {name} not in ref", flush=True) + nbad += 1 + continue + r = ref[name].to(torch.bfloat16) + if not torch.equal(t, r): + md = (t.float() - r.float()).abs().max().item() + print(f"[FAIL] {name} max|diff|={md:.3e}", flush=True) + nbad += 1 + nchk += 1 + print( + f"\n=== buffer roundtrip: total_bytes={total} checked={nchk} bad={nbad} ===", + flush=True, + ) + result = 0 if nbad == 0 else 1 + + res_t = torch.tensor([result], device=f"cuda:{os.environ.get('LOCAL_RANK', 0)}") + dist.all_reduce(res_t, op=dist.ReduceOp.MAX) + if rank == 0: + print("PASS" if res_t.item() == 0 else "FAIL", flush=True) + engine.destroy() + return int(res_t.item()) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/astraflow/core/weight_manager/weight_manager.py b/astraflow/core/weight_manager/weight_manager.py index f8772a7..658ab4a 100644 --- a/astraflow/core/weight_manager/weight_manager.py +++ b/astraflow/core/weight_manager/weight_manager.py @@ -34,6 +34,17 @@ logger = logging.getLogger(__name__) +_DTYPE_SIZES = { + "float32": 4, "float16": 2, "bfloat16": 2, + "int64": 8, "int32": 4, "int16": 2, "int8": 1, "uint8": 1, +} + + +def _nbytes(shape: List[int], dtype: str) -> int: + from math import prod + + return int(prod(shape)) * _DTYPE_SIZES.get(dtype, 2) + class WeightManager: """Single owner of all weight transfer state and logic. @@ -85,6 +96,7 @@ def initialize( global_rank: int, lora_config: dict | None = None, megatron_metadata: Optional[dict] = None, + megatron_hf_meta: Optional[list] = None, dp_replicate_rank: int = 0, ) -> None: """Initialize buffers and start sender agent. @@ -103,11 +115,19 @@ def initialize( ``target_modules``). Forwarded to the sender agent so the RaaS receiver can save weights in PEFT adapter format. megatron_metadata : dict, optional - If provided, enables Megatron shard-direct mode. Contains - ``tp_size``, ``tp_rank``, ``dp_rank``, ``shard_specs`` (per-param - TP metadata), and ``conversion_config`` (for CPU-side HF conversion - in the sender agent). Buffer layout is computed from full - (gathered) param sizes; each TP rank writes only its shard. + (Legacy TP-only shard-direct mode — superseded by + ``megatron_hf_meta``.) If provided, the sender reassembles raw + TP shards into HF format on CPU. Only correct for PP=1/EP=1 and + cannot compute deltas in HF space; kept for backward compat. + megatron_hf_meta : list, optional + Megatron **HF-export** mode (preferred). The ordered HF weight + layout ``[(hf_name, (shape, dtype_str)), ...]`` from + ``hf_weight_metadata``. The buffer is sized for the full HF + model and ``offload`` writes already-converted HF tensors (from + ``export_hf_named_params``) on the DP-head rank. Because the + buffer holds HF bytes, the sender's standard full/delta path is + correct under any TP/PP/EP/VPP combination — see + ``docs/en/architecture/megatron-weight-sync.md``. dp_replicate_rank : int HSDP replica group index. 0 = primary replica (owns the shm buffer and offloads weights). >0 = secondary replica (skips @@ -117,8 +137,18 @@ def initialize( self._global_rank = global_rank self._hsdp_replica_rank = dp_replicate_rank self._megatron_metadata = megatron_metadata - - if megatron_metadata is not None: + self._megatron_hf_meta = megatron_hf_meta + + if megatron_hf_meta is not None: + # HF-export mode: buffer holds the full HF model in HF layout. + # The sender treats it exactly like FSDP (no reassembly, delta + # in HF space), so megatron_metadata stays None for the sender. + meta_size = [ + (name, _nbytes(shape, dtype)) + for name, (shape, dtype) in megatron_hf_meta + ] + tensors_meta = list(megatron_hf_meta) + elif megatron_metadata is not None: meta_size, tensors_meta = self._compute_megatron_buffer_layout( megatron_metadata["shard_specs"] ) @@ -128,11 +158,15 @@ def initialize( # Only the primary HSDP replica (replica_rank=0) runs the sender # agent and owns the shm buffer. Secondary replicas skip entirely. + # In HF-export mode the buffer already holds HF bytes, so the sender + # runs the plain (FSDP) path — pass megatron_metadata=None. if local_rank == 0 and dp_replicate_rank == 0: self._start_sender_agent( meta_size, tensors_meta, lora_config=lora_config, - megatron_metadata=megatron_metadata, + megatron_metadata=( + None if megatron_hf_meta is not None else megatron_metadata + ), ) self._broadcast_shm_buffer() @@ -346,6 +380,13 @@ def offload( dict Weight transfer metrics for wandb logging. Empty on non-rank-0. """ + # Megatron HF-export mode: ``named_params`` is a fresh generator that + # yields gathered HF tensors. It must be streamed (not list()-ed) and + # iterated in lockstep on every rank (it runs TP/PP/EP collectives), + # but only the writer rank copies into the buffer. + if self._megatron_hf_meta is not None: + return self._offload_megatron_hf(named_params, version, rank, world_size) + params_list = list(named_params) # Guard: wait if previous delta is still reading the inactive half. @@ -429,6 +470,73 @@ def offload( return metrics + def _offload_megatron_hf( + self, + hf_named_params: Iterator[Tuple[str, torch.Tensor]], + version: int, + rank: int, + world_size: int, + ) -> dict: + """Stream gathered HF tensors into the buffer (Megatron HF-export mode). + + Every rank iterates ``hf_named_params`` in lockstep — it drives the + TP/PP/EP collectives inside ``export_hf_named_params`` — but only the + writer rank (global rank 0, which owns the shm buffer) copies the + yielded tensors into the inactive half, in the fixed order that + matches ``megatron_hf_meta``. Because the bytes are HF-layout, the + sender's standard full/delta path is correct (delta in HF space). + """ + t_guard_start = _time.perf_counter() + self._wait_previous_delta() + if dist.is_initialized(): + dist.barrier() + t0 = _time.perf_counter() + guard_time = t0 - t_guard_start + + is_writer = self._buffer is not None and self._local_rank == 0 + half_base = self._inactive_buf_idx * self._single_buffer_length + offset = 0 + n_written = 0 + for _name, tensor in hf_named_params: + nbytes = tensor.numel() * tensor.element_size() + if is_writer: + t_u8 = tensor.contiguous().view(-1).view(torch.uint8) + self._buffer[half_base + offset: half_base + offset + nbytes].copy_( + t_u8 + ) + n_written += 1 + offset += nbytes + t1 = _time.perf_counter() + + if dist.is_initialized(): + dist.barrier() + t2 = _time.perf_counter() + + ack = self._notify_buffer_ready(version) + t3 = _time.perf_counter() + + metrics: dict = {} + if rank == 0: + metrics = { + "weight_transfer/offload_guard_time": guard_time, + "weight_transfer/offload_copy_time": t1 - t0, + "weight_transfer/offload_barrier_time": t2 - t1, + "weight_transfer/offload_notify_time": t3 - t2, + "weight_transfer/offload_total_time": t3 - t_guard_start, + } + if self._last_delta_metrics: + metrics.update(self._last_delta_metrics) + self._last_delta_metrics = None + print( + f"[WeightManager] offload mode=megatron_hf_export, " + f"wrote={n_written} tensors, total_bytes={offset}, " + f"guard={guard_time:.3f}s, copy={t1 - t0:.3f}s, " + f"barrier={t2 - t1:.3f}s, notify={t3 - t2:.3f}s, " + f"total={t3 - t_guard_start:.3f}s", + flush=True, + ) + return metrics + # ------------------------------------------------------------------ # Copy strategies # ------------------------------------------------------------------ diff --git a/astraflow/train_worker/engine/megatron_engine.py b/astraflow/train_worker/engine/megatron_engine.py index 1fd5a87..b3c82de 100644 --- a/astraflow/train_worker/engine/megatron_engine.py +++ b/astraflow/train_worker/engine/megatron_engine.py @@ -368,99 +368,37 @@ def update_weights(self, meta: WeightUpdateMeta): "Use TCP-based weight transfer instead." ) - def get_megatron_shard_metadata(self) -> dict: - """Return TP shard metadata for shard-direct weight transfer. + def export_hf_named_params(self) -> Iterator[tuple[str, torch.Tensor]]: + """Stream ``(hf_name, full HF-layout CPU tensor)`` for weight sync. - Returns a serializable dict that WeightManager passes to the sender - agent. The sender agent uses it for CPU-side reassembly of TP shards - into HF-format params before serving to RaaS. + Reconstructs the global model from Megatron's TP/PP/EP/ETP/VPP layout + (via mbridge) and yields HF-named tensors one at a time — OOM-safe + for large / MoE models. Must be iterated in lockstep on every rank + (it runs collectives); the WeightManager decides which rank writes. - Currently requires PP=1 and EP=1. + See ``astraflow.train_worker.models.mcore.weight_export`` and + ``docs/en/architecture/megatron-weight-sync.md``. """ - from astraflow.train_worker.utils.megatron import get_named_parameters + from astraflow.train_worker.models.mcore.weight_export import ( + export_hf_named_params, + ) - pp_size = mpu.get_pipeline_model_parallel_world_size() - ep_size = mpu.get_expert_model_parallel_world_size() - if pp_size > 1: - raise NotImplementedError( - f"Megatron weight transfer does not support PP>1 yet (pp_size={pp_size})." - ) - if ep_size > 1: - raise NotImplementedError( - f"Megatron weight transfer does not support EP>1 yet (ep_size={ep_size})." - ) + self._ensure_ready() + yield from export_hf_named_params(self.bridge, self.model) - tp_size = mpu.get_tensor_model_parallel_world_size() - vocab_size = self.hf_config.vocab_size - model_type = getattr(self.hf_config, "model_type", "") - - # Collect per-param shard specs - shard_specs = [] - num_experts = getattr(self.tf_config, "num_moe_experts", None) - for mcore_name, param in get_named_parameters(self.model, num_experts): - is_tp = getattr(param, "tensor_model_parallel", False) - is_duplicated = getattr(param, "parallel_mode", None) == "duplicated" - is_sharded = is_tp and not is_duplicated - partition_dim = getattr(param, "partition_dim", 0) if is_sharded else 0 - - shard_shape = list(param.data.shape) - if is_sharded: - full_shape = list(param.data.shape) - full_shape[partition_dim] *= tp_size - else: - full_shape = list(param.data.shape) - - # Detect special param types for reassembly - is_glu = "linear_fc1.weight" in mcore_name - is_fc2_bug = ( - "linear_fc2.weight" in mcore_name - and is_sharded - and partition_dim == 0 - ) + def get_hf_weight_metadata(self) -> list[tuple[str, tuple[list[int], str]]]: + """Return the ordered HF weight layout ``[(name, (shape, dtype)), ...]``. - # Check if this is an embedding/output_layer that needs vocab unpadding - needs_vocab_unpad = ( - mcore_name in ( - "module.module.embedding.word_embeddings.weight", - "module.module.output_layer.weight", - ) - and full_shape[0] > vocab_size - ) + Used by WeightManager to size the transfer buffer and by RaaS to + pre-allocate. Runs the same collectives as ``export_hf_named_params`` + (call in lockstep on every rank). + """ + from astraflow.train_worker.models.mcore.weight_export import ( + hf_weight_metadata, + ) - shard_specs.append({ - "mcore_name": mcore_name, - "is_sharded": is_sharded, - "partition_dim": partition_dim, - "shard_shape": shard_shape, - "full_shape": full_shape, - "dtype": str(param.dtype).split(".")[-1], - "is_glu": is_glu, - "is_fc2_bug": is_fc2_bug, - "needs_vocab_unpad": needs_vocab_unpad, - }) - - # Conversion config for sender agent (subset of TransformerConfig fields) - try: - kv_channels = self.tf_config.kv_channels - except AttributeError: - kv_channels = None - - conversion_config = { - "model_type": model_type, - "hidden_size": self.tf_config.hidden_size, - "num_attention_heads": self.tf_config.num_attention_heads, - "num_query_groups": self.tf_config.num_query_groups, - "kv_channels": kv_channels, - "vocab_size": vocab_size, - } - - return { - "tp_size": tp_size, - "tp_rank": mpu.get_tensor_model_parallel_rank(), - "dp_rank": mpu.get_data_parallel_rank(), - "shard_specs": shard_specs, - "conversion_config": conversion_config, - } + self._ensure_ready() + return hf_weight_metadata(self.bridge, self.model) def set_version(self, version: int): self._version = version diff --git a/astraflow/train_worker/trainer/ppo_trainer.py b/astraflow/train_worker/trainer/ppo_trainer.py index b90af8c..16ab8e9 100644 --- a/astraflow/train_worker/trainer/ppo_trainer.py +++ b/astraflow/train_worker/trainer/ppo_trainer.py @@ -171,12 +171,16 @@ def _is_megatron(self) -> bool: return isinstance(self.actor, MegatronEngine) def _get_named_params_for_offload(self): - """Return raw named parameters for WeightManager.offload(). + """Return the (name, tensor) stream for WeightManager.offload(). - For both Megatron and FSDP: yields raw model.named_parameters(). - Megatron params are TP-sharded; WeightManager._copy_megatron_shards - handles the shard-direct copy using tp_rank offsets. + - Megatron: a fresh ``export_hf_named_params`` generator that yields + gathered HF-layout tensors (handles TP/PP/EP/VPP). WeightManager + streams it into the HF buffer on the writer rank. + - FSDP: raw ``model.named_parameters()`` (DTensor shards handled by + WeightManager's shard-copy / all-gather paths). """ + if self._is_megatron: + return self.actor.export_hf_named_params() try: return self.actor.model.named_parameters(remove_duplicate=False) except TypeError: @@ -255,9 +259,13 @@ def _init_weight_manager(self) -> None: "target_modules": list(peft_cfg.target_modules), } - megatron_metadata = None + # Megatron HF-export mode: the buffer is sized from the full HF + # weight layout, and offload streams gathered HF tensors into it. + # This keeps the sender/RaaS path identical to FSDP (delta in HF + # space) and works under any TP/PP/EP/VPP combination. + megatron_hf_meta = None if self._is_megatron: - megatron_metadata = self.actor.get_megatron_shard_metadata() + megatron_hf_meta = self.actor.get_hf_weight_metadata() # Determine HSDP replica rank (0 = primary, >0 = secondary). dp_replicate_rank = 0 @@ -279,10 +287,15 @@ def _init_weight_manager(self) -> None: dp_replicate_rank=dp_replicate_rank, ) else: - named_params = self._get_named_params_for_offload() + # In Megatron HF-export mode the layout comes from + # megatron_hf_meta, so named_params is unused at init time. + named_params = ( + iter(()) if self._is_megatron + else self._get_named_params_for_offload() + ) self.weight_manager.initialize( named_params, local_rank, global_rank, - megatron_metadata=megatron_metadata, + megatron_hf_meta=megatron_hf_meta, dp_replicate_rank=dp_replicate_rank, ) logger.info( From 84e6b1934ab72a7e757c1a0f4ffebc7aeab02a14 Mon Sep 17 00:00:00 2001 From: jsw-zorro Date: Fri, 29 May 2026 07:16:34 +0000 Subject: [PATCH 07/35] feat(examples): add Qwen3-8B Megatron math RL recipe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add examples/math/qwen3-8b-megatron-delta — the FSDP qwen3-8b-m2po-delta recipe with the trainer engine switched to the Megatron backend (backend: megatron, tensor_parallel_size: 4). Identical data, algorithm, and weight-transfer path, so it doubles as a clean FSDP-vs-Megatron A/B. End-to-end validation (single 8-GPU node, 4 RaaS + 4 trainer TP=4, delta TCP weight sync, DeepScaleR/M2PO): - Qwen3-8B (this recipe): 25 steps, 0 errors; weight_transfer/delta_sparsity ~0.92 (delta computed in HF space); task_reward/avg rose 0.535 (first half) -> 0.585 (last half), recent steps 0.61-0.64. Per-step weight offload 0.59s. - Qwen3-30B-A3B MoE (TP2/PP3/EP2 trainer on 6 GPUs + SGLang TP2 on 2 GPUs): 21 steps, 0 errors; full MoE export (18867 tensors, 61 GB) gathered across TP/PP/EP each step; task_reward/avg ~0.64 -> 0.66 (recent steps 0.70-0.77). --- .../math/qwen3-8b-megatron-delta/README.md | 55 +++++++ .../scripts/1_astraflow.sh | 36 +++++ .../qwen3-8b-megatron-delta/scripts/2_raas.sh | 44 +++++ .../scripts/3_trainer_model0.sh | 47 ++++++ .../scripts/run_qwen3-8b-megatron-delta.sh | 104 ++++++++++++ .../yaml/experiment.yaml | 150 ++++++++++++++++++ .../qwen3-8b-megatron-delta/yaml/raas.yaml | 33 ++++ 7 files changed, 469 insertions(+) create mode 100644 examples/math/qwen3-8b-megatron-delta/README.md create mode 100755 examples/math/qwen3-8b-megatron-delta/scripts/1_astraflow.sh create mode 100755 examples/math/qwen3-8b-megatron-delta/scripts/2_raas.sh create mode 100755 examples/math/qwen3-8b-megatron-delta/scripts/3_trainer_model0.sh create mode 100755 examples/math/qwen3-8b-megatron-delta/scripts/run_qwen3-8b-megatron-delta.sh create mode 100644 examples/math/qwen3-8b-megatron-delta/yaml/experiment.yaml create mode 100644 examples/math/qwen3-8b-megatron-delta/yaml/raas.yaml diff --git a/examples/math/qwen3-8b-megatron-delta/README.md b/examples/math/qwen3-8b-megatron-delta/README.md new file mode 100644 index 0000000..40f304a --- /dev/null +++ b/examples/math/qwen3-8b-megatron-delta/README.md @@ -0,0 +1,55 @@ +# Qwen3-8B Math RL — Megatron backend, delta TCP weight transfer + +Same math RL recipe as [`qwen3-8b-m2po-delta`](../qwen3-8b-m2po-delta) (M2PO, +DeepScaleR data, ctx 16k, lr 5e-6, sparse delta weight sync) but the trainer +uses the **Megatron-LM backend** instead of FSDP. The only difference is the +`trainer_base.engine` block: + +```yaml +engine: + backend: megatron + data_parallel_size: 1 + tensor_parallel_size: 4 + pipeline_parallel_size: 1 +``` + +This makes it a clean FSDP-vs-Megatron A/B: identical data, algorithm, and +weight-transfer path, so reward curves should track each other. + +## How weight sync works (Megatron) + +The trainer reconstructs the global model from Megatron's TP/PP/EP/VPP +layout into HuggingFace-named tensors (via `export_hf_named_params`, +backed by mbridge) and streams them into the CPU transfer buffer. Because +the buffer holds HF-layout bytes, the sparse **delta** is computed in HF +space and the RaaS receive path is identical to FSDP. See +[`docs/en/architecture/megatron-weight-sync.md`](../../../docs/en/architecture/megatron-weight-sync.md). + +## GPU layout (8 GPUs, single node) + +| Component | GPUs | Parallelism | +|-----------|------|-------------| +| RaaS (SGLang, model0) | 0,1,2,3 | DP=4 | +| Trainer model0 (Megatron) | 4,5,6,7 | TP=4 | + +## Run + +```bash +bash examples/math/qwen3-8b-megatron-delta/scripts/run_qwen3-8b-megatron-delta.sh +``` + +Or launch the three components separately (terminals 1/2/3): + +```bash +bash examples/math/qwen3-8b-megatron-delta/scripts/1_astraflow.sh +bash examples/math/qwen3-8b-megatron-delta/scripts/2_raas.sh +bash examples/math/qwen3-8b-megatron-delta/scripts/3_trainer_model0.sh +``` + +## Scaling to PP / MoE + +For pipeline or expert parallelism (and MoE models), set the corresponding +sizes in the `engine` block, e.g. `pipeline_parallel_size: 2` or +`expert_parallel_size: 2`. The backend auto-selects Megatron when `pp>1` or +`ep>1`. Ensure `data_parallel_size * tensor_parallel_size * +pipeline_parallel_size` equals the number of trainer GPUs. diff --git a/examples/math/qwen3-8b-megatron-delta/scripts/1_astraflow.sh b/examples/math/qwen3-8b-megatron-delta/scripts/1_astraflow.sh new file mode 100755 index 0000000..ae981ac --- /dev/null +++ b/examples/math/qwen3-8b-megatron-delta/scripts/1_astraflow.sh @@ -0,0 +1,36 @@ +#!/bin/bash +set -euo pipefail +# [1/3] Launch AstraFlow HTTP service +# +# Usage (terminal 1): +# bash examples/math/qwen3-8b-m2po-delta/scripts/1_astraflow.sh + +export CUDA_VISIBLE_DEVICES="" + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== AstraFlow HTTP Service ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "Port : ${ASTRAFLOW_PORT}" +echo "===============================" + +python3 -u -m astraflow \ + --config "${EXPERIMENT_CONFIG}" \ + --port "${ASTRAFLOW_PORT}" \ + --host "${ASTRAFLOW_HOST}" \ + 2>&1 | tee "${LOG_DIR}/astraflow.log" diff --git a/examples/math/qwen3-8b-megatron-delta/scripts/2_raas.sh b/examples/math/qwen3-8b-megatron-delta/scripts/2_raas.sh new file mode 100755 index 0000000..f66c5c4 --- /dev/null +++ b/examples/math/qwen3-8b-megatron-delta/scripts/2_raas.sh @@ -0,0 +1,44 @@ +#!/bin/bash +set -euo pipefail +# [2/3] Launch RaaS inference server (SGLang + TCP receiver) +# +# Usage (terminal 2, after AstraFlow is ready): +# bash examples/math/qwen3-8b-m2po-delta/scripts/2_raas.sh + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" +export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="${ASTRAFLOW_URL:-http://127.0.0.1:${ASTRAFLOW_PORT}}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== RaaS Inference Server (SGLang + TCP receiver) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "RaaS config : ${RAAS_CONFIG}" +echo "GPUs : ${CUDA_VISIBLE_DEVICES}" +echo "Port : ${RAAS_PORT}" +echo "AstraFlow URL : ${ASTRAFLOW_URL}" +echo "=======================================================" + +python3 -u -m astraflow.raas.server \ + --host "${RAAS_HOST}" \ + --port "${RAAS_PORT}" \ + --config "${EXPERIMENT_CONFIG}" \ + --config "${RAAS_CONFIG}" \ + --engine-id "${ENGINE_ID:-default}" \ + --astraflow-url "${ASTRAFLOW_URL}" \ + 2>&1 | tee "${LOG_DIR}/raas.log" diff --git a/examples/math/qwen3-8b-megatron-delta/scripts/3_trainer_model0.sh b/examples/math/qwen3-8b-megatron-delta/scripts/3_trainer_model0.sh new file mode 100755 index 0000000..67ffa1d --- /dev/null +++ b/examples/math/qwen3-8b-megatron-delta/scripts/3_trainer_model0.sh @@ -0,0 +1,47 @@ +#!/bin/bash +set -euo pipefail +# [3/3] Launch Trainer for model0 (TCP, sender_agent on local_rank 0) +# +# Usage (terminal 3, after AstraFlow and RaaS are ready): +# bash examples/math/qwen3-8b-m2po-delta/scripts/3_trainer_model0.sh + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS:-4,5,6,7}" +TRAINER0_NPROC="$(echo "${CUDA_VISIBLE_DEVICES}" | awk -F',' '{print NF}')" + +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" +export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" + +# sender_agent (in trainer) listens on this HTTP port +export WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== Trainer model0 (TCP) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "GPUs : ${CUDA_VISIBLE_DEVICES} (Megatron TP${TRAINER0_NPROC})" +echo "AstraFlow : ${ASTRAFLOW_URL}" +echo "RaaS : ${ASTRAFLOW_RAAS_URL}" +echo "Sender HTTP : ${WEIGHT_TRANSFER_HTTP_PORT}" +echo "WANDB mode : ${WANDB_MODE:-online}" +echo "==========================================" + +torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ + --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ + examples/launch_trainer.py \ + --config "${EXPERIMENT_CONFIG}" \ + --trainer trainer_model0 \ + "$@" 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/math/qwen3-8b-megatron-delta/scripts/run_qwen3-8b-megatron-delta.sh b/examples/math/qwen3-8b-megatron-delta/scripts/run_qwen3-8b-megatron-delta.sh new file mode 100755 index 0000000..d5ae145 --- /dev/null +++ b/examples/math/qwen3-8b-megatron-delta/scripts/run_qwen3-8b-megatron-delta.sh @@ -0,0 +1,104 @@ +#!/bin/bash +set -euo pipefail +# All-in-one launcher for AstraFlow v2 math training (Qwen3-8B, M2PO, Megatron TP4, TCP). +# +# Launches 3 processes: +# 1. AstraFlow HTTP service (CPU-only) +# 2. RaaS inference server (SGLang, SERVICE_CUDA_VISIBLE_DEVICES) +# 3. Trainer model0 (math, TRAINER_MODEL0_GPUS) +# +# Usage: +# bash examples/math/qwen3-8b-megatron-delta/scripts/run_qwen3-8b-megatron-delta.sh + +# ============================================================================= +# Part 1: Load env and settings +# ============================================================================= +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +# Defined in examples/_common/utils.sh. +astraflow_load_experiment_env + +# ============================================================================= +# Part 2: Set up env +# ============================================================================= +# GPU assignments (default: 4 GPUs for inference, 4 for training) +export SERVICE_CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" +export TRAINER_MODEL0_GPUS="${TRAINER_MODEL0_GPUS:-4,5,6,7}" +# Ports / URLs (each component gets its own port) +export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" +export WEIGHT_TRANSFER_HTTP_PORT_MODEL0="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" + +TRAINER0_NPROC="$(echo "${TRAINER_MODEL0_GPUS}" | awk -F',' '{print NF}')" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. +# Defined in examples/_common/utils.sh. +astraflow_setup_env + +# ============================================================================= +# Part 3: Print info and clean up +# ============================================================================= +echo "=== AstraFlow v2 (Qwen3-8B, math, M2PO, ctx16k, TCP delta) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "RaaS config : ${RAAS_CONFIG}" +echo "RaaS GPUs : ${SERVICE_CUDA_VISIBLE_DEVICES}" +echo "Trainer model0 GPUs : ${TRAINER_MODEL0_GPUS} (Megatron TP${TRAINER0_NPROC})" +echo "RaaS port : ${RAAS_PORT}" +echo "AstraFlow port : ${ASTRAFLOW_PORT}" +echo "Sender HTTP model0 : ${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" +echo "WANDB mode : ${WANDB_MODE:-online}" +echo "==========================================================" + +trap astraflow_cleanup_trap EXIT INT TERM + +# Kill leftover processes and shared memory from prior runs. +# Defined in examples/_common/utils.sh. +astraflow_kill_stale + +# ============================================================================= +# Part 4: Launch training +# ============================================================================= +echo "[1/3] Starting AstraFlow HTTP service..." +CUDA_VISIBLE_DEVICES="" \ + python3 -u -m astraflow \ + --config "${EXPERIMENT_CONFIG}" \ + --port "${ASTRAFLOW_PORT}" \ + --host "${ASTRAFLOW_HOST}" \ + 2>&1 | tee "${LOG_DIR}/astraflow.log" & +sleep 5 + +echo "[2/3] Starting RaaS inference server (SGLang + TCP receiver)..." +CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES}" \ + python3 -u -m astraflow.raas.server \ + --host "${RAAS_HOST}" \ + --port "${RAAS_PORT}" \ + --config "${EXPERIMENT_CONFIG}" \ + --config "${RAAS_CONFIG}" \ + --engine-id "${ENGINE_ID:-default}" \ + --astraflow-url "${ASTRAFLOW_URL}" \ + 2>&1 | tee "${LOG_DIR}/raas.log" & +sleep 15 + +export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" + +echo "[3/3] Starting trainer model0..." +CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS}" \ +WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" \ + torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ + --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ + examples/launch_trainer.py \ + --config "${EXPERIMENT_CONFIG}" \ + --trainer trainer_model0 \ + "$@" \ + 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/math/qwen3-8b-megatron-delta/yaml/experiment.yaml b/examples/math/qwen3-8b-megatron-delta/yaml/experiment.yaml new file mode 100644 index 0000000..8136452 --- /dev/null +++ b/examples/math/qwen3-8b-megatron-delta/yaml/experiment.yaml @@ -0,0 +1,150 @@ +# ============================================================================ +# Experiment config — AstraFlow service + Trainer +# Experiment: math / qwen3-8b-megatron-delta +# +# Qwen3-8B math RL with M2PO, ctx 16k, lr 5e-6, delta TCP weight transfer, +# **Megatron training backend** (TP=4). Same algorithm/data as the FSDP +# qwen3-8b-m2po-delta recipe — only the trainer engine differs, which makes +# it a clean FSDP-vs-Megatron comparison. +# +# GPU layout (default, 8 GPUs): +# SERVICE_CUDA_VISIBLE_DEVICES=0,1,2,3 -> RaaS (model0 dp=4) +# TRAINER_MODEL0_GPUS=4,5,6,7 -> Trainer model0 (Megatron, TP=4) +# ============================================================================ + +# ── Experiment: identity, model, shared settings ── +experiment: + experiment_name: astraflow-math + trial_name: qwen3-8b-megatron-delta + fileroot: ./data-experiments/${experiment.experiment_name}/${experiment.trial_name} + + model_path: "Qwen/Qwen3-8B" + tokenizer_path: "Qwen/Qwen3-8B" + seed: 1 + dtype: bfloat16 + weight_transfer_mode: tcp + weight_transfer_strategies: delta + +# ── RaaS: what to generate (inference-level config) ── +raas: + models: + model0: + backend: sglang + gconfig: + n_samples: 8 + temperature: 1.0 + max_new_tokens: 14000 + min_new_tokens: 0 + delta_full_sync_interval: 10 + +# ── AstraFlow: data pipeline ── +dataflow: + host: "0.0.0.0" + port: 8000 + + buffer: + size: 10000 + replay_size: 10000 + replay_ratio: 0 + max_staleness: 8 + filter_function: filter_zero_adv + + rollout_dataset: + dataset_fn: "astraflow.dataflow.dataset.deepscaler:get_deepscaler_rl_dataset" + max_length: 2000 + + workflow_spec: + workflow_cls: "rlvr" + reward_fn: "math_verify" + enable_thinking: false + + eval_workflows: + math_eval: + workflow_cls: "rlvr" + reward_fn: "math_verify" + enable_thinking: false + gconfig_overrides: + temperature: 0.6 + n_samples: 1 + + eval_datasets: + aime24: + dataset_fn: "astraflow.dataflow.dataset.aime24x4:get_aime_2024x4_test_dataset" + max_length: 2000 + repeat: 4 + eval_workflow: math_eval + aime25: + dataset_fn: "astraflow.dataflow.dataset.aime25x4:get_aime_2025x4_test_dataset" + max_length: 2000 + repeat: 4 + eval_workflow: math_eval + math500: + dataset_fn: "astraflow.dataflow.dataset.math500:get_math500_test_dataset" + max_length: 2000 + repeat: 4 + eval_workflow: math_eval + +# ── Trainer base: shared config ── +trainer_base: + total_train_steps: 800 + train_batch_size: 256 + n_samples: 8 + # Megatron training backend. TP=4 across the 4 trainer GPUs (dp=1). + # backend is auto-selected as megatron when pp>1 or ep>1, but we set it + # explicitly here so a TP-only config also uses Megatron. + engine: + backend: megatron + data_parallel_size: 1 + tensor_parallel_size: 4 + pipeline_parallel_size: 1 + + actor: + gradient_checkpointing: true + mb_spec: + max_tokens_per_mb: 17408 + optimizer: + type: adam + lr: 5e-6 + weight_decay: 0.01 + beta1: 0.9 + beta2: 0.999 + eps: 1e-8 + lr_scheduler_type: constant + gradient_clipping: 1.0 + # PPO / M2PO algorithm + m2_threshold: 0.01 + eps_clip: 100.0 + eps_clip_higher: 100.0 + reward_scaling: 1 + reward_bias: 0 + kl_ctl: 0.00 + kl_penalty_coef: 0.001 + ppo_n_minibatches: 4 + reward_norm: { mean_level: group, std_level: group } + adv_norm: { mean_level: batch, std_level: batch } + # Megatron backend uses sensible defaults (distributed optimizer on, + # DDP wrap on). Override under actor.megatron.{ddp,...} if needed. + + ref: + mb_spec: + max_tokens_per_mb: 17408 + + recover: + mode: auto + freq_steps: 25 + + evaluator: + eval_at_start: false + freq_steps: 25 + + stats_logger: + wandb: + mode: online + id_suffix: "uid" + +# ── Trainer for model0 — only overrides ── +trainer_model0: + model_id: model0 + stats_logger: + wandb: + tags: ["m2po", "math", "astraflow-v2", "qwen3-8b", "tcp", "ctx16k", "delta", "megatron"] diff --git a/examples/math/qwen3-8b-megatron-delta/yaml/raas.yaml b/examples/math/qwen3-8b-megatron-delta/yaml/raas.yaml new file mode 100644 index 0000000..5e21cbf --- /dev/null +++ b/examples/math/qwen3-8b-megatron-delta/yaml/raas.yaml @@ -0,0 +1,33 @@ +# ============================================================================ +# RaaS config — Inference serving instance (hardware/resources) +# Experiment: math / qwen3-8b-m2po-delta +# +# Hardware: 4x GPU, TP=1 +# model0: DP=4, TP=1 +# +# Merged with experiment.yaml at launch (--config experiment.yaml --config raas.yaml) +# experiment.yaml provides: model_path, tokenizer_path, seed, dtype, models/gconfig +# ============================================================================ + +rollout: + max_concurrent_rollouts: 1024 + # Cap concurrent eval prefills to bound peak KV pressure during the + # ~3.5k-item eval burst (5 datasets x repeat=4) — default 128 OOMs sglang. + max_concurrent_evals: 64 + pause_grace_period: 3 + # Adaptive availability — drive /availability off sglang /get_load. + enable_adaptive_availability: true + target_waiting_queue_per_dp: 4 + adaptive_step_size: 4 + load_cache_ttl_ms: 100 + +engine: + model0: + backend: sglang + data_parallel_size: 4 + +sglang: + context_length: 16384 + mem_fraction_static: 0.8 + max_running_requests: null + skip_tokenizer_init: true From 7ebc1d4d283c372ed7f0bc13cb27d4daaee538e7 Mon Sep 17 00:00:00 2001 From: jsw-zorro Date: Fri, 29 May 2026 07:58:34 +0000 Subject: [PATCH 08/35] perf(megatron): direct-DMA weight offload (~23x faster) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Megatron HF-export offload materialized each gathered tensor in pageable host memory via .to("cpu") before copying it into the pinned shared-memory transfer buffer — a ~1 GB/s bounce that cost ~13s/step for an 8B model on the RL critical path. Now the engine yields the gathered tensors on GPU (export_hf_named_params to_cpu=False) and WeightManager copies each tensor's uint8 view directly into the pinned buffer slice (non_blocking=True), fenced by a single cuda.synchronize() before the cross-rank barrier. The pinned buffer is already cudaHostRegister'd, so this hits the PCIe DMA engine. Copying through uint8 views on both sides keeps the copy alignment-free (robust to mixed-dtype models) and byte-identical for contiguous sources. Measured (Qwen3-8B, TP=4, 16.38 GB): pageable (old): 12.6s (1.3 GB/s) direct DMA: 0.56s (29.3 GB/s) ~23x Byte-equivalence verified (new buffer == old pageable path == HF reference, bit-exact) across TP=2, PP=2, TP=2/PP=2, and MoE TP=2/EP=2/PP=2 (Qwen3-30B-A3B, 61 GB). Adds tests/test_direct_dma_offload.py (equivalence) and tests/bench_offload_dma.py (throughput). --- .../weight_manager/tests/bench_offload_dma.py | 104 +++++++++++ .../tests/test_direct_dma_offload.py | 173 ++++++++++++++++++ .../core/weight_manager/weight_manager.py | 24 ++- .../train_worker/engine/megatron_engine.py | 9 +- 4 files changed, 303 insertions(+), 7 deletions(-) create mode 100644 astraflow/core/weight_manager/tests/bench_offload_dma.py create mode 100644 astraflow/core/weight_manager/tests/test_direct_dma_offload.py diff --git a/astraflow/core/weight_manager/tests/bench_offload_dma.py b/astraflow/core/weight_manager/tests/bench_offload_dma.py new file mode 100644 index 0000000..d267fa4 --- /dev/null +++ b/astraflow/core/weight_manager/tests/bench_offload_dma.py @@ -0,0 +1,104 @@ +"""Perf benchmark: direct-DMA vs pageable offload throughput. + +Measures wall-clock to copy the full gathered HF model from GPU into a host +buffer via the new direct-DMA path vs the old pageable .to("cpu") path, on +the same export pass. Reports GB/s for each. Evidence for optimization #1. + +Run: + torchrun --nproc_per_node= \ + astraflow/core/weight_manager/tests/bench_offload_dma.py \ + --model /shared/models/Qwen3-0.6B --tp 2 --iters 3 +""" + +from __future__ import annotations + +import argparse +import os +import sys +import time + +import torch +import torch.distributed as dist + + +def main() -> int: + ap = argparse.ArgumentParser() + ap.add_argument("--model", required=True) + ap.add_argument("--tp", type=int, default=1) + ap.add_argument("--pp", type=int, default=1) + ap.add_argument("--ep", type=int, default=1) + ap.add_argument("--iters", type=int, default=3) + args = ap.parse_args() + + from astraflow.train_worker.api.alloc_mode import ParallelStrategy + from astraflow.train_worker.api.cli_args import TrainEngineConfig + from astraflow.train_worker.api.io_struct import FinetuneSpec + from astraflow.train_worker.engine.megatron_engine import MegatronEngine + + world = int(os.environ["WORLD_SIZE"]) + dp = world // (args.tp * args.pp * args.ep) + engine = MegatronEngine(TrainEngineConfig(path=args.model, dtype="bfloat16")) + engine.create_process_group( + parallel_strategy=ParallelStrategy( + data_parallel_size=dp, + tensor_parallel_size=args.tp, + pipeline_parallel_size=args.pp, + expert_parallel_size=args.ep, + ) + ) + engine.initialize( + addr=None, + ft_spec=FinetuneSpec(total_train_epochs=1, dataset_size=1, train_batch_size=1), + ) + rank = dist.get_rank() + is_writer = rank == 0 + + from math import prod + + hf_meta = engine.get_hf_weight_metadata() + total = sum(prod(sh) * (2 if dt == "bfloat16" else 4) for _, (sh, dt) in hf_meta) + buf = torch.empty(total, dtype=torch.uint8, pin_memory=True) if is_writer else None + pageable = torch.empty(total, dtype=torch.uint8) if is_writer else None + + def run(mode: str) -> float: + offset = 0 + torch.cuda.synchronize() + t0 = time.perf_counter() + for _name, tensor in engine.export_hf_named_params(): + nbytes = tensor.numel() * tensor.element_size() + if is_writer: + src = tensor.reshape(-1).view(torch.uint8) + if mode == "dma": + buf[offset : offset + nbytes].copy_(src) + else: # pageable: host materialize first, then copy + host = tensor.to("cpu").contiguous().reshape(-1).view(torch.uint8) + pageable[offset : offset + nbytes].copy_(host) + offset += nbytes + if is_writer: + torch.cuda.synchronize() + return time.perf_counter() - t0 + + if rank == 0: + gb = total / 1e9 + print( + f"\n=== offload bench: model={os.path.basename(args.model)} " + f"tp={args.tp} pp={args.pp} ep={args.ep} total={gb:.2f} GB ===", + flush=True, + ) + for mode in ("dma", "pageable"): + ts = [run(mode) for _ in range(args.iters)] + if rank == 0: + best = min(ts) + print( + f" {mode:9s}: best={best:.3f}s ({total / 1e9 / best:.1f} GB/s) " + f"all={[round(x, 3) for x in ts]}", + flush=True, + ) + dist.barrier() + + engine.destroy() + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/astraflow/core/weight_manager/tests/test_direct_dma_offload.py b/astraflow/core/weight_manager/tests/test_direct_dma_offload.py new file mode 100644 index 0000000..dd5b106 --- /dev/null +++ b/astraflow/core/weight_manager/tests/test_direct_dma_offload.py @@ -0,0 +1,173 @@ +"""Correctness test for the direct-DMA offload optimization (#1). + +Verifies that copying gathered HF tensors *directly* from GPU into a pinned +host buffer (the new path) produces byte-identical buffer contents to the +old path (materialize each tensor in pageable host memory via .to("cpu"), +then copy), AND that both match the HF reference checkpoint. + +Three buffers are filled from the SAME export pass (so any nondeterminism in +the gather is shared, not a false diff): + - buf_new : new path — self._buffer pinned, src GPU tensor uint8 view, D2H copy + - buf_old : old path — tensor.to("cpu").contiguous() then uint8 copy + - ref : original HF safetensors bytes (ground truth, writer rank only) + +PASS iff buf_new == buf_old (byte-exact) AND buf_new == ref (byte-exact). + +Run: + torchrun --nproc_per_node= \ + astraflow/core/weight_manager/tests/test_direct_dma_offload.py \ + --model /shared/models/Qwen3-0.6B --tp 2 --pp 1 --ep 1 +""" + +from __future__ import annotations + +import argparse +import glob +import os +import sys + +import torch +import torch.distributed as dist + + +def _make_pinned_buffer(nbytes: int) -> torch.Tensor: + """A host uint8 tensor, page-locked + cudaHostRegister'd like the real shm buffer.""" + buf = torch.empty(nbytes, dtype=torch.uint8, pin_memory=True) + # The production buffer is cudaHostRegister'd; pin_memory already gives a + # page-locked allocation that the D2H DMA engine can use, which is the + # property under test. + return buf + + +def _ref_bytes(model_path: str, hf_meta: list) -> bytes: + from safetensors.torch import load_file + + ref = {} + for f in sorted(glob.glob(os.path.join(model_path, "*.safetensors"))): + ref.update(load_file(f)) + # Lay out in the exact hf_meta order, as bytes. + chunks = [] + import json as _json + + tie = _json.load(open(os.path.join(model_path, "config.json"))).get( + "tie_word_embeddings", False + ) + for name, (shape, dt) in hf_meta: + if name not in ref: + if tie and name == "lm_head.weight" and "model.embed_tokens.weight" in ref: + t = ref["model.embed_tokens.weight"] + else: + raise KeyError(f"ref missing {name}") + else: + t = ref[name] + t = t.to(torch.bfloat16 if dt == "bfloat16" else torch.float32).contiguous() + chunks.append(t.reshape(-1).view(torch.uint8).numpy().tobytes()) + return b"".join(chunks) + + +def main() -> int: + ap = argparse.ArgumentParser() + ap.add_argument("--model", required=True) + ap.add_argument("--tp", type=int, default=1) + ap.add_argument("--pp", type=int, default=1) + ap.add_argument("--ep", type=int, default=1) + args = ap.parse_args() + + from astraflow.train_worker.api.alloc_mode import ParallelStrategy + from astraflow.train_worker.api.cli_args import TrainEngineConfig + from astraflow.train_worker.api.io_struct import FinetuneSpec + from astraflow.train_worker.engine.megatron_engine import MegatronEngine + + world = int(os.environ["WORLD_SIZE"]) + dp = world // (args.tp * args.pp * args.ep) + + engine = MegatronEngine(TrainEngineConfig(path=args.model, dtype="bfloat16")) + engine.create_process_group( + parallel_strategy=ParallelStrategy( + data_parallel_size=dp, + tensor_parallel_size=args.tp, + pipeline_parallel_size=args.pp, + expert_parallel_size=args.ep, + ) + ) + engine.initialize( + addr=None, + ft_spec=FinetuneSpec(total_train_epochs=1, dataset_size=1, train_batch_size=1), + ) + + rank = dist.get_rank() + is_writer = rank == 0 + + # Metadata (lockstep) → total byte size. + hf_meta = engine.get_hf_weight_metadata() + from math import prod + + total = sum(prod(sh) * (2 if dt == "bfloat16" else 4) for _, (sh, dt) in hf_meta) + + buf_new = _make_pinned_buffer(total) if is_writer else None + buf_old = _make_pinned_buffer(total) if is_writer else None + + # Single export pass; fill both buffers from the SAME yielded tensors. + offset = 0 + for _name, tensor in engine.export_hf_named_params(): # to_cpu=False (GPU) + nbytes = tensor.numel() * tensor.element_size() + if is_writer: + assert tensor.is_cuda, "export must yield GPU tensors for the DMA path" + src_u8 = tensor.reshape(-1).view(torch.uint8) + # NEW path: direct D2H into pinned buffer (matches production: + # non_blocking=True + a single synchronize() after the loop). + buf_new[offset : offset + nbytes].copy_(src_u8, non_blocking=True) + # OLD path: pageable host materialization first, then copy. + host = tensor.to("cpu").contiguous().reshape(-1).view(torch.uint8) + buf_old[offset : offset + nbytes].copy_(host) + offset += nbytes + if is_writer: + torch.cuda.synchronize() + + result = 0 + if is_writer: + nb_new = bytes(buf_new.numpy().tobytes()) + nb_old = bytes(buf_old.numpy().tobytes()) + eq_paths = nb_new == nb_old + ref = _ref_bytes(args.model, hf_meta) + eq_ref = nb_new == ref + # Locate first differing byte for diagnostics. + first_diff_paths = ( + -1 + if eq_paths + else next( + ( + i + for i in range(min(len(nb_new), len(nb_old))) + if nb_new[i] != nb_old[i] + ), + -1, + ) + ) + first_diff_ref = ( + -1 + if eq_ref + else next( + (i for i in range(min(len(nb_new), len(ref))) if nb_new[i] != ref[i]), + -1, + ) + ) + print( + f"\n=== direct-DMA offload: total_bytes={total} " + f"new==old:{eq_paths} (first_diff={first_diff_paths}) " + f"new==ref:{eq_ref} (first_diff={first_diff_ref}) " + f"len(ref)={len(ref)} ===", + flush=True, + ) + result = 0 if (eq_paths and eq_ref) else 1 + + res_t = torch.tensor([result], device=f"cuda:{os.environ.get('LOCAL_RANK', 0)}") + dist.all_reduce(res_t, op=dist.ReduceOp.MAX) + if rank == 0: + print("PASS" if res_t.item() == 0 else "FAIL", flush=True) + engine.destroy() + return int(res_t.item()) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/astraflow/core/weight_manager/weight_manager.py b/astraflow/core/weight_manager/weight_manager.py index 658ab4a..a18cbc5 100644 --- a/astraflow/core/weight_manager/weight_manager.py +++ b/astraflow/core/weight_manager/weight_manager.py @@ -500,12 +500,28 @@ def _offload_megatron_hf( for _name, tensor in hf_named_params: nbytes = tensor.numel() * tensor.element_size() if is_writer: - t_u8 = tensor.contiguous().view(-1).view(torch.uint8) - self._buffer[half_base + offset: half_base + offset + nbytes].copy_( - t_u8 - ) + # Direct device->host DMA straight into the inactive half. + # self._buffer is cudaHostRegister'd (pinned), so copying a + # CUDA tensor into a view of it hits the fast PCIe DMA path + # (~tens of GB/s) instead of the pageable .to("cpu") bounce + # (~1 GB/s) the generator would otherwise do. + # + # Copy through a uint8 view of the *source* (the GPU tensor) + # into the uint8 destination slice: both sides are uint8 so + # there is no dtype-alignment requirement on the buffer offset + # (robust to mixed-dtype models), and the bytes are identical + # row-major since the source is contiguous. + src_u8 = tensor.reshape(-1).view(torch.uint8) + self._buffer[ + half_base + offset: half_base + offset + nbytes + ].copy_(src_u8, non_blocking=True) n_written += 1 offset += nbytes + if is_writer: + # Fence the async D2H copies before the barrier so the sender + # agent never reads a half-written half. (non_blocking=True above + # matches the other copy paths; this synchronize is the fence.) + torch.cuda.synchronize() t1 = _time.perf_counter() if dist.is_initialized(): diff --git a/astraflow/train_worker/engine/megatron_engine.py b/astraflow/train_worker/engine/megatron_engine.py index b3c82de..20d401c 100644 --- a/astraflow/train_worker/engine/megatron_engine.py +++ b/astraflow/train_worker/engine/megatron_engine.py @@ -369,14 +369,17 @@ def update_weights(self, meta: WeightUpdateMeta): ) def export_hf_named_params(self) -> Iterator[tuple[str, torch.Tensor]]: - """Stream ``(hf_name, full HF-layout CPU tensor)`` for weight sync. + """Stream ``(hf_name, full HF-layout GPU tensor)`` for weight sync. Reconstructs the global model from Megatron's TP/PP/EP/ETP/VPP layout (via mbridge) and yields HF-named tensors one at a time — OOM-safe for large / MoE models. Must be iterated in lockstep on every rank (it runs collectives); the WeightManager decides which rank writes. - See ``astraflow.train_worker.models.mcore.weight_export`` and + Tensors are yielded **on GPU** (contiguous): the WeightManager copies + them directly into its pinned shared-memory buffer (fast D2H DMA), + which is faster than materializing each tensor in pageable host memory + first. See ``astraflow.train_worker.models.mcore.weight_export`` and ``docs/en/architecture/megatron-weight-sync.md``. """ from astraflow.train_worker.models.mcore.weight_export import ( @@ -384,7 +387,7 @@ def export_hf_named_params(self) -> Iterator[tuple[str, torch.Tensor]]: ) self._ensure_ready() - yield from export_hf_named_params(self.bridge, self.model) + yield from export_hf_named_params(self.bridge, self.model, to_cpu=False) def get_hf_weight_metadata(self) -> list[tuple[str, tuple[list[int], str]]]: """Return the ordered HF weight layout ``[(name, (shape, dtype)), ...]``. From 77410dfb46e5839c500f80a4bceb182b999e893e Mon Sep 17 00:00:00 2001 From: Haizhong Zheng Date: Sat, 30 May 2026 14:35:33 -0400 Subject: [PATCH 09/35] fix: auto-select sglang attention backend and norm path by GPU arch The hardcoded sglang inference defaults assume Hopper and crash on non-Hopper GPUs (verified on L40 / Ada sm_89), while the identical package stack runs on H100. Two Hopper-only kernel paths were forced regardless of hardware: - attention_backend="fa3": FlashAttention-3 is Hopper-only; on Ada/Ampere it fails CUDA-graph capture ("scheduler_metadata must have shape"). - flashinfer 0.6.x CuTe-DSL RMSNorm: no Ada/Ampere kernel, JITs into an incompatible nvidia-cutlass-dsl and crashes (GPUModuleOp TypeError). Make both arch-aware so one image/env runs on both: - SGLangConfig.attention_backend defaults to None, which omits the --attention-backend flag and lets sglang auto-select per GPU (fa3 on Hopper, an Ada/Ampere-compatible backend below sm_90). - raas/entrypoint.py sets FLASHINFER_USE_CUDA_NORM=1 on non-Hopper GPUs before sglang/flashinfer import, selecting flashinfer's CUDA-JIT norm. Detection uses NVML (no CUDA context in the launcher) and respects an existing env override. Hopper behavior is unchanged (fa3 + CuTe norm). Recipes and YAMLs are untouched. Verified end-to-end on L40 with the qwen3-1.7b-m2po-2gpus-delta example (sglang init, CUDA-graph capture, live generation). --- astraflow/raas/api/cli_args.py | 5 ++++- astraflow/raas/entrypoint.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/astraflow/raas/api/cli_args.py b/astraflow/raas/api/cli_args.py index 97a020f..dceea58 100644 --- a/astraflow/raas/api/cli_args.py +++ b/astraflow/raas/api/cli_args.py @@ -355,7 +355,10 @@ class SGLangConfig: num_continuous_decode_steps: int = 1 enable_memory_saver: bool = False allow_auto_truncate: bool = False - attention_backend: str | None = "fa3" + # None -> omit --attention-backend so sglang auto-selects per GPU arch + # (fa3 on Hopper; an Ada/Ampere-compatible backend below sm_90). Hardcoding + # "fa3" breaks on non-Hopper GPUs (FlashAttention-3 is Hopper-only). + attention_backend: str | None = None enable_multimodal: bool = False sampling_backend: str | None = None context_length: int | None = 32768 diff --git a/astraflow/raas/entrypoint.py b/astraflow/raas/entrypoint.py index c492ee6..7bfccf4 100644 --- a/astraflow/raas/entrypoint.py +++ b/astraflow/raas/entrypoint.py @@ -2,6 +2,37 @@ import os import sys + +def _norm_fallback_for_non_hopper(): + """Force flashinfer's CUDA-JIT RMSNorm on non-Hopper GPUs. + + flashinfer 0.6.x routes RMSNorm through a CuTe-DSL kernel that has no + Ada/Ampere implementation and JITs into an incompatible nvidia-cutlass-dsl + (crashing with a GPUModuleOp TypeError on sm_89/sm_80). FLASHINFER_USE_CUDA_NORM=1 + selects its CUDA-JIT norm instead. Hopper (sm_90+) ships prebuilt cubins and is + unaffected. Must run before sglang/flashinfer is imported; uses NVML so it does + not create a CUDA context in this launcher process. + """ + if os.environ.get("FLASHINFER_USE_CUDA_NORM"): + return + try: + import pynvml + + pynvml.nvmlInit() + vis = os.environ.get("CUDA_VISIBLE_DEVICES", "").strip() + idx = int(vis.split(",")[0]) if vis and vis.split(",")[0].isdigit() else 0 + handle = pynvml.nvmlDeviceGetHandleByIndex(idx) + major, _ = pynvml.nvmlDeviceGetCudaComputeCapability(handle) + pynvml.nvmlShutdown() + if major < 9: + os.environ["FLASHINFER_USE_CUDA_NORM"] = "1" + except Exception: + pass + + +# Must run before sglang/flashinfer import (apply_patches may import sglang). +_norm_fallback_for_non_hopper() + from astraflow.raas.patch import apply_patches # Apply patches at module level so they also run in spawned child processes. From 02c43354c603dab391a4b6c416673dbeb61cf5d1 Mon Sep 17 00:00:00 2001 From: Haizhong Zheng Date: Sat, 30 May 2026 17:03:32 -0400 Subject: [PATCH 10/35] docs: align docker run shm-size and add --ulimit nofile Training co-locates trainer + RaaS + SGLang in one container and drives many concurrent rollouts, which surfaces two docker run requirements that the docs were inconsistent or silent about: - shm-size: docker/README.md still showed 16g, which causes "[Errno 28] No space left on device" when RaaS stages weights under /dev/shm. Bump it to 512g to match the install guide, with a note. - nofile: the container default soft limit (1024) is too low for the reward worker process pool and fails with "[Errno 24] Too many open files". Add --ulimit nofile=65536:65536 to the run commands in both docker/README.md and docs/en/get-started/installation.md, with a note. --- docker/README.md | 15 +++++++++++++-- docs/en/get-started/installation.md | 7 ++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/docker/README.md b/docker/README.md index 82e4eb3..3322934 100644 --- a/docker/README.md +++ b/docker/README.md @@ -41,10 +41,10 @@ docker build -f docker/Dockerfile.sglang -t astraflow:sglang . ```bash # Run the pre-built image with host network and all GPUs -docker run --gpus all --net=host --shm-size=16g -it astraflowai/astraflow:v0.1.0 +docker run --gpus all --net=host --shm-size=512g --ulimit nofile=65536:65536 -it astraflowai/astraflow:v0.1.0 # ...or run a locally built image -docker run --gpus all --net=host --shm-size=16g -it astraflow:sglang +docker run --gpus all --net=host --shm-size=512g --ulimit nofile=65536:65536 -it astraflow:sglang ``` ## Notes @@ -56,3 +56,14 @@ docker run --gpus all --net=host --shm-size=16g -it astraflow:sglang - **Package versions**: Inference backend versions (SGLang, flash-attn) are defined in `pyproject.toml` extras — the Dockerfile references the `.[sglang]` extra rather than hardcoding versions. +- **Shared memory (`--shm-size`)**: A recipe run co-locates the trainer, RaaS, and + SGLang in one container sharing a single `/dev/shm` (RaaS stages received weights + under `/dev/shm/astraflow_weights`). The container default (64 MB) and small values + like `16g` cause `OSError: [Errno 28] No space left on device` during training. Size + it generously (`512g`); it is a tmpfs cap, not a reservation, so it only uses host + RAM as actually consumed. +- **Open files (`--ulimit nofile`)**: Training launches many concurrent rollouts whose + reward workers open a large number of file descriptors. The container's default + `nofile` soft limit (1024) is too low and the reward pool fails with `[Errno 24] Too + many open files`. Raise it with `--ulimit nofile=65536:65536` (already in the Quick + Start commands above). diff --git a/docs/en/get-started/installation.md b/docs/en/get-started/installation.md index 3ee45b9..4074c1f 100644 --- a/docs/en/get-started/installation.md +++ b/docs/en/get-started/installation.md @@ -105,7 +105,7 @@ A pre-built image is published on Docker Hub — it skips the from-source steps entirely. Requires the NVIDIA Container Toolkit so `--gpus all` works. ```bash -docker run --gpus all --net=host --shm-size=512g -it astraflowai/astraflow:v0.1.0 +docker run --gpus all --net=host --shm-size=512g --ulimit nofile=65536:65536 -it astraflowai/astraflow:v0.1.0 ``` > **Note on `--shm-size`:** this sets the size of the container's `/dev/shm`. A @@ -118,6 +118,11 @@ docker run --gpus all --net=host --shm-size=512g -it astraflowai/astraflow:v0.1. > reservation, so it only consumes host RAM as actually used — set it to a value > comfortably below host RAM. +> **Note on `--ulimit nofile`:** a recipe run drives many concurrent rollouts whose +> reward workers open a large number of file descriptors. The container's default +> `nofile` soft limit (1024) is far too low and the reward pool fails with +> `[Errno 24] Too many open files`. Raise it with `--ulimit nofile=65536:65536`. + The image bundles astraflow, SGLang, and flash-attn. Pin a version tag (`v0.1.0`) for reproducibility; `:latest` tracks the most recent release. See `docker/README.md` for build details and the NVIDIA Container Toolkit install guide. From 5c5d91fcaad5eadce1ba060b090531a15b205924 Mon Sep 17 00:00:00 2001 From: Haizhong Date: Mon, 25 May 2026 21:02:24 -0400 Subject: [PATCH 11/35] feat: add spawn-sub-agents workflow for math RL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduces ``spawn_rlvr``, a single-shot tool-call workflow where the main agent may emit one ``{"tasks": [...]}`` block per trajectory to dispatch up to 4 sub-agents in parallel against the same RaaS pool. Sub-agent outputs are spliced back into main's context inside a ```` block and the main agent continues to a final answer. Training scheme: one trajectory per episode contains 1 main + N sub-agent sequences, all sharing the team reward (math_verify on main's final answer). No model_ids tagging — single-trainer regime. Mirrors solve_and_check.py's multi-sequence-shared-reward precedent. Implementation notes: - Phase-1 generates freely (no SGLang string-stop; SGLang runs with --skip-tokenizer-init and crashes on string-based stop matching). The workflow detects ... post-hoc via regex and truncates phase-1 tokens at the close-tag boundary. - Over-spec'd payloads (>4 tasks) are silently capped to 4; malformed JSON degrades the trajectory to vanilla single-turn RLVR. - Rollout dumps under {fileroot}/rollout_dumps/{version}/{qid}.txt contain decoded phase-1, per-sub-agent task+output, and phase-2 text for sanity checking. dump_prob configurable per workflow. Recipe: examples/math/spawn/qwen3-8b-spawn/ — Qwen3-8B, 8 GPUs, M2PO, ctx 16k, offline math datasets. Main max_new_tokens=3000, sub-agent max_new_tokens=1500 (max aggregated injection 4*1500=6000) so phase-1 + aggregated sub-results + phase-2 fits in the 16k SGLang window. Smoke-tested on 8x H100 (3 train steps + eval-at-start on the full 4768-item eval suite). Untrained Qwen3-8B emits valid spawn payloads ~40% of the time without SFT. Over 100 train steps, overall eval rose from 40.6% (v0) to 46.3% (v75), surpassing the vanilla rlvr baseline (44.3%) by +2.0% — confirming the team-reward gradient on shared trajectories is productive. --- astraflow/core/workflow/__init__.py | 1 + astraflow/core/workflow/impl/spawn.py | 548 ++++++++++++++++++ docs/en/index.rst | 1 + docs/en/recipes/math-spawn.md | 116 ++++ .../qwen3-8b-spawn/scripts/1_astraflow.sh | 36 ++ .../spawn/qwen3-8b-spawn/scripts/2_raas.sh | 44 ++ .../scripts/3_trainer_model0.sh | 47 ++ .../scripts/run_qwen3-8b-spawn.sh | 113 ++++ .../spawn/qwen3-8b-spawn/yaml/experiment.yaml | 198 +++++++ .../math/spawn/qwen3-8b-spawn/yaml/raas.yaml | 33 ++ 10 files changed, 1137 insertions(+) create mode 100644 astraflow/core/workflow/impl/spawn.py create mode 100644 docs/en/recipes/math-spawn.md create mode 100755 examples/math/spawn/qwen3-8b-spawn/scripts/1_astraflow.sh create mode 100755 examples/math/spawn/qwen3-8b-spawn/scripts/2_raas.sh create mode 100755 examples/math/spawn/qwen3-8b-spawn/scripts/3_trainer_model0.sh create mode 100755 examples/math/spawn/qwen3-8b-spawn/scripts/run_qwen3-8b-spawn.sh create mode 100644 examples/math/spawn/qwen3-8b-spawn/yaml/experiment.yaml create mode 100644 examples/math/spawn/qwen3-8b-spawn/yaml/raas.yaml diff --git a/astraflow/core/workflow/__init__.py b/astraflow/core/workflow/__init__.py index 0c7a5a8..ec015d7 100644 --- a/astraflow/core/workflow/__init__.py +++ b/astraflow/core/workflow/__init__.py @@ -24,6 +24,7 @@ import astraflow.core.workflow.impl.actor_and_verify import astraflow.core.workflow.impl.rlvr import astraflow.core.workflow.impl.sm_lg_router +import astraflow.core.workflow.impl.spawn import astraflow.core.workflow.impl.vision_rlvr import astraflow.core.workflow.reward.clevr_count_70k import astraflow.core.workflow.reward.geometry3k diff --git a/astraflow/core/workflow/impl/spawn.py b/astraflow/core/workflow/impl/spawn.py new file mode 100644 index 0000000..ad0760d --- /dev/null +++ b/astraflow/core/workflow/impl/spawn.py @@ -0,0 +1,548 @@ +"""Spawn-sub-agents math workflow. + +The main agent generates as usual, but may emit a single tool call of the +form ``{"tasks": ["...", "..."]}`` mid-generation. When that +happens the workflow: + + 1. Halts the main agent at ```` (using a string-level stop). + 2. Parses the JSON payload, caps the task list at ``max_sub_agents``. + 3. Fans out ``len(tasks)`` independent sub-agent generations against the + same RaaS pool via ``asyncio.gather`` — each sub-agent sees a fixed + system prompt plus ``{original_problem}\\n\\n{task}``. + 4. Concatenates the sub-agent outputs into a ``...`` block, + appends it to the main agent's context, and continues main generation. + 5. Computes ``reward_fn`` on the main agent's final answer. + +Training scheme (shared-reward, multi-sequence trajectory): + - One trajectory per episode-sample, containing 1 main + N sub-agent + sequences. All inherit the trajectory reward via + ``_ingest_structured_result``'s fallback. + - Single-model regime: no ``model_ids`` tagging — every sequence routes + to the same trainer. Main and sub-agents are the same policy. + - GRPO/M2PO advantage normalization runs over n_samples × (1 + sub-count) + sequences per prompt — credit-assignment is noisy by design (team + reward), but every contributor's tokens get gradient. See + ``solve_and_check.py`` for the multi-sequence-shared-reward precedent. + +Behavior when the main agent does not spawn (or emits a malformed payload): + the workflow degrades to vanilla single-turn RLVR (1 main sequence, no + sub-agents) — so the recipe stays valid for prompts that don't benefit. + +Usage in YAML config:: + + workflow_spec: + workflow_cls: spawn_rlvr + reward_fn: "math_verify" + tokenizer: "Qwen/Qwen3-8B" +""" + +from __future__ import annotations + +import asyncio +import json +import os +import random +import re +import uuid +from collections.abc import Callable +from typing import Any + +import aiofiles +import aiofiles.os +import torch +from transformers import PreTrainedTokenizerFast + +from astraflow.core.workflow.api.cli_args import GenerationHyperparameters +from astraflow.core.workflow.api.engine_api import InferenceEngine +from astraflow.core.workflow.api.io_struct import ModelRequest, ModelResponse +from astraflow.core.workflow.api.reward_api import AsyncRewardWrapper +from astraflow.core.workflow.api.workflow_api import RolloutWorkflow +from astraflow.core.workflow.registry import register_workflow +from astraflow.core.workflow.utils import logging, stats_tracker +from astraflow.core.workflow.utils.data import resolve_prompt_id +from astraflow.core.workflow.utils.dynamic_import import import_from_string + +logger = logging.getLogger("Spawn workflow") + + +SPAWN_OPEN = "" +SPAWN_CLOSE = "" +SPAWN_RESULT_OPEN = "" +SPAWN_RESULT_CLOSE = "" + +# Regex that matches a complete spawn block in the decoded phase-1 text. +# We do NOT use string-level SGLang stops here: SGLang in this repo runs +# with ``--skip-tokenizer-init`` and its scheduler has ``tokenizer=None``, +# so any ``stop=[...]`` argument crashes the scheduler in +# ``schedule_batch.py``'s ``_check_str_based_finish``. Instead we let the +# main agent generate freely and detect the close tag after decode. +# DOTALL so the JSON payload may span lines. +_SPAWN_RE = re.compile(r"\s*(\{.*?\})\s*", re.DOTALL) + +# System prompt prepended to the main agent so a fresh base model knows how +# to invoke the tool. Plain text — no chat-template surgery. +MAIN_SYSTEM_PROMPT = ( + "You are solving a math problem. Reason step by step and put your final " + "answer in \\boxed{}.\n\n" + "You have access to one tool: . You may call it AT MOST ONCE in " + "your response, to dispatch up to 4 sub-agents in parallel for " + "independent sub-tasks (e.g. verifying a step, exploring an alternative " + "approach, computing a hard sub-expression).\n\n" + "To call the tool, emit exactly one block of the form:\n" + "{\"tasks\": [\"\", \"\", ...]}\n" + "After the tag the system will pause your generation, run the " + "sub-agents in parallel, and inject their outputs back into your " + "context inside .... You then continue and " + "produce the final answer.\n\n" + "Use the tool only when sub-tasks would genuinely help. If not, just " + "solve the problem directly." +) + +# Fixed system prompt for every sub-agent. +SUB_SYSTEM_PROMPT = ( + "You are a sub-agent dispatched by a main reasoning agent to solve a " + "focused sub-task that is part of a larger math problem. Solve the " + "sub-task concisely. Return your reasoning followed by your answer in " + "\\boxed{} when applicable. Do not call any tools." +) + + +def _extract_problem(messages: list[dict]) -> str: + """Return the first user-turn content, used as the sub-agent's context.""" + for m in messages: + if m["role"] == "user": + return m["content"] + return "" + + +@register_workflow("spawn_rlvr") +class SpawnWorkflow(RolloutWorkflow): + """RLVR-style workflow with a single ```` tool call per trajectory. + + Parameters + ---------- + reward_fn : callable or str + Reward function applied to the main agent's final answer. + gconfig : GenerationHyperparameters + Generation config for the main agent. Sub-agents inherit it with + n_samples=1 and ``sub_agent_max_new_tokens`` (default: main // 2). + tokenizer : str or PreTrainedTokenizerFast + Tokenizer. + enable_thinking : bool + Forwarded to the chat template (Qwen3 ```` tokens). + max_sub_agents : int + Hard cap on sub-agents per spawn call (extras dropped). + sub_agent_max_new_tokens : int | None + Override for sub-agent budget. None → main's ``max_new_tokens // 2``. + dump_prob : float + Probability of dumping a fully-decoded trajectory (with phase-1 + output, every sub-agent task + output, and phase-2 output) to + ``dump_dir/{version}/{qid}.txt`` for sanity-checking. Default + 1/128 (matching rlvr); bump to 1.0 for smoke tests. + """ + + def __init__( + self, + reward_fn: Callable[..., Any] | str, + gconfig: GenerationHyperparameters, + tokenizer: PreTrainedTokenizerFast | str, + enable_thinking: bool = False, + rollout_stat_scope: str = "rollout", + dump_dir: str | None = None, + max_sub_agents: int = 4, + sub_agent_max_new_tokens: int | None = None, + dump_prob: float = 1 / 128, + ): + self.reward_fn = reward_fn + if isinstance(tokenizer, str): + from astraflow.core.workflow.utils.hf_utils import load_hf_tokenizer + + tokenizer = load_hf_tokenizer(tokenizer) + self.tokenizer = tokenizer + + self.gconfig = gconfig.new_with_stop_and_pad_token_ids(self.tokenizer) + self.enable_thinking = enable_thinking + self.rollout_stat_scope = rollout_stat_scope + self.dump_dir = dump_dir + if not isinstance(reward_fn, str): + self.async_reward_fn = AsyncRewardWrapper(reward_fn) + if self.dump_dir is not None: + os.makedirs(self.dump_dir, exist_ok=True) + + self.max_sub_agents = max_sub_agents + self.dump_prob = float(dump_prob) + if sub_agent_max_new_tokens is not None: + self.sub_agent_max_new_tokens = sub_agent_max_new_tokens + else: + self.sub_agent_max_new_tokens = max(64, self.gconfig.max_new_tokens // 2) + + # ------------------------------------------------------------------ helpers + + def _apply_chat_template(self, messages, add_generation_prompt: bool = True): + try: + return list(self.tokenizer.apply_chat_template( + messages, + tokenize=True, + add_generation_prompt=add_generation_prompt, + enable_thinking=self.enable_thinking, + )) + except TypeError: + return list(self.tokenizer.apply_chat_template( + messages, + tokenize=True, + add_generation_prompt=add_generation_prompt, + )) + + def _build_main_input_ids(self, data: dict[str, Any]) -> list[int]: + """Main agent sees the spawn-tool system prompt + the original messages.""" + messages = [{"role": "system", "content": MAIN_SYSTEM_PROMPT}] + for m in data["messages"]: + messages.append(m) + return self._apply_chat_template(messages, add_generation_prompt=True) + + def _build_sub_input_ids(self, problem: str, task: str) -> list[int]: + messages = [ + {"role": "system", "content": SUB_SYSTEM_PROMPT}, + { + "role": "user", + "content": ( + f"Original problem:\n{problem}\n\n" + f"Your sub-task:\n{task}\n\n" + "Solve the sub-task and return your reasoning." + ), + }, + ] + return self._apply_chat_template(messages, add_generation_prompt=True) + + def _parse_spawn_payload(self, completion_text: str) -> list[str]: + """Return the list of task strings, or [] if no usable payload.""" + m = _SPAWN_RE.search(completion_text) + if not m: + return [] + try: + payload = json.loads(m.group(1)) + except json.JSONDecodeError: + logger.warning("spawn payload JSON decode failed; treating as no-spawn") + return [] + tasks = payload.get("tasks") + if not isinstance(tasks, list): + return [] + tasks = [str(t) for t in tasks if isinstance(t, (str, int, float))] + if len(tasks) > self.max_sub_agents: + logger.warning( + "spawn payload had %d tasks; truncating to %d", + len(tasks), self.max_sub_agents, + ) + tasks = tasks[: self.max_sub_agents] + return tasks + + def _format_spawn_result(self, sub_outputs: list[str]) -> str: + parts = [SPAWN_RESULT_OPEN, ""] + for i, out in enumerate(sub_outputs): + parts.append(f"") + parts.append(out) + parts.append(f"") + parts.append(SPAWN_RESULT_CLOSE) + parts.append("") + return "\n".join(parts) + + # ------------------------------------------------------------------ sub-agent + + async def _run_sub_agent( + self, + engine: InferenceEngine, + problem: str, + task: str, + ) -> tuple[list[int], ModelResponse]: + sub_input_ids = self._build_sub_input_ids(problem, task) + sub_gconfig = self.gconfig.new( + n_samples=1, + max_new_tokens=self.sub_agent_max_new_tokens, + ) + resp = await engine.agenerate( + ModelRequest( + rid=uuid.uuid4().hex, + input_ids=sub_input_ids, + gconfig=sub_gconfig, + tokenizer=self.tokenizer, + ) + ) + return sub_input_ids, resp + + # ------------------------------------------------------------------ episode + + async def _run_one_episode( + self, + engine: InferenceEngine, + data: dict[str, Any], + ) -> tuple[list[dict[str, Any]], float, dict[str, Any]]: + """Returns (sequences, reward, debug_info). + + ``sequences`` is the list of per-sequence tensor dicts for this + episode's trajectory (1 main + N sub-agents). ``reward`` is the + scalar math_verify reward on the main agent's final answer. + """ + problem = _extract_problem(data["messages"]) + main_prompt_ids = self._build_main_input_ids(data) + prompt_str = self.tokenizer.decode(main_prompt_ids) + + # ── Phase 1: main agent generates freely ── + # No string-level ``stop`` (SGLang's scheduler runs with + # tokenizer=None and crashes on stop-string matching). We let + # the model run to its natural end and detect ... + # post-hoc. If a spawn is detected mid-generation, the tokens + # after are discarded for the trajectory. + phase1_gconfig = self.gconfig.new(n_samples=1) + resp1 = await engine.agenerate( + ModelRequest( + rid=uuid.uuid4().hex, + input_ids=main_prompt_ids, + gconfig=phase1_gconfig, + tokenizer=self.tokenizer, + ) + ) + phase1_text = self.tokenizer.decode(resp1.output_tokens) + spawn_match = _SPAWN_RE.search(phase1_text) + tasks = self._parse_spawn_payload(phase1_text) if spawn_match else [] + + # ── No-spawn branch: degrade to vanilla single-turn RLVR ── + if not tasks: + reward, _ = await self._compute_reward(resp1, prompt_str, data) + stats_tracker.get(self.rollout_stat_scope).scalar(reward=reward) + stats_tracker.get(self.rollout_stat_scope).scalar(num_sub_agents=0) + main_seq = self._build_sequence( + prompt_ids=main_prompt_ids, + model_segments=[resp1], + env_segments_after_prompt=[], + ) + return [main_seq], reward, { + "phase1_text": phase1_text, "spawned": False, + "n_sub": 0, "phase2_text": "", "sub_outputs": [], + } + + # ── Spawn branch: truncate phase-1 tokens at the close tag, then + # fan out sub-agents in parallel ── + # Re-encode the text up through to find the token cutoff. + # BPE boundary effects can shift the cutoff by ±1 token; that's + # fine because the prefix text is identical and lands in + # loss_mask=1 either way. + phase1_prefix_text = phase1_text[: spawn_match.end()] + phase1_prefix_ids = list( + self.tokenizer.encode(phase1_prefix_text, add_special_tokens=False) + ) + cutoff = min(len(phase1_prefix_ids), len(resp1.output_tokens)) + truncated_phase1_tokens = list(resp1.output_tokens[:cutoff]) + truncated_phase1_logprobs = list(resp1.output_logprobs[:cutoff]) + truncated_phase1_versions = list(resp1.output_versions[:cutoff]) + + sub_results = await asyncio.gather( + *[self._run_sub_agent(engine, problem, t) for t in tasks] + ) + sub_outputs_text = [self.tokenizer.decode(r[1].output_tokens) for r in sub_results] + + # Build aggregated block. Tokenize without + # special tokens — it's a continuation of the main agent's + # context. + agg_text = self._format_spawn_result(sub_outputs_text) + agg_ids = list(self.tokenizer.encode(agg_text, add_special_tokens=False)) + + # ── Phase 2: main agent continues with aggregated result appended ── + phase2_prefix = main_prompt_ids + truncated_phase1_tokens + agg_ids + phase2_gconfig = self.gconfig.new(n_samples=1) + resp2 = await engine.agenerate( + ModelRequest( + rid=uuid.uuid4().hex, + input_ids=phase2_prefix, + gconfig=phase2_gconfig, + tokenizer=self.tokenizer, + ) + ) + phase2_text = self.tokenizer.decode(resp2.output_tokens) + + reward, _ = await self._compute_reward(resp2, prompt_str, data) + stats_tracker.get(self.rollout_stat_scope).scalar(reward=reward) + stats_tracker.get(self.rollout_stat_scope).scalar(num_sub_agents=len(tasks)) + + # ── Build main sequence (multi-segment) ── + main_seq = self._build_main_sequence_with_spawn( + prompt_ids=main_prompt_ids, + phase1_tokens=truncated_phase1_tokens, + phase1_logprobs=truncated_phase1_logprobs, + phase1_versions=truncated_phase1_versions, + agg_ids=agg_ids, + resp2=resp2, + ) + + # ── Build sub-agent sequences (vanilla input/output layout) ── + sub_seqs = [] + for sub_input_ids, sub_resp in sub_results: + sub_seqs.append( + self._build_sequence( + prompt_ids=sub_input_ids, + model_segments=[sub_resp], + env_segments_after_prompt=[], + ) + ) + + debug = { + "phase1_text": phase1_text, + "spawned": True, + "n_sub": len(tasks), + "tasks": tasks, + "sub_outputs": sub_outputs_text, + "phase2_text": phase2_text, + } + return [main_seq] + sub_seqs, reward, debug + + # ------------------------------------------------------------------ tensors + + def _build_sequence( + self, + prompt_ids: list[int], + model_segments: list[ModelResponse], + env_segments_after_prompt: list[list[int]], + ) -> dict[str, torch.Tensor]: + """Single prompt + model output(s). Used for sub-agents and no-spawn main.""" + # For both the vanilla rlvr case and sub-agents, there's one model + # segment immediately after the prompt and no env segments. + assert ( + len(model_segments) == 1 and not env_segments_after_prompt + ), "_build_sequence is the simple path; use _build_main_sequence_with_spawn for the spawn branch" + resp = model_segments[0] + seq = list(prompt_ids) + list(resp.output_tokens) + loss_mask = [0] * len(prompt_ids) + [1] * len(resp.output_tokens) + logprobs = [0.0] * len(prompt_ids) + list(resp.output_logprobs) + versions = [-1] * len(prompt_ids) + list(resp.output_versions) + return self._pack(seq, loss_mask, logprobs, versions) + + def _build_main_sequence_with_spawn( + self, + prompt_ids: list[int], + phase1_tokens: list[int], + phase1_logprobs: list[float], + phase1_versions: list[int], + agg_ids: list[int], + resp2: ModelResponse, + ) -> dict[str, torch.Tensor]: + """Layout: + [prompt | phase1_out (incl. ) | ...| phase2_out] + 0 1 0 1 + ``phase1_tokens`` is already truncated to end at . + """ + seq = ( + list(prompt_ids) + + list(phase1_tokens) + + list(agg_ids) + + list(resp2.output_tokens) + ) + p_len = len(prompt_ids) + p1_len = len(phase1_tokens) + agg_len = len(agg_ids) + p2_len = len(resp2.output_tokens) + + loss_mask = ( + [0] * p_len + + [1] * p1_len # main agent's pre-spawn reasoning + tool call + + [0] * agg_len # env output (sub-agent results) + + [1] * p2_len # main agent's post-spawn answer + ) + logprobs = ( + [0.0] * p_len + + list(phase1_logprobs) + + [0.0] * agg_len + + list(resp2.output_logprobs) + ) + versions = ( + [-1] * p_len + + list(phase1_versions) + + [-1] * agg_len + + list(resp2.output_versions) + ) + return self._pack(seq, loss_mask, logprobs, versions) + + @staticmethod + def _pack(seq, loss_mask, logprobs, versions) -> dict[str, torch.Tensor]: + n = len(seq) + out = { + "input_ids": torch.tensor(seq, dtype=torch.int32), + "loss_mask": torch.tensor(loss_mask, dtype=torch.int32), + "logprobs": torch.tensor(logprobs, dtype=torch.float32), + "versions": torch.tensor(versions, dtype=torch.int32), + "attention_mask": torch.ones(n, dtype=torch.bool), + } + return {k: v.unsqueeze(0) for k, v in out.items()} + + # ------------------------------------------------------------------ reward + + async def _compute_reward( + self, + resp: ModelResponse, + prompt_str: str, + task_data: dict[str, Any], + ) -> tuple[float, str]: + completions_str = self.tokenizer.decode(resp.output_tokens) + reward = await self.async_reward_fn( + prompt_str, + completions_str, + resp.input_tokens, + resp.output_tokens, + **task_data, + ) + if not isinstance(reward, (int, float)): + reward = float(reward) + return reward, completions_str + + # ------------------------------------------------------------------ entry + + async def arun_episode( + self, engine: InferenceEngine, data: dict[str, Any] + ) -> dict[str, Any]: + if isinstance(self.reward_fn, str): + self.reward_fn = import_from_string(self.reward_fn) + self.async_reward_fn = AsyncRewardWrapper(self.reward_fn) + + n_samples = self.gconfig.n_samples + version = engine.get_version() + + # Fan out n_samples spawn-episodes in parallel for the same prompt. + raw = await asyncio.gather( + *[self._run_one_episode(engine, data) for _ in range(n_samples)] + ) + + trajectories: list[dict[str, Any]] = [] + traj_rewards: list[float] = [] + debugs: list[dict[str, Any]] = [] + for sequences, reward, debug in raw: + trajectories.append({"sequences": sequences}) + traj_rewards.append(reward) + debugs.append(debug) + + # Optional debug dump. Set dump_prob=1.0 in the YAML to dump + # every rollout (useful for sanity-checking the spawn protocol). + if self.dump_dir is not None and random.random() < self.dump_prob: + dump_path = os.path.join(self.dump_dir, str(version)) + await aiofiles.os.makedirs(dump_path, exist_ok=True) + qid = resolve_prompt_id(data) or uuid.uuid4().hex + file_path = os.path.join(dump_path, f"{qid}.txt") + async with aiofiles.open(file_path, "a") as f: + for i, (debug, reward) in enumerate(zip(debugs, traj_rewards)): + await f.write( + f"=== Sample {i + 1}/{n_samples} reward={reward} " + f"spawned={debug['spawned']} n_sub={debug['n_sub']} ===\n" + f"--- phase 1 (main, until ) ---\n{debug['phase1_text']}\n\n" + ) + if debug["spawned"]: + for j, out in enumerate(debug["sub_outputs"]): + await f.write( + f"--- sub-agent {j} task: {debug['tasks'][j]!r} ---\n{out}\n\n" + ) + await f.write( + f"--- phase 2 (main, after spawn_result) ---\n{debug['phase2_text']}\n\n" + ) + + return { + "n_trajs": len(trajectories), + "rewards": torch.tensor(traj_rewards, dtype=torch.float32), + "trajectories": trajectories, + "prompt_id": resolve_prompt_id(data), + } diff --git a/docs/en/index.rst b/docs/en/index.rst index c6efc01..f9a2e77 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -28,6 +28,7 @@ on distributed GPU clusters. recipes/math recipes/math-offline + recipes/math-spawn recipes/code recipes/multi-agent recipes/agentbench diff --git a/docs/en/recipes/math-spawn.md b/docs/en/recipes/math-spawn.md new file mode 100644 index 0000000..96bc055 --- /dev/null +++ b/docs/en/recipes/math-spawn.md @@ -0,0 +1,116 @@ +# Math (Spawn sub-agents) + +A math RL recipe where the main agent can emit a single `` tool call +mid-generation to dispatch up to **four sub-agents in parallel**, then +continues with the aggregated sub-agent outputs spliced back into its +context. All N+1 sequences in the resulting trajectory share the team +reward and contribute gradient — main and sub-agents are the same policy. + +**Recipe**: [`examples/math/spawn/qwen3-8b-spawn/`](https://github.com/Infini-AI-Lab/astraflow/tree/main/examples/math/spawn/qwen3-8b-spawn) + +**Workflow class**: [`astraflow/core/workflow/impl/spawn.py`](https://github.com/Infini-AI-Lab/astraflow/tree/main/astraflow/core/workflow/impl/spawn.py) — registered as `spawn_rlvr`. + +## Protocol + +The main agent sees a fixed system prompt describing the tool. To call it, +it emits exactly one block: + +``` +{"tasks": ["", "", ...]} +``` + +The workflow: + +1. Halts the main agent at `` via a string-level stop. +2. Parses the JSON; caps `tasks` at 4 (extras dropped + logged). +3. Runs `len(tasks)` sub-agents in parallel via `asyncio.gather`. Each + sub-agent sees a fixed sub-agent system prompt plus + `Original problem:\n{problem}\n\nYour sub-task:\n{task}`. +4. Concatenates sub-agent outputs into a `` block, appends + it to the main agent's context, and continues generation to the final + answer. +5. Computes `math_verify` reward on the main agent's final answer. + +If the main agent emits no `` (or a malformed payload), the +workflow falls back to vanilla single-turn RLVR — the recipe stays valid +across training when the model hasn't yet learned to use the tool. + +## Training scheme + +Each spawn-using episode returns **one trajectory containing 1 main + N +sub-agent sequences**, all inheriting the trajectory reward. Concretely: + +| sequence | input (loss_mask=0) | output (loss_mask=1) | reward | +|---|---|---|---| +| main agent | problem prompt + `` | pre-spawn reasoning + `` + post-spawn reasoning + final answer | R | +| sub-agent 0 | fixed system + (problem + task₀) | sub-agent 0's reasoning + answer | R | +| … | … | … | R | +| sub-agent N | … | … | R | + +`R = math_verify(main_final_answer, gt_answer)`. + +- All sequences route to the same trainer (no `model_ids` tagging). +- GRPO/M2PO advantage normalization runs over `n_samples × (1 + sub-count)` + sequences per prompt. +- **Credit assignment is noisy by design** (team reward — a sub-agent gets + +1 even if its output was useless when the main agent still got the + right answer). Future levers if needed: down-weight sub-agent loss vs + main, or add per-sub-agent auxiliary reward (e.g. was the sub-agent's + answer cited / used?). v1 uses equal weight, single shared reward. + +## Run + +One-time dataset prep (shared with the offline-math recipe): + +```bash +python examples/math/offline/download_math_datasets.py --root data-data/math +``` + +Then: + +```bash +bash examples/math/spawn/qwen3-8b-spawn/scripts/run_qwen3-8b-spawn.sh +``` + +Per-stage overrides (CLI args pass through to the trainer): + +```bash +bash examples/math/spawn/qwen3-8b-spawn/scripts/run_qwen3-8b-spawn.sh \ + total_train_steps=3 evaluator.eval_at_start=true +``` + +## Settings + +| Setting | Value | +|---|---| +| Model | Qwen3-8B | +| GPUs | 8 — RaaS ×4 (SGLang, DP=4), Trainer ×4 (FSDP, DP=4) | +| Algorithm | M2PO (`m2_threshold` 0.01) | +| Weight transfer | TCP, full | +| Context length | 16384 | +| Main max_new_tokens | 3000 (so phase-1 + agg + phase-2 fits 16k) | +| Sub-agent max_new_tokens | 1500 (×4 max → 6000 token aggregated injection) | +| Max sub-agents per spawn | 4 | +| Rollouts per prompt | 8 (`temperature` 1.0) | +| Workflow / reward | `spawn_rlvr` / `math_verify` | +| Train dataset | DeepScaleR (offline) | +| Eval datasets | AIME24, AIME25, AMC, Minerva, MATH500 (offline) | + +## Caveats + +- **Bootstrap problem.** A fresh Qwen3-8B-Base won't naturally emit + `` — the workflow ships a prompt-engineering system prompt that + describes the tool with examples to seed exploration. If your model + variant ignores the instructions, you'll see all trajectories degrade + to vanilla RLVR (no spawn calls, no sub-agent training). Add an SFT + warm-start with synthetic spawn-using trajectories if needed. +- **Context budget.** Phase-2 input = main_prompt + phase-1 output + + `` + aggregated sub-results. With the defaults + (main=3000, sub=1500×4), the worst case is roughly + prompt(~1000) + phase-1(3000) + agg(6000) + phase-2(3000) ≈ 13k, + comfortably under the 16k SGLang window. If you bump + `max_new_tokens` or `max_sub_agents`, also bump `context_length` in + `raas.yaml` to match. +- **Model + tokenizer weights** still pull from HF Hub on first use, as + with the offline-math recipe. Pre-fetch `Qwen/Qwen3-8B` for an + air-gapped run. diff --git a/examples/math/spawn/qwen3-8b-spawn/scripts/1_astraflow.sh b/examples/math/spawn/qwen3-8b-spawn/scripts/1_astraflow.sh new file mode 100755 index 0000000..3130867 --- /dev/null +++ b/examples/math/spawn/qwen3-8b-spawn/scripts/1_astraflow.sh @@ -0,0 +1,36 @@ +#!/bin/bash +set -euo pipefail +# [1/3] Launch AstraFlow HTTP service +# +# Usage (terminal 1): +# bash examples/math/spawn/qwen3-8b-spawn/scripts/1_astraflow.sh + +export CUDA_VISIBLE_DEVICES="" + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== AstraFlow HTTP Service ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "Port : ${ASTRAFLOW_PORT}" +echo "===============================" + +python3 -u -m astraflow \ + --config "${EXPERIMENT_CONFIG}" \ + --port "${ASTRAFLOW_PORT}" \ + --host "${ASTRAFLOW_HOST}" \ + 2>&1 | tee "${LOG_DIR}/astraflow.log" diff --git a/examples/math/spawn/qwen3-8b-spawn/scripts/2_raas.sh b/examples/math/spawn/qwen3-8b-spawn/scripts/2_raas.sh new file mode 100755 index 0000000..9970bc7 --- /dev/null +++ b/examples/math/spawn/qwen3-8b-spawn/scripts/2_raas.sh @@ -0,0 +1,44 @@ +#!/bin/bash +set -euo pipefail +# [2/3] Launch RaaS inference server (SGLang + TCP receiver) +# +# Usage (terminal 2, after AstraFlow is ready): +# bash examples/math/spawn/qwen3-8b-spawn/scripts/2_raas.sh + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" +export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="${ASTRAFLOW_URL:-http://127.0.0.1:${ASTRAFLOW_PORT}}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== RaaS Inference Server (SGLang + TCP receiver) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "RaaS config : ${RAAS_CONFIG}" +echo "GPUs : ${CUDA_VISIBLE_DEVICES}" +echo "Port : ${RAAS_PORT}" +echo "AstraFlow URL : ${ASTRAFLOW_URL}" +echo "=======================================================" + +python3 -u -m astraflow.raas.server \ + --host "${RAAS_HOST}" \ + --port "${RAAS_PORT}" \ + --config "${EXPERIMENT_CONFIG}" \ + --config "${RAAS_CONFIG}" \ + --engine-id "${ENGINE_ID:-default}" \ + --astraflow-url "${ASTRAFLOW_URL}" \ + 2>&1 | tee "${LOG_DIR}/raas.log" diff --git a/examples/math/spawn/qwen3-8b-spawn/scripts/3_trainer_model0.sh b/examples/math/spawn/qwen3-8b-spawn/scripts/3_trainer_model0.sh new file mode 100755 index 0000000..8fcf05a --- /dev/null +++ b/examples/math/spawn/qwen3-8b-spawn/scripts/3_trainer_model0.sh @@ -0,0 +1,47 @@ +#!/bin/bash +set -euo pipefail +# [3/3] Launch Trainer for model0 (TCP, sender_agent on local_rank 0) +# +# Usage (terminal 3, after AstraFlow and RaaS are ready): +# bash examples/math/spawn/qwen3-8b-spawn/scripts/3_trainer_model0.sh + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS:-4,5,6,7}" +TRAINER0_NPROC="$(echo "${CUDA_VISIBLE_DEVICES}" | awk -F',' '{print NF}')" + +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" +export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" + +# sender_agent (in trainer) listens on this HTTP port +export WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== Trainer model0 (TCP) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "GPUs : ${CUDA_VISIBLE_DEVICES} (FSDP dp${TRAINER0_NPROC})" +echo "AstraFlow : ${ASTRAFLOW_URL}" +echo "RaaS : ${ASTRAFLOW_RAAS_URL}" +echo "Sender HTTP : ${WEIGHT_TRANSFER_HTTP_PORT}" +echo "WANDB mode : ${WANDB_MODE:-online}" +echo "==========================================" + +torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ + --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ + examples/launch_trainer.py \ + --config "${EXPERIMENT_CONFIG}" \ + --trainer trainer_model0 \ + "$@" 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/math/spawn/qwen3-8b-spawn/scripts/run_qwen3-8b-spawn.sh b/examples/math/spawn/qwen3-8b-spawn/scripts/run_qwen3-8b-spawn.sh new file mode 100755 index 0000000..489a928 --- /dev/null +++ b/examples/math/spawn/qwen3-8b-spawn/scripts/run_qwen3-8b-spawn.sh @@ -0,0 +1,113 @@ +#!/bin/bash +set -euo pipefail +# All-in-one launcher for AstraFlow v2 math training with the SPAWN +# sub-agents workflow (Qwen3-8B, M2PO, TCP, offline data). +# +# The rollout/eval workflow is spawn_rlvr: the main agent may emit a single +# {"tasks": [...]} block per trajectory; up to 4 sub-agents +# run in parallel against the same RaaS pool; their outputs are spliced +# back into the main context. All N+1 sequences share the team reward. +# +# Launches 3 processes: +# 1. AstraFlow HTTP service (CPU-only) — loads datasets from data-data/math +# 2. RaaS inference server (SGLang, SERVICE_CUDA_VISIBLE_DEVICES) +# 3. Trainer model0 (math, TRAINER_MODEL0_GPUS) +# +# One-time prep (downloads ~hundreds of MB): +# python examples/math/offline/download_math_datasets.py --root data-data/math +# +# Usage: +# bash examples/math/spawn/qwen3-8b-spawn/scripts/run_qwen3-8b-spawn.sh + +# ============================================================================= +# Part 1: Load env and settings +# ============================================================================= +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +# Defined in examples/_common/utils.sh. +astraflow_load_experiment_env + +# ============================================================================= +# Part 2: Set up env +# ============================================================================= +# GPU assignments (default: 4 GPUs for inference, 4 for training) +export SERVICE_CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" +export TRAINER_MODEL0_GPUS="${TRAINER_MODEL0_GPUS:-4,5,6,7}" +# Ports / URLs (each component gets its own port) +export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" +export WEIGHT_TRANSFER_HTTP_PORT_MODEL0="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" + +TRAINER0_NPROC="$(echo "${TRAINER_MODEL0_GPUS}" | awk -F',' '{print NF}')" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. +# Defined in examples/_common/utils.sh. +astraflow_setup_env + +# ============================================================================= +# Part 3: Print info and clean up +# ============================================================================= +echo "=== AstraFlow v2 (Qwen3-8B, math, M2PO, ctx16k, TCP, SPAWN sub-agents) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "RaaS config : ${RAAS_CONFIG}" +echo "RaaS GPUs : ${SERVICE_CUDA_VISIBLE_DEVICES}" +echo "Trainer model0 GPUs : ${TRAINER_MODEL0_GPUS} (FSDP dp${TRAINER0_NPROC})" +echo "RaaS port : ${RAAS_PORT}" +echo "AstraFlow port : ${ASTRAFLOW_PORT}" +echo "Sender HTTP model0 : ${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" +echo "WANDB mode : ${WANDB_MODE:-online}" +echo "==========================================================" + +trap astraflow_cleanup_trap EXIT INT TERM + +# Kill leftover processes and shared memory from prior runs. +# Defined in examples/_common/utils.sh. +astraflow_kill_stale + +# ============================================================================= +# Part 4: Launch training +# ============================================================================= +echo "[1/3] Starting AstraFlow HTTP service..." +CUDA_VISIBLE_DEVICES="" \ + python3 -u -m astraflow \ + --config "${EXPERIMENT_CONFIG}" \ + --port "${ASTRAFLOW_PORT}" \ + --host "${ASTRAFLOW_HOST}" \ + 2>&1 | tee "${LOG_DIR}/astraflow.log" & +sleep 5 + +echo "[2/3] Starting RaaS inference server (SGLang + TCP receiver)..." +CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES}" \ + python3 -u -m astraflow.raas.server \ + --host "${RAAS_HOST}" \ + --port "${RAAS_PORT}" \ + --config "${EXPERIMENT_CONFIG}" \ + --config "${RAAS_CONFIG}" \ + --engine-id "${ENGINE_ID:-default}" \ + --astraflow-url "${ASTRAFLOW_URL}" \ + 2>&1 | tee "${LOG_DIR}/raas.log" & +sleep 15 + +export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" + +echo "[3/3] Starting trainer model0..." +CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS}" \ +WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" \ + torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ + --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ + examples/launch_trainer.py \ + --config "${EXPERIMENT_CONFIG}" \ + --trainer trainer_model0 \ + "$@" \ + 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/math/spawn/qwen3-8b-spawn/yaml/experiment.yaml b/examples/math/spawn/qwen3-8b-spawn/yaml/experiment.yaml new file mode 100644 index 0000000..44dc10a --- /dev/null +++ b/examples/math/spawn/qwen3-8b-spawn/yaml/experiment.yaml @@ -0,0 +1,198 @@ +# ============================================================================ +# Experiment config — AstraFlow service + Trainer (SPAWN sub-agents workflow) +# Experiment: math / qwen3-8b-spawn +# +# Built on the offline math recipe. The only differences from +# qwen3-8b-m2po-full-offline are: +# - workflow_cls: spawn_rlvr (rollout + eval) +# - reduced max_new_tokens so phase-1 + aggregated sub-results + phase-2 +# fit inside the 16k SGLang context: main 3000, sub-agents 1500 each +# (so max aggregated injection is 4 * 1500 = 6000 tokens). +# +# Sub-agent training scheme: each spawn-using trajectory emits 1 main + N +# sub-agent sequences sharing the team math_verify reward. See +# astraflow/core/workflow/impl/spawn.py for the contract. +# +# Pre-download datasets with: +# python examples/math/offline/download_math_datasets.py --root data-data/math +# +# GPU layout (default, 8 GPUs): +# SERVICE_CUDA_VISIBLE_DEVICES=0,1,2,3 -> RaaS (model0 dp=4) +# TRAINER_MODEL0_GPUS=4,5,6,7 -> Trainer model0 (FSDP, 4 GPUs) +# ============================================================================ + +# ── Experiment: identity, model, shared settings ── +experiment: + experiment_name: astraflow-math + trial_name: qwen3-8b-spawn + fileroot: ./data-experiments/${experiment.experiment_name}/${experiment.trial_name} + + model_path: "Qwen/Qwen3-8B" + tokenizer_path: "Qwen/Qwen3-8B" + seed: 1 + dtype: bfloat16 + weight_transfer_mode: tcp + weight_transfer_strategies: full + +# ── RaaS: what to generate (inference-level config) ── +# model keys here also determine expected_model_ids for AstraFlow service +raas: + models: + model0: + backend: sglang + gconfig: + n_samples: 8 + temperature: 1.0 + # 3000 keeps phase-1 + agg block (up to 4*1500) + phase-2 under 16k. + max_new_tokens: 3000 + min_new_tokens: 0 + +# ── AstraFlow: data pipeline ── +# auto-derives: expected_model_ids from raas.models keys +# auto-derives: dump_dir from experiment.fileroot +dataflow: + host: "0.0.0.0" + port: 8000 + + # Offline mode: every rollout/eval dataset that omits ``offline_dir`` will + # auto-derive one as ``{data_root}/{name}`` — e.g. data-data/math/deepscaler, + # data-data/math/aime24, etc. Populate with + # ``python examples/math/offline/download_math_datasets.py --root data-data/math``. + # Resolved relative to the process CWD (repo root, set by the launch scripts). + data_root: data-data/math + + # Rollout dump dir for spawn-workflow sanity checking. The dataflow + # loader substitutes ${experiment.*} placeholders and propagates this + # into workflow_spec.dump_dir. Combined with workflow_spec.dump_prob + # below, every K-th rollout is dumped as decoded text under + # ``{dump_dir}/{version}/{qid}.txt`` (phase-1 + per-sub-agent + phase-2). + dump_dir: "./data-experiments/${experiment.experiment_name}/${experiment.trial_name}/rollout_dumps" + + buffer: + size: 10000 + replay_size: 10000 + replay_ratio: 0 + max_staleness: 8 + filter_function: filter_zero_adv + + rollout_dataset: + dataset_fn: "astraflow.dataflow.dataset.deepscaler:get_deepscaler_rl_dataset" + max_length: 2000 + + workflow_spec: + workflow_cls: "spawn_rlvr" + reward_fn: "math_verify" + enable_thinking: false + max_sub_agents: 4 + sub_agent_max_new_tokens: 1500 + # Sampling rate for rollout dumps (full trajectories with phase-1, + # per-sub-agent tasks/outputs, and phase-2 decoded text). Bump to + # 1.0 when bring-up debugging; lower for multi-hundred-step runs to + # avoid disk churn. + dump_prob: 0.05 + + eval_workflows: + math_eval: + workflow_cls: "spawn_rlvr" + reward_fn: "math_verify" + enable_thinking: false + max_sub_agents: 4 + sub_agent_max_new_tokens: 1500 + # Eval rollouts dumped at 1% so a handful of eval trajectories + # land per epoch without flooding the eval phase. + dump_prob: 0.01 + gconfig_overrides: + temperature: 0.6 + n_samples: 1 + + eval_datasets: + aime24: + dataset_fn: "astraflow.dataflow.dataset.aime24x4:get_aime_2024x4_test_dataset" + max_length: 2000 + repeat: 4 + eval_workflow: math_eval + aime25: + dataset_fn: "astraflow.dataflow.dataset.aime25x4:get_aime_2025x4_test_dataset" + max_length: 2000 + repeat: 4 + eval_workflow: math_eval + amc: + dataset_fn: "astraflow.dataflow.dataset.amc24:get_amc_2024x4_test_dataset" + max_length: 2000 + repeat: 4 + eval_workflow: math_eval + minerva: + dataset_fn: "astraflow.dataflow.dataset.minervamath:get_minerva_math_test_dataset" + max_length: 2000 + repeat: 4 + eval_workflow: math_eval + math500: + dataset_fn: "astraflow.dataflow.dataset.math500:get_math500_test_dataset" + max_length: 2000 + repeat: 4 + eval_workflow: math_eval + +# ── Trainer base: shared config ── +# auto-derives from experiment: experiment_name, trial_name, fileroot, +# tokenizer_path, seed, dtype, weight_transfer_mode +# auto-derives from raas.models.: actor.path, actor.max_new_tokens, +# ref.path +# auto-derives: saver, recover, stats_logger fields from experiment section +# auto-derives: cluster.name_resolve from experiment.fileroot +# auto-derives: trial_name suffix from model_id (e.g. trial_name-model0) +trainer_base: + total_train_steps: 800 + train_batch_size: 256 + n_samples: 8 + engine: + backend: fsdp + data_parallel_size: 4 + + actor: + gradient_checkpointing: true + mb_spec: + max_tokens_per_mb: 17408 + optimizer: + type: adam + lr: 5e-6 + weight_decay: 0.01 + beta1: 0.9 + beta2: 0.999 + eps: 1e-8 + lr_scheduler_type: constant + gradient_clipping: 1.0 + # PPO / M2PO algorithm + m2_threshold: 0.01 + eps_clip: 100.0 + eps_clip_higher: 100.0 + reward_scaling: 1 + reward_bias: 0 + kl_ctl: 0.00 + kl_penalty_coef: 0.001 + ppo_n_minibatches: 4 + reward_norm: { mean_level: group, std_level: group } + adv_norm: { mean_level: batch, std_level: batch } + + ref: + mb_spec: + max_tokens_per_mb: 17408 + + recover: + mode: auto + freq_steps: 25 + + evaluator: + eval_at_start: false + freq_steps: 25 + + stats_logger: + wandb: + mode: online + id_suffix: "uid" + +# ── Trainer for model0 — only overrides ── +trainer_model0: + model_id: model0 + stats_logger: + wandb: + tags: ["m2po", "math", "astraflow-v2", "qwen3-8b", "tcp", "ctx16k", "offline-data", "spawn"] diff --git a/examples/math/spawn/qwen3-8b-spawn/yaml/raas.yaml b/examples/math/spawn/qwen3-8b-spawn/yaml/raas.yaml new file mode 100644 index 0000000..8a5dbe3 --- /dev/null +++ b/examples/math/spawn/qwen3-8b-spawn/yaml/raas.yaml @@ -0,0 +1,33 @@ +# ============================================================================ +# RaaS config — Inference serving instance (hardware/resources) +# Experiment: math / qwen3-8b-m2po-full +# +# Hardware: 4x GPU, TP=1 +# model0: DP=4, TP=1 +# +# Merged with experiment.yaml at launch (--config experiment.yaml --config raas.yaml) +# experiment.yaml provides: model_path, tokenizer_path, seed, dtype, models/gconfig +# ============================================================================ + +rollout: + max_concurrent_rollouts: 1024 + # Cap concurrent eval prefills to bound peak KV pressure during the + # ~3.5k-item eval burst (5 datasets x repeat=4) — default 128 OOMs sglang. + max_concurrent_evals: 64 + pause_grace_period: 3 + # Adaptive availability — drive /availability off sglang /get_load. + enable_adaptive_availability: true + target_waiting_queue_per_dp: 4 + adaptive_step_size: 4 + load_cache_ttl_ms: 100 + +engine: + model0: + backend: sglang + data_parallel_size: 4 + +sglang: + context_length: 16384 + mem_fraction_static: 0.8 + max_running_requests: null + skip_tokenizer_init: true From 9b49df6e196294bcacba5baa04d79a1096d07598 Mon Sep 17 00:00:00 2001 From: Haizhong Date: Wed, 27 May 2026 00:27:27 -0400 Subject: [PATCH 12/35] feat: add TextCraft recursive-agent workflow + Qwen3-4B recipe Port of platoon's TextCraft RL setup. Adds a new workflow class `recursive_agent` that lets a root agent spawn 1-4 sub-agents in parallel via asyncio.gather, each inheriting the parent's inventory by reference. Trees are bounded by max_depth=3, max_breadth=4. - workflow.py: ParsedAction dispatcher (get_info / view_inventory / craft / spawn / finish), per-agent BudgetTracker, trajectory dump format with full message logs for debugging. - env.py: stateful TextCraftEnv with forkable inventory aliasing (sub-agents and root share one mutable dict); binary all-or-nothing evaluate() against task.misc["target_items"]. - recipe_loader.py + recipes/: bundled Minecraft recipe DB (~860 recipes) so no HF download is needed. - tasks.py + bundled textcraft_{train,val}.jsonl: 1000 train / 100 val tasks synthesized from the recipe DB; deterministic seed. - dataflow/dataset/textcraft.py: dataset loaders for RL training and eval splits. - reward/textcraft_success.py: stub registered for parity; actual reward comes from env.evaluate(). - examples/textcraft/qwen3-4b-recursive/: full recipe (yaml + scripts) for Qwen3-4B-Instruct-2507 with M2PO, FSDP, SGLang, ctx32k, TCP weight transfer. - docs/recipes/textcraft-recursive.md: design overview. Also ignores claude-doc/ in .gitignore. --- .gitignore | 1 + astraflow/core/workflow/__init__.py | 2 + .../core/workflow/impl/textcraft/__init__.py | 12 + astraflow/core/workflow/impl/textcraft/env.py | 267 +++++ .../workflow/impl/textcraft/recipe_loader.py | 297 +++++ .../impl/textcraft/recipes/acacia_boat.json | 16 + .../impl/textcraft/recipes/acacia_button.json | 12 + .../impl/textcraft/recipes/acacia_door.json | 18 + .../impl/textcraft/recipes/acacia_fence.json | 20 + .../textcraft/recipes/acacia_fence_gate.json | 19 + .../impl/textcraft/recipes/acacia_planks.json | 13 + .../recipes/acacia_pressure_plate.json | 15 + .../impl/textcraft/recipes/acacia_sign.json | 21 + .../impl/textcraft/recipes/acacia_slab.json | 16 + .../impl/textcraft/recipes/acacia_stairs.json | 18 + .../textcraft/recipes/acacia_trapdoor.json | 17 + .../impl/textcraft/recipes/acacia_wood.json | 17 + .../textcraft/recipes/activator_rail.json | 23 + .../impl/textcraft/recipes/andesite.json | 15 + .../impl/textcraft/recipes/andesite_slab.json | 15 + ...esite_slab_from_andesite_stonecutting.json | 8 + .../textcraft/recipes/andesite_stairs.json | 17 + ...ite_stairs_from_andesite_stonecutting.json | 8 + .../impl/textcraft/recipes/andesite_wall.json | 16 + ...esite_wall_from_andesite_stonecutting.json | 8 + .../impl/textcraft/recipes/anvil.json | 19 + .../impl/textcraft/recipes/armor_dye.json | 3 + .../impl/textcraft/recipes/armor_stand.json | 19 + .../impl/textcraft/recipes/arrow.json | 23 + .../impl/textcraft/recipes/baked_potato.json | 9 + .../baked_potato_from_campfire_cooking.json | 9 + .../recipes/baked_potato_from_smoking.json | 9 + .../textcraft/recipes/banner_duplicate.json | 3 + .../impl/textcraft/recipes/barrel.json | 19 + .../impl/textcraft/recipes/beacon.json | 22 + .../impl/textcraft/recipes/beehive.json | 19 + .../impl/textcraft/recipes/beetroot_soup.json | 29 + .../impl/textcraft/recipes/birch_boat.json | 16 + .../impl/textcraft/recipes/birch_button.json | 12 + .../impl/textcraft/recipes/birch_door.json | 18 + .../impl/textcraft/recipes/birch_fence.json | 20 + .../textcraft/recipes/birch_fence_gate.json | 19 + .../impl/textcraft/recipes/birch_planks.json | 13 + .../recipes/birch_pressure_plate.json | 15 + .../impl/textcraft/recipes/birch_sign.json | 21 + .../impl/textcraft/recipes/birch_slab.json | 16 + .../impl/textcraft/recipes/birch_stairs.json | 18 + .../textcraft/recipes/birch_trapdoor.json | 17 + .../impl/textcraft/recipes/birch_wood.json | 17 + .../impl/textcraft/recipes/black_banner.json | 20 + .../impl/textcraft/recipes/black_bed.json | 19 + .../recipes/black_bed_from_white_bed.json | 15 + .../impl/textcraft/recipes/black_carpet.json | 16 + .../black_carpet_from_white_carpet.json | 21 + .../recipes/black_concrete_powder.json | 37 + .../impl/textcraft/recipes/black_dye.json | 12 + .../recipes/black_dye_from_wither_rose.json | 12 + .../recipes/black_glazed_terracotta.json | 9 + .../recipes/black_stained_glass.json | 21 + .../recipes/black_stained_glass_pane.json | 17 + ...ck_stained_glass_pane_from_glass_pane.json | 21 + .../textcraft/recipes/black_terracotta.json | 21 + .../impl/textcraft/recipes/black_wool.json | 15 + .../textcraft/recipes/blackstone_slab.json | 15 + ...one_slab_from_blackstone_stonecutting.json | 8 + .../textcraft/recipes/blackstone_stairs.json | 17 + ...e_stairs_from_blackstone_stonecutting.json | 8 + .../textcraft/recipes/blackstone_wall.json | 16 + ...one_wall_from_blackstone_stonecutting.json | 8 + .../impl/textcraft/recipes/blast_furnace.json | 22 + .../impl/textcraft/recipes/blaze_powder.json | 12 + .../impl/textcraft/recipes/blue_banner.json | 20 + .../impl/textcraft/recipes/blue_bed.json | 19 + .../recipes/blue_bed_from_white_bed.json | 15 + .../impl/textcraft/recipes/blue_carpet.json | 16 + .../blue_carpet_from_white_carpet.json | 21 + .../recipes/blue_concrete_powder.json | 37 + .../impl/textcraft/recipes/blue_dye.json | 12 + .../recipes/blue_dye_from_cornflower.json | 12 + .../recipes/blue_glazed_terracotta.json | 9 + .../impl/textcraft/recipes/blue_ice.json | 16 + .../textcraft/recipes/blue_stained_glass.json | 21 + .../recipes/blue_stained_glass_pane.json | 17 + ...ue_stained_glass_pane_from_glass_pane.json | 21 + .../textcraft/recipes/blue_terracotta.json | 21 + .../impl/textcraft/recipes/blue_wool.json | 15 + .../impl/textcraft/recipes/bone_block.json | 16 + .../impl/textcraft/recipes/bone_meal.json | 13 + .../recipes/bone_meal_from_bone_block.json | 13 + .../workflow/impl/textcraft/recipes/book.json | 20 + .../impl/textcraft/recipes/book_cloning.json | 3 + .../impl/textcraft/recipes/bookshelf.json | 19 + .../workflow/impl/textcraft/recipes/bow.json | 19 + .../workflow/impl/textcraft/recipes/bowl.json | 16 + .../impl/textcraft/recipes/bread.json | 14 + .../impl/textcraft/recipes/brewing_stand.json | 18 + .../impl/textcraft/recipes/brick.json | 9 + .../impl/textcraft/recipes/brick_slab.json | 15 + .../brick_slab_from_bricks_stonecutting.json | 8 + .../impl/textcraft/recipes/brick_stairs.json | 17 + ...brick_stairs_from_bricks_stonecutting.json | 8 + .../impl/textcraft/recipes/brick_wall.json | 16 + .../brick_wall_from_bricks_stonecutting.json | 8 + .../impl/textcraft/recipes/bricks.json | 15 + .../impl/textcraft/recipes/brown_banner.json | 20 + .../impl/textcraft/recipes/brown_bed.json | 19 + .../recipes/brown_bed_from_white_bed.json | 15 + .../impl/textcraft/recipes/brown_carpet.json | 16 + .../brown_carpet_from_white_carpet.json | 21 + .../recipes/brown_concrete_powder.json | 37 + .../impl/textcraft/recipes/brown_dye.json | 12 + .../recipes/brown_glazed_terracotta.json | 9 + .../recipes/brown_stained_glass.json | 21 + .../recipes/brown_stained_glass_pane.json | 17 + ...wn_stained_glass_pane_from_glass_pane.json | 21 + .../textcraft/recipes/brown_terracotta.json | 21 + .../impl/textcraft/recipes/brown_wool.json | 15 + .../impl/textcraft/recipes/bucket.json | 15 + .../workflow/impl/textcraft/recipes/cake.json | 25 + .../impl/textcraft/recipes/campfire.json | 22 + .../textcraft/recipes/carrot_on_a_stick.json | 18 + .../textcraft/recipes/cartography_table.json | 19 + .../impl/textcraft/recipes/cauldron.json | 16 + .../impl/textcraft/recipes/chain.json | 19 + .../impl/textcraft/recipes/charcoal.json | 9 + .../impl/textcraft/recipes/chest.json | 16 + .../textcraft/recipes/chest_minecart.json | 18 + .../recipes/chiseled_nether_bricks.json | 15 + ...ricks_from_nether_bricks_stonecutting.json | 8 + .../recipes/chiseled_polished_blackstone.json | 15 + ...ackstone_from_blackstone_stonecutting.json | 8 + ...from_polished_blackstone_stonecutting.json | 8 + .../recipes/chiseled_quartz_block.json | 15 + ..._block_from_quartz_block_stonecutting.json | 8 + .../recipes/chiseled_red_sandstone.json | 15 + ...stone_from_red_sandstone_stonecutting.json | 8 + .../textcraft/recipes/chiseled_sandstone.json | 15 + ...sandstone_from_sandstone_stonecutting.json | 8 + .../recipes/chiseled_stone_bricks.json | 15 + ...bricks_from_stone_bricks_stonecutting.json | 8 + ..._stone_bricks_stone_from_stonecutting.json | 8 + .../workflow/impl/textcraft/recipes/clay.json | 15 + .../impl/textcraft/recipes/clock.json | 19 + .../workflow/impl/textcraft/recipes/coal.json | 12 + .../impl/textcraft/recipes/coal_block.json | 16 + .../textcraft/recipes/coal_from_blasting.json | 9 + .../textcraft/recipes/coal_from_smelting.json | 9 + .../impl/textcraft/recipes/coarse_dirt.json | 19 + .../textcraft/recipes/cobblestone_slab.json | 15 + ...ne_slab_from_cobblestone_stonecutting.json | 8 + .../textcraft/recipes/cobblestone_stairs.json | 17 + ..._stairs_from_cobblestone_stonecutting.json | 8 + .../textcraft/recipes/cobblestone_wall.json | 16 + ...ne_wall_from_cobblestone_stonecutting.json | 8 + .../impl/textcraft/recipes/comparator.json | 22 + .../impl/textcraft/recipes/compass.json | 19 + .../impl/textcraft/recipes/composter.json | 16 + .../impl/textcraft/recipes/conduit.json | 19 + .../impl/textcraft/recipes/cooked_beef.json | 9 + .../cooked_beef_from_campfire_cooking.json | 9 + .../recipes/cooked_beef_from_smoking.json | 9 + .../textcraft/recipes/cooked_chicken.json | 9 + .../cooked_chicken_from_campfire_cooking.json | 9 + .../recipes/cooked_chicken_from_smoking.json | 9 + .../impl/textcraft/recipes/cooked_cod.json | 9 + .../cooked_cod_from_campfire_cooking.json | 9 + .../recipes/cooked_cod_from_smoking.json | 9 + .../impl/textcraft/recipes/cooked_mutton.json | 9 + .../cooked_mutton_from_campfire_cooking.json | 9 + .../recipes/cooked_mutton_from_smoking.json | 9 + .../textcraft/recipes/cooked_porkchop.json | 9 + ...cooked_porkchop_from_campfire_cooking.json | 9 + .../recipes/cooked_porkchop_from_smoking.json | 9 + .../impl/textcraft/recipes/cooked_rabbit.json | 9 + .../cooked_rabbit_from_campfire_cooking.json | 9 + .../recipes/cooked_rabbit_from_smoking.json | 9 + .../impl/textcraft/recipes/cooked_salmon.json | 9 + .../cooked_salmon_from_campfire_cooking.json | 9 + .../recipes/cooked_salmon_from_smoking.json | 9 + .../impl/textcraft/recipes/cookie.json | 18 + .../recipes/cracked_nether_bricks.json | 9 + .../cracked_polished_blackstone_bricks.json | 9 + .../recipes/cracked_stone_bricks.json | 9 + .../textcraft/recipes/crafting_table.json | 15 + .../recipes/creeper_banner_pattern.json | 14 + .../textcraft/recipes/crimson_button.json | 12 + .../impl/textcraft/recipes/crimson_door.json | 18 + .../impl/textcraft/recipes/crimson_fence.json | 20 + .../textcraft/recipes/crimson_fence_gate.json | 19 + .../textcraft/recipes/crimson_hyphae.json | 17 + .../textcraft/recipes/crimson_planks.json | 13 + .../recipes/crimson_pressure_plate.json | 15 + .../impl/textcraft/recipes/crimson_sign.json | 21 + .../impl/textcraft/recipes/crimson_slab.json | 16 + .../textcraft/recipes/crimson_stairs.json | 18 + .../textcraft/recipes/crimson_trapdoor.json | 17 + .../impl/textcraft/recipes/crossbow.json | 25 + .../textcraft/recipes/cut_red_sandstone.json | 16 + ...stone_from_red_sandstone_stonecutting.json | 8 + .../recipes/cut_red_sandstone_slab.json | 15 + ...b_from_cut_red_sandstone_stonecutting.json | 8 + ..._slab_from_red_sandstone_stonecutting.json | 8 + .../impl/textcraft/recipes/cut_sandstone.json | 16 + ...sandstone_from_sandstone_stonecutting.json | 8 + .../textcraft/recipes/cut_sandstone_slab.json | 15 + ..._slab_from_cut_sandstone_stonecutting.json | 8 + ...tone_slab_from_sandstone_stonecutting.json | 8 + .../impl/textcraft/recipes/cyan_banner.json | 20 + .../impl/textcraft/recipes/cyan_bed.json | 19 + .../recipes/cyan_bed_from_white_bed.json | 15 + .../impl/textcraft/recipes/cyan_carpet.json | 16 + .../cyan_carpet_from_white_carpet.json | 21 + .../recipes/cyan_concrete_powder.json | 37 + .../impl/textcraft/recipes/cyan_dye.json | 15 + .../recipes/cyan_glazed_terracotta.json | 9 + .../textcraft/recipes/cyan_stained_glass.json | 21 + .../recipes/cyan_stained_glass_pane.json | 17 + ...an_stained_glass_pane_from_glass_pane.json | 21 + .../textcraft/recipes/cyan_terracotta.json | 21 + .../impl/textcraft/recipes/cyan_wool.json | 15 + .../impl/textcraft/recipes/dark_oak_boat.json | 16 + .../textcraft/recipes/dark_oak_button.json | 12 + .../impl/textcraft/recipes/dark_oak_door.json | 18 + .../textcraft/recipes/dark_oak_fence.json | 20 + .../recipes/dark_oak_fence_gate.json | 19 + .../textcraft/recipes/dark_oak_planks.json | 13 + .../recipes/dark_oak_pressure_plate.json | 15 + .../impl/textcraft/recipes/dark_oak_sign.json | 21 + .../impl/textcraft/recipes/dark_oak_slab.json | 16 + .../textcraft/recipes/dark_oak_stairs.json | 18 + .../textcraft/recipes/dark_oak_trapdoor.json | 17 + .../impl/textcraft/recipes/dark_oak_wood.json | 17 + .../textcraft/recipes/dark_prismarine.json | 19 + .../recipes/dark_prismarine_slab.json | 15 + ...lab_from_dark_prismarine_stonecutting.json | 8 + .../recipes/dark_prismarine_stairs.json | 17 + ...irs_from_dark_prismarine_stonecutting.json | 8 + .../textcraft/recipes/daylight_detector.json | 22 + .../impl/textcraft/recipes/detector_rail.json | 23 + .../impl/textcraft/recipes/diamond.json | 12 + .../impl/textcraft/recipes/diamond_axe.json | 19 + .../impl/textcraft/recipes/diamond_block.json | 16 + .../impl/textcraft/recipes/diamond_boots.json | 15 + .../textcraft/recipes/diamond_chestplate.json | 16 + .../recipes/diamond_from_blasting.json | 9 + .../recipes/diamond_from_smelting.json | 9 + .../textcraft/recipes/diamond_helmet.json | 15 + .../impl/textcraft/recipes/diamond_hoe.json | 19 + .../textcraft/recipes/diamond_leggings.json | 16 + .../textcraft/recipes/diamond_pickaxe.json | 19 + .../textcraft/recipes/diamond_shovel.json | 19 + .../impl/textcraft/recipes/diamond_sword.json | 19 + .../impl/textcraft/recipes/diorite.json | 19 + .../impl/textcraft/recipes/diorite_slab.json | 15 + ...iorite_slab_from_diorite_stonecutting.json | 8 + .../textcraft/recipes/diorite_stairs.json | 17 + ...rite_stairs_from_diorite_stonecutting.json | 8 + .../impl/textcraft/recipes/diorite_wall.json | 16 + ...iorite_wall_from_diorite_stonecutting.json | 8 + .../impl/textcraft/recipes/dispenser.json | 22 + .../impl/textcraft/recipes/dried_kelp.json | 12 + .../textcraft/recipes/dried_kelp_block.json | 35 + .../dried_kelp_from_campfire_cooking.json | 9 + .../recipes/dried_kelp_from_smelting.json | 9 + .../recipes/dried_kelp_from_smoking.json | 9 + .../impl/textcraft/recipes/dropper.json | 19 + .../impl/textcraft/recipes/emerald.json | 12 + .../impl/textcraft/recipes/emerald_block.json | 16 + .../recipes/emerald_from_blasting.json | 9 + .../recipes/emerald_from_smelting.json | 9 + .../textcraft/recipes/enchanting_table.json | 22 + .../impl/textcraft/recipes/end_crystal.json | 22 + .../impl/textcraft/recipes/end_rod.json | 19 + .../recipes/end_stone_brick_slab.json | 15 + ...lab_from_end_stone_brick_stonecutting.json | 8 + ...rick_slab_from_end_stone_stonecutting.json | 8 + .../recipes/end_stone_brick_stairs.json | 17 + ...irs_from_end_stone_brick_stonecutting.json | 8 + ...ck_stairs_from_end_stone_stonecutting.json | 8 + .../recipes/end_stone_brick_wall.json | 16 + ...all_from_end_stone_brick_stonecutting.json | 8 + ...rick_wall_from_end_stone_stonecutting.json | 8 + .../textcraft/recipes/end_stone_bricks.json | 16 + ...ne_bricks_from_end_stone_stonecutting.json | 8 + .../impl/textcraft/recipes/ender_chest.json | 19 + .../impl/textcraft/recipes/ender_eye.json | 14 + .../recipes/fermented_spider_eye.json | 17 + .../impl/textcraft/recipes/fire_charge.json | 23 + .../textcraft/recipes/firework_rocket.json | 3 + .../impl/textcraft/recipes/firework_star.json | 3 + .../textcraft/recipes/firework_star_fade.json | 3 + .../impl/textcraft/recipes/fishing_rod.json | 19 + .../textcraft/recipes/fletching_table.json | 19 + .../textcraft/recipes/flint_and_steel.json | 14 + .../recipes/flower_banner_pattern.json | 14 + .../impl/textcraft/recipes/flower_pot.json | 15 + .../impl/textcraft/recipes/furnace.json | 16 + .../textcraft/recipes/furnace_minecart.json | 18 + .../impl/textcraft/recipes/glass.json | 9 + .../impl/textcraft/recipes/glass_bottle.json | 16 + .../impl/textcraft/recipes/glass_pane.json | 16 + .../recipes/glistering_melon_slice.json | 19 + .../impl/textcraft/recipes/glowstone.json | 15 + .../impl/textcraft/recipes/gold_block.json | 16 + .../impl/textcraft/recipes/gold_ingot.json | 9 + .../recipes/gold_ingot_from_blasting.json | 9 + .../recipes/gold_ingot_from_gold_block.json | 13 + .../recipes/gold_ingot_from_nuggets.json | 17 + .../impl/textcraft/recipes/gold_nugget.json | 12 + .../recipes/gold_nugget_from_blasting.json | 38 + .../recipes/gold_nugget_from_smelting.json | 38 + .../impl/textcraft/recipes/golden_apple.json | 19 + .../impl/textcraft/recipes/golden_axe.json | 19 + .../impl/textcraft/recipes/golden_boots.json | 15 + .../impl/textcraft/recipes/golden_carrot.json | 19 + .../textcraft/recipes/golden_chestplate.json | 16 + .../impl/textcraft/recipes/golden_helmet.json | 15 + .../impl/textcraft/recipes/golden_hoe.json | 19 + .../textcraft/recipes/golden_leggings.json | 16 + .../textcraft/recipes/golden_pickaxe.json | 19 + .../impl/textcraft/recipes/golden_shovel.json | 19 + .../impl/textcraft/recipes/golden_sword.json | 19 + .../impl/textcraft/recipes/granite.json | 14 + .../impl/textcraft/recipes/granite_slab.json | 15 + ...ranite_slab_from_granite_stonecutting.json | 8 + .../textcraft/recipes/granite_stairs.json | 17 + ...nite_stairs_from_granite_stonecutting.json | 8 + .../impl/textcraft/recipes/granite_wall.json | 16 + ...ranite_wall_from_granite_stonecutting.json | 8 + .../impl/textcraft/recipes/gray_banner.json | 20 + .../impl/textcraft/recipes/gray_bed.json | 19 + .../recipes/gray_bed_from_white_bed.json | 15 + .../impl/textcraft/recipes/gray_carpet.json | 16 + .../gray_carpet_from_white_carpet.json | 21 + .../recipes/gray_concrete_powder.json | 37 + .../impl/textcraft/recipes/gray_dye.json | 15 + .../recipes/gray_glazed_terracotta.json | 9 + .../textcraft/recipes/gray_stained_glass.json | 21 + .../recipes/gray_stained_glass_pane.json | 17 + ...ay_stained_glass_pane_from_glass_pane.json | 21 + .../textcraft/recipes/gray_terracotta.json | 21 + .../impl/textcraft/recipes/gray_wool.json | 15 + .../impl/textcraft/recipes/green_banner.json | 20 + .../impl/textcraft/recipes/green_bed.json | 19 + .../recipes/green_bed_from_white_bed.json | 15 + .../impl/textcraft/recipes/green_carpet.json | 16 + .../green_carpet_from_white_carpet.json | 21 + .../recipes/green_concrete_powder.json | 37 + .../impl/textcraft/recipes/green_dye.json | 9 + .../recipes/green_glazed_terracotta.json | 9 + .../recipes/green_stained_glass.json | 21 + .../recipes/green_stained_glass_pane.json | 17 + ...en_stained_glass_pane_from_glass_pane.json | 21 + .../textcraft/recipes/green_terracotta.json | 21 + .../impl/textcraft/recipes/green_wool.json | 15 + .../impl/textcraft/recipes/grindstone.json | 21 + .../impl/textcraft/recipes/hay_block.json | 16 + .../heavy_weighted_pressure_plate.json | 14 + .../impl/textcraft/recipes/honey_block.json | 15 + .../impl/textcraft/recipes/honey_bottle.json | 24 + .../textcraft/recipes/honeycomb_block.json | 15 + .../impl/textcraft/recipes/hopper.json | 19 + .../textcraft/recipes/hopper_minecart.json | 18 + .../impl/textcraft/recipes/iron_axe.json | 19 + .../impl/textcraft/recipes/iron_bars.json | 16 + .../impl/textcraft/recipes/iron_block.json | 16 + .../impl/textcraft/recipes/iron_boots.json | 15 + .../textcraft/recipes/iron_chestplate.json | 16 + .../impl/textcraft/recipes/iron_door.json | 17 + .../impl/textcraft/recipes/iron_helmet.json | 15 + .../impl/textcraft/recipes/iron_hoe.json | 19 + .../impl/textcraft/recipes/iron_ingot.json | 9 + .../recipes/iron_ingot_from_blasting.json | 9 + .../recipes/iron_ingot_from_iron_block.json | 13 + .../recipes/iron_ingot_from_nuggets.json | 17 + .../impl/textcraft/recipes/iron_leggings.json | 16 + .../impl/textcraft/recipes/iron_nugget.json | 12 + .../recipes/iron_nugget_from_blasting.json | 50 + .../recipes/iron_nugget_from_smelting.json | 50 + .../impl/textcraft/recipes/iron_pickaxe.json | 19 + .../impl/textcraft/recipes/iron_shovel.json | 19 + .../impl/textcraft/recipes/iron_sword.json | 19 + .../impl/textcraft/recipes/iron_trapdoor.json | 15 + .../impl/textcraft/recipes/item_frame.json | 19 + .../textcraft/recipes/jack_o_lantern.json | 18 + .../impl/textcraft/recipes/jukebox.json | 19 + .../impl/textcraft/recipes/jungle_boat.json | 16 + .../impl/textcraft/recipes/jungle_button.json | 12 + .../impl/textcraft/recipes/jungle_door.json | 18 + .../impl/textcraft/recipes/jungle_fence.json | 20 + .../textcraft/recipes/jungle_fence_gate.json | 19 + .../impl/textcraft/recipes/jungle_planks.json | 13 + .../recipes/jungle_pressure_plate.json | 15 + .../impl/textcraft/recipes/jungle_sign.json | 21 + .../impl/textcraft/recipes/jungle_slab.json | 16 + .../impl/textcraft/recipes/jungle_stairs.json | 18 + .../textcraft/recipes/jungle_trapdoor.json | 17 + .../impl/textcraft/recipes/jungle_wood.json | 17 + .../impl/textcraft/recipes/ladder.json | 17 + .../impl/textcraft/recipes/lantern.json | 19 + .../impl/textcraft/recipes/lapis_block.json | 16 + .../recipes/lapis_from_blasting.json | 9 + .../recipes/lapis_from_smelting.json | 9 + .../impl/textcraft/recipes/lapis_lazuli.json | 12 + .../workflow/impl/textcraft/recipes/lead.json | 20 + .../impl/textcraft/recipes/leather.json | 15 + .../impl/textcraft/recipes/leather_boots.json | 15 + .../textcraft/recipes/leather_chestplate.json | 16 + .../textcraft/recipes/leather_helmet.json | 15 + .../recipes/leather_horse_armor.json | 16 + .../textcraft/recipes/leather_leggings.json | 16 + .../impl/textcraft/recipes/lectern.json | 19 + .../impl/textcraft/recipes/lever.json | 18 + .../textcraft/recipes/light_blue_banner.json | 20 + .../textcraft/recipes/light_blue_bed.json | 19 + .../light_blue_bed_from_white_bed.json | 15 + .../textcraft/recipes/light_blue_carpet.json | 16 + .../light_blue_carpet_from_white_carpet.json | 21 + .../recipes/light_blue_concrete_powder.json | 37 + .../light_blue_dye_from_blue_orchid.json | 12 + .../light_blue_dye_from_blue_white_dye.json | 16 + .../recipes/light_blue_glazed_terracotta.json | 9 + .../recipes/light_blue_stained_glass.json | 21 + .../light_blue_stained_glass_pane.json | 17 + ...ue_stained_glass_pane_from_glass_pane.json | 21 + .../recipes/light_blue_terracotta.json | 21 + .../textcraft/recipes/light_blue_wool.json | 15 + .../textcraft/recipes/light_gray_banner.json | 20 + .../textcraft/recipes/light_gray_bed.json | 19 + .../light_gray_bed_from_white_bed.json | 15 + .../textcraft/recipes/light_gray_carpet.json | 16 + .../light_gray_carpet_from_white_carpet.json | 21 + .../recipes/light_gray_concrete_powder.json | 37 + .../light_gray_dye_from_azure_bluet.json | 12 + .../light_gray_dye_from_black_white_dye.json | 19 + .../light_gray_dye_from_gray_white_dye.json | 16 + .../light_gray_dye_from_oxeye_daisy.json | 12 + .../light_gray_dye_from_white_tulip.json | 12 + .../recipes/light_gray_glazed_terracotta.json | 9 + .../recipes/light_gray_stained_glass.json | 21 + .../light_gray_stained_glass_pane.json | 17 + ...ay_stained_glass_pane_from_glass_pane.json | 21 + .../recipes/light_gray_terracotta.json | 21 + .../textcraft/recipes/light_gray_wool.json | 15 + .../light_weighted_pressure_plate.json | 14 + .../impl/textcraft/recipes/lime_banner.json | 20 + .../impl/textcraft/recipes/lime_bed.json | 19 + .../recipes/lime_bed_from_white_bed.json | 15 + .../impl/textcraft/recipes/lime_carpet.json | 16 + .../lime_carpet_from_white_carpet.json | 21 + .../recipes/lime_concrete_powder.json | 37 + .../impl/textcraft/recipes/lime_dye.json | 15 + .../recipes/lime_dye_from_smelting.json | 9 + .../recipes/lime_glazed_terracotta.json | 9 + .../textcraft/recipes/lime_stained_glass.json | 21 + .../recipes/lime_stained_glass_pane.json | 17 + ...me_stained_glass_pane_from_glass_pane.json | 21 + .../textcraft/recipes/lime_terracotta.json | 21 + .../impl/textcraft/recipes/lime_wool.json | 15 + .../impl/textcraft/recipes/lodestone.json | 19 + .../workflow/impl/textcraft/recipes/loom.json | 18 + .../textcraft/recipes/magenta_banner.json | 20 + .../impl/textcraft/recipes/magenta_bed.json | 19 + .../recipes/magenta_bed_from_white_bed.json | 15 + .../textcraft/recipes/magenta_carpet.json | 16 + .../magenta_carpet_from_white_carpet.json | 21 + .../recipes/magenta_concrete_powder.json | 37 + .../recipes/magenta_dye_from_allium.json | 12 + .../magenta_dye_from_blue_red_pink.json | 19 + .../magenta_dye_from_blue_red_white_dye.json | 22 + .../recipes/magenta_dye_from_lilac.json | 13 + .../magenta_dye_from_purple_and_pink.json | 16 + .../recipes/magenta_glazed_terracotta.json | 9 + .../recipes/magenta_stained_glass.json | 21 + .../recipes/magenta_stained_glass_pane.json | 17 + ...ta_stained_glass_pane_from_glass_pane.json | 21 + .../textcraft/recipes/magenta_terracotta.json | 21 + .../impl/textcraft/recipes/magenta_wool.json | 15 + .../impl/textcraft/recipes/magma_block.json | 15 + .../impl/textcraft/recipes/magma_cream.json | 14 + .../workflow/impl/textcraft/recipes/map.json | 19 + .../impl/textcraft/recipes/map_cloning.json | 3 + .../impl/textcraft/recipes/map_extending.json | 3 + .../impl/textcraft/recipes/melon.json | 16 + .../impl/textcraft/recipes/melon_seeds.json | 11 + .../impl/textcraft/recipes/minecart.json | 15 + .../recipes/mojang_banner_pattern.json | 14 + .../textcraft/recipes/mossy_cobblestone.json | 14 + .../recipes/mossy_cobblestone_slab.json | 15 + ...b_from_mossy_cobblestone_stonecutting.json | 8 + .../recipes/mossy_cobblestone_stairs.json | 17 + ...s_from_mossy_cobblestone_stonecutting.json | 8 + .../recipes/mossy_cobblestone_wall.json | 16 + ...l_from_mossy_cobblestone_stonecutting.json | 8 + .../recipes/mossy_stone_brick_slab.json | 15 + ...b_from_mossy_stone_brick_stonecutting.json | 8 + .../recipes/mossy_stone_brick_stairs.json | 17 + ...s_from_mossy_stone_brick_stonecutting.json | 8 + .../recipes/mossy_stone_brick_wall.json | 16 + ...l_from_mossy_stone_brick_stonecutting.json | 8 + .../textcraft/recipes/mossy_stone_bricks.json | 14 + .../impl/textcraft/recipes/mushroom_stew.json | 17 + .../impl/textcraft/recipes/nether_brick.json | 9 + .../textcraft/recipes/nether_brick_fence.json | 19 + .../textcraft/recipes/nether_brick_slab.json | 15 + ..._slab_from_nether_bricks_stonecutting.json | 8 + .../recipes/nether_brick_stairs.json | 17 + ...tairs_from_nether_bricks_stonecutting.json | 8 + .../textcraft/recipes/nether_brick_wall.json | 16 + ..._wall_from_nether_bricks_stonecutting.json | 8 + .../impl/textcraft/recipes/nether_bricks.json | 15 + .../textcraft/recipes/nether_wart_block.json | 16 + .../recipes/netherite_axe_smithing.json | 12 + .../textcraft/recipes/netherite_block.json | 16 + .../recipes/netherite_boots_smithing.json | 12 + .../netherite_chestplate_smithing.json | 12 + .../recipes/netherite_helmet_smithing.json | 12 + .../recipes/netherite_hoe_smithing.json | 12 + .../textcraft/recipes/netherite_ingot.json | 33 + .../netherite_ingot_from_netherite_block.json | 13 + .../recipes/netherite_leggings_smithing.json | 12 + .../recipes/netherite_pickaxe_smithing.json | 12 + .../textcraft/recipes/netherite_scrap.json | 9 + .../netherite_scrap_from_blasting.json | 9 + .../recipes/netherite_shovel_smithing.json | 12 + .../recipes/netherite_sword_smithing.json | 12 + .../impl/textcraft/recipes/note_block.json | 19 + .../impl/textcraft/recipes/oak_boat.json | 16 + .../impl/textcraft/recipes/oak_button.json | 12 + .../impl/textcraft/recipes/oak_door.json | 18 + .../impl/textcraft/recipes/oak_fence.json | 20 + .../textcraft/recipes/oak_fence_gate.json | 19 + .../impl/textcraft/recipes/oak_planks.json | 13 + .../textcraft/recipes/oak_pressure_plate.json | 15 + .../impl/textcraft/recipes/oak_sign.json | 21 + .../impl/textcraft/recipes/oak_slab.json | 16 + .../impl/textcraft/recipes/oak_stairs.json | 18 + .../impl/textcraft/recipes/oak_trapdoor.json | 17 + .../impl/textcraft/recipes/oak_wood.json | 17 + .../impl/textcraft/recipes/observer.json | 22 + .../impl/textcraft/recipes/orange_banner.json | 20 + .../impl/textcraft/recipes/orange_bed.json | 19 + .../recipes/orange_bed_from_white_bed.json | 15 + .../impl/textcraft/recipes/orange_carpet.json | 16 + .../orange_carpet_from_white_carpet.json | 21 + .../recipes/orange_concrete_powder.json | 37 + .../recipes/orange_dye_from_orange_tulip.json | 12 + .../recipes/orange_dye_from_red_yellow.json | 16 + .../recipes/orange_glazed_terracotta.json | 9 + .../recipes/orange_stained_glass.json | 21 + .../recipes/orange_stained_glass_pane.json | 17 + ...ge_stained_glass_pane_from_glass_pane.json | 21 + .../textcraft/recipes/orange_terracotta.json | 21 + .../impl/textcraft/recipes/orange_wool.json | 15 + .../impl/textcraft/recipes/packed_ice.json | 35 + .../impl/textcraft/recipes/painting.json | 19 + .../impl/textcraft/recipes/paper.json | 15 + .../impl/textcraft/recipes/pink_banner.json | 20 + .../impl/textcraft/recipes/pink_bed.json | 19 + .../recipes/pink_bed_from_white_bed.json | 15 + .../impl/textcraft/recipes/pink_carpet.json | 16 + .../pink_carpet_from_white_carpet.json | 21 + .../recipes/pink_concrete_powder.json | 37 + .../recipes/pink_dye_from_peony.json | 13 + .../recipes/pink_dye_from_pink_tulip.json | 12 + .../recipes/pink_dye_from_red_white_dye.json | 16 + .../recipes/pink_glazed_terracotta.json | 9 + .../textcraft/recipes/pink_stained_glass.json | 21 + .../recipes/pink_stained_glass_pane.json | 17 + ...nk_stained_glass_pane_from_glass_pane.json | 21 + .../textcraft/recipes/pink_terracotta.json | 21 + .../impl/textcraft/recipes/pink_wool.json | 15 + .../impl/textcraft/recipes/piston.json | 25 + .../textcraft/recipes/polished_andesite.json | 16 + ...d_andesite_from_andesite_stonecutting.json | 8 + .../recipes/polished_andesite_slab.json | 15 + ...esite_slab_from_andesite_stonecutting.json | 8 + ...b_from_polished_andesite_stonecutting.json | 8 + .../recipes/polished_andesite_stairs.json | 17 + ...ite_stairs_from_andesite_stonecutting.json | 8 + ...s_from_polished_andesite_stonecutting.json | 8 + .../textcraft/recipes/polished_basalt.json | 16 + ...ished_basalt_from_basalt_stonecutting.json | 8 + .../recipes/polished_blackstone.json | 16 + .../polished_blackstone_brick_slab.json | 15 + ...ick_slab_from_blackstone_stonecutting.json | 8 + ...lished_blackstone_bricks_stonecutting.json | 8 + ...from_polished_blackstone_stonecutting.json | 8 + .../polished_blackstone_brick_stairs.json | 17 + ...k_stairs_from_blackstone_stonecutting.json | 8 + ...lished_blackstone_bricks_stonecutting.json | 8 + ...from_polished_blackstone_stonecutting.json | 8 + .../polished_blackstone_brick_wall.json | 16 + ...ick_wall_from_blackstone_stonecutting.json | 8 + ...lished_blackstone_bricks_stonecutting.json | 8 + ...from_polished_blackstone_stonecutting.json | 8 + .../recipes/polished_blackstone_bricks.json | 16 + ...e_bricks_from_blackstone_stonecutting.json | 8 + ...from_polished_blackstone_stonecutting.json | 8 + .../recipes/polished_blackstone_button.json | 11 + ...ackstone_from_blackstone_stonecutting.json | 8 + .../polished_blackstone_pressure_plate.json | 14 + .../recipes/polished_blackstone_slab.json | 15 + ...one_slab_from_blackstone_stonecutting.json | 8 + ...from_polished_blackstone_stonecutting.json | 8 + .../recipes/polished_blackstone_stairs.json | 17 + ...e_stairs_from_blackstone_stonecutting.json | 8 + ...from_polished_blackstone_stonecutting.json | 8 + .../recipes/polished_blackstone_wall.json | 16 + ...one_wall_from_blackstone_stonecutting.json | 8 + ...from_polished_blackstone_stonecutting.json | 8 + .../textcraft/recipes/polished_diorite.json | 16 + ...hed_diorite_from_diorite_stonecutting.json | 8 + .../recipes/polished_diorite_slab.json | 15 + ...iorite_slab_from_diorite_stonecutting.json | 8 + ...ab_from_polished_diorite_stonecutting.json | 8 + .../recipes/polished_diorite_stairs.json | 17 + ...rite_stairs_from_diorite_stonecutting.json | 8 + ...rs_from_polished_diorite_stonecutting.json | 8 + .../textcraft/recipes/polished_granite.json | 16 + ...hed_granite_from_granite_stonecutting.json | 8 + .../recipes/polished_granite_slab.json | 15 + ...ranite_slab_from_granite_stonecutting.json | 8 + ...ab_from_polished_granite_stonecutting.json | 8 + .../recipes/polished_granite_stairs.json | 17 + ...nite_stairs_from_granite_stonecutting.json | 8 + ...rs_from_polished_granite_stonecutting.json | 8 + .../recipes/popped_chorus_fruit.json | 9 + .../impl/textcraft/recipes/powered_rail.json | 23 + .../impl/textcraft/recipes/prismarine.json | 15 + .../recipes/prismarine_brick_slab.json | 15 + ...ick_slab_from_prismarine_stonecutting.json | 8 + .../recipes/prismarine_brick_stairs.json | 17 + ...k_stairs_from_prismarine_stonecutting.json | 8 + .../textcraft/recipes/prismarine_bricks.json | 16 + .../textcraft/recipes/prismarine_slab.json | 15 + ...ine_slab_from_prismarine_stonecutting.json | 8 + .../textcraft/recipes/prismarine_stairs.json | 17 + ...e_stairs_from_prismarine_stonecutting.json | 8 + .../textcraft/recipes/prismarine_wall.json | 16 + ...ine_wall_from_prismarine_stonecutting.json | 8 + .../impl/textcraft/recipes/pumpkin_pie.json | 17 + .../impl/textcraft/recipes/pumpkin_seeds.json | 12 + .../impl/textcraft/recipes/purple_banner.json | 20 + .../impl/textcraft/recipes/purple_bed.json | 19 + .../recipes/purple_bed_from_white_bed.json | 15 + .../impl/textcraft/recipes/purple_carpet.json | 16 + .../purple_carpet_from_white_carpet.json | 21 + .../recipes/purple_concrete_powder.json | 37 + .../impl/textcraft/recipes/purple_dye.json | 15 + .../recipes/purple_glazed_terracotta.json | 9 + .../recipes/purple_stained_glass.json | 21 + .../recipes/purple_stained_glass_pane.json | 17 + ...le_stained_glass_pane_from_glass_pane.json | 21 + .../textcraft/recipes/purple_terracotta.json | 21 + .../impl/textcraft/recipes/purple_wool.json | 15 + .../impl/textcraft/recipes/purpur_block.json | 16 + .../impl/textcraft/recipes/purpur_pillar.json | 15 + ...pillar_from_purpur_block_stonecutting.json | 8 + .../impl/textcraft/recipes/purpur_slab.json | 20 + ...r_slab_from_purpur_block_stonecutting.json | 8 + .../impl/textcraft/recipes/purpur_stairs.json | 22 + ...stairs_from_purpur_block_stonecutting.json | 8 + .../impl/textcraft/recipes/quartz.json | 9 + .../impl/textcraft/recipes/quartz_block.json | 15 + .../impl/textcraft/recipes/quartz_bricks.json | 16 + ...bricks_from_quartz_block_stonecutting.json | 8 + .../recipes/quartz_from_blasting.json | 9 + .../impl/textcraft/recipes/quartz_pillar.json | 16 + ...pillar_from_quartz_block_stonecutting.json | 8 + .../impl/textcraft/recipes/quartz_slab.json | 23 + .../quartz_slab_from_stonecutting.json | 8 + .../impl/textcraft/recipes/quartz_stairs.json | 25 + ...stairs_from_quartz_block_stonecutting.json | 8 + .../rabbit_stew_from_brown_mushroom.json | 24 + .../rabbit_stew_from_red_mushroom.json | 24 + .../workflow/impl/textcraft/recipes/rail.json | 20 + .../impl/textcraft/recipes/red_banner.json | 20 + .../impl/textcraft/recipes/red_bed.json | 19 + .../recipes/red_bed_from_white_bed.json | 15 + .../impl/textcraft/recipes/red_carpet.json | 16 + .../recipes/red_carpet_from_white_carpet.json | 21 + .../recipes/red_concrete_powder.json | 37 + .../recipes/red_dye_from_beetroot.json | 12 + .../textcraft/recipes/red_dye_from_poppy.json | 12 + .../recipes/red_dye_from_rose_bush.json | 13 + .../textcraft/recipes/red_dye_from_tulip.json | 12 + .../recipes/red_glazed_terracotta.json | 9 + .../recipes/red_nether_brick_slab.json | 15 + ...b_from_red_nether_bricks_stonecutting.json | 8 + .../recipes/red_nether_brick_stairs.json | 17 + ...s_from_red_nether_bricks_stonecutting.json | 8 + .../recipes/red_nether_brick_wall.json | 16 + ...l_from_red_nether_bricks_stonecutting.json | 8 + .../textcraft/recipes/red_nether_bricks.json | 18 + .../impl/textcraft/recipes/red_sandstone.json | 15 + .../textcraft/recipes/red_sandstone_slab.json | 20 + ..._slab_from_red_sandstone_stonecutting.json | 8 + .../recipes/red_sandstone_stairs.json | 25 + ...tairs_from_red_sandstone_stonecutting.json | 8 + .../textcraft/recipes/red_sandstone_wall.json | 16 + ..._wall_from_red_sandstone_stonecutting.json | 8 + .../textcraft/recipes/red_stained_glass.json | 21 + .../recipes/red_stained_glass_pane.json | 17 + ...ed_stained_glass_pane_from_glass_pane.json | 21 + .../textcraft/recipes/red_terracotta.json | 21 + .../impl/textcraft/recipes/red_wool.json | 15 + .../impl/textcraft/recipes/redstone.json | 12 + .../textcraft/recipes/redstone_block.json | 16 + .../recipes/redstone_from_blasting.json | 9 + .../recipes/redstone_from_smelting.json | 9 + .../impl/textcraft/recipes/redstone_lamp.json | 19 + .../textcraft/recipes/redstone_torch.json | 18 + .../impl/textcraft/recipes/repair_item.json | 3 + .../impl/textcraft/recipes/repeater.json | 21 + .../textcraft/recipes/respawn_anchor.json | 19 + .../impl/textcraft/recipes/sandstone.json | 15 + .../textcraft/recipes/sandstone_slab.json | 20 + ...tone_slab_from_sandstone_stonecutting.json | 8 + .../textcraft/recipes/sandstone_stairs.json | 25 + ...ne_stairs_from_sandstone_stonecutting.json | 8 + .../textcraft/recipes/sandstone_wall.json | 16 + ...tone_wall_from_sandstone_stonecutting.json | 8 + .../impl/textcraft/recipes/scaffolding.json | 20 + .../impl/textcraft/recipes/sea_lantern.json | 19 + .../impl/textcraft/recipes/shears.json | 15 + .../impl/textcraft/recipes/shield.json | 19 + .../textcraft/recipes/shield_decoration.json | 3 + .../impl/textcraft/recipes/shulker_box.json | 19 + .../recipes/shulker_box_coloring.json | 3 + .../recipes/skull_banner_pattern.json | 14 + .../impl/textcraft/recipes/slime_ball.json | 12 + .../impl/textcraft/recipes/slime_block.json | 16 + .../textcraft/recipes/smithing_table.json | 19 + .../impl/textcraft/recipes/smoker.json | 19 + .../impl/textcraft/recipes/smooth_quartz.json | 9 + .../textcraft/recipes/smooth_quartz_slab.json | 15 + ..._slab_from_smooth_quartz_stonecutting.json | 8 + .../recipes/smooth_quartz_stairs.json | 17 + ...tairs_from_smooth_quartz_stonecutting.json | 8 + .../recipes/smooth_red_sandstone.json | 9 + .../recipes/smooth_red_sandstone_slab.json | 15 + ...rom_smooth_red_sandstone_stonecutting.json | 8 + .../recipes/smooth_red_sandstone_stairs.json | 17 + ...rom_smooth_red_sandstone_stonecutting.json | 8 + .../textcraft/recipes/smooth_sandstone.json | 9 + .../recipes/smooth_sandstone_slab.json | 15 + ...ab_from_smooth_sandstone_stonecutting.json | 8 + .../recipes/smooth_sandstone_stairs.json | 17 + ...rs_from_smooth_sandstone_stonecutting.json | 8 + .../impl/textcraft/recipes/smooth_stone.json | 9 + .../textcraft/recipes/smooth_stone_slab.json | 15 + ...e_slab_from_smooth_stone_stonecutting.json | 8 + .../workflow/impl/textcraft/recipes/snow.json | 15 + .../impl/textcraft/recipes/snow_block.json | 15 + .../impl/textcraft/recipes/soul_campfire.json | 22 + .../impl/textcraft/recipes/soul_lantern.json | 19 + .../impl/textcraft/recipes/soul_torch.json | 28 + .../textcraft/recipes/spectral_arrow.json | 20 + .../impl/textcraft/recipes/sponge.json | 9 + .../impl/textcraft/recipes/spruce_boat.json | 16 + .../impl/textcraft/recipes/spruce_button.json | 12 + .../impl/textcraft/recipes/spruce_door.json | 18 + .../impl/textcraft/recipes/spruce_fence.json | 20 + .../textcraft/recipes/spruce_fence_gate.json | 19 + .../impl/textcraft/recipes/spruce_planks.json | 13 + .../recipes/spruce_pressure_plate.json | 15 + .../impl/textcraft/recipes/spruce_sign.json | 21 + .../impl/textcraft/recipes/spruce_slab.json | 16 + .../impl/textcraft/recipes/spruce_stairs.json | 18 + .../textcraft/recipes/spruce_trapdoor.json | 17 + .../impl/textcraft/recipes/spruce_wood.json | 17 + .../impl/textcraft/recipes/stick.json | 17 + .../recipes/stick_from_bamboo_item.json | 16 + .../impl/textcraft/recipes/sticky_piston.json | 18 + .../impl/textcraft/recipes/stone.json | 9 + .../impl/textcraft/recipes/stone_axe.json | 19 + .../textcraft/recipes/stone_brick_slab.json | 15 + ...k_slab_from_stone_bricks_stonecutting.json | 8 + ...ne_brick_slab_from_stone_stonecutting.json | 8 + .../textcraft/recipes/stone_brick_stairs.json | 17 + ...stairs_from_stone_bricks_stonecutting.json | 8 + ..._brick_stairs_from_stone_stonecutting.json | 8 + .../textcraft/recipes/stone_brick_wall.json | 16 + ...k_wall_from_stone_bricks_stonecutting.json | 8 + ...e_brick_walls_from_stone_stonecutting.json | 8 + .../impl/textcraft/recipes/stone_bricks.json | 16 + .../stone_bricks_from_stone_stonecutting.json | 8 + .../impl/textcraft/recipes/stone_button.json | 11 + .../impl/textcraft/recipes/stone_hoe.json | 19 + .../impl/textcraft/recipes/stone_pickaxe.json | 19 + .../recipes/stone_pressure_plate.json | 14 + .../impl/textcraft/recipes/stone_shovel.json | 19 + .../impl/textcraft/recipes/stone_slab.json | 15 + .../stone_slab_from_stone_stonecutting.json | 8 + .../impl/textcraft/recipes/stone_stairs.json | 17 + .../stone_stairs_from_stone_stonecutting.json | 8 + .../impl/textcraft/recipes/stone_sword.json | 19 + .../impl/textcraft/recipes/stonecutter.json | 18 + .../recipes/stripped_acacia_wood.json | 17 + .../recipes/stripped_birch_wood.json | 17 + .../recipes/stripped_crimson_hyphae.json | 17 + .../recipes/stripped_dark_oak_wood.json | 17 + .../recipes/stripped_jungle_wood.json | 17 + .../textcraft/recipes/stripped_oak_wood.json | 17 + .../recipes/stripped_spruce_wood.json | 17 + .../recipes/stripped_warped_hyphae.json | 17 + .../impl/textcraft/recipes/sugar.json | 11 + .../recipes/sugar_from_honey_bottle.json | 13 + .../recipes/sugar_from_sugar_cane.json | 12 + .../textcraft/recipes/suspicious_stew.json | 3 + .../impl/textcraft/recipes/target.json | 19 + .../impl/textcraft/recipes/terracotta.json | 9 + .../impl/textcraft/recipes/tipped_arrow.json | 3 + .../workflow/impl/textcraft/recipes/tnt.json | 24 + .../impl/textcraft/recipes/tnt_minecart.json | 18 + .../impl/textcraft/recipes/torch.json | 24 + .../impl/textcraft/recipes/trapped_chest.json | 14 + .../impl/textcraft/recipes/tripwire_hook.json | 23 + .../impl/textcraft/recipes/turtle_helmet.json | 15 + .../impl/textcraft/recipes/warped_button.json | 12 + .../impl/textcraft/recipes/warped_door.json | 18 + .../impl/textcraft/recipes/warped_fence.json | 20 + .../textcraft/recipes/warped_fence_gate.json | 19 + .../recipes/warped_fungus_on_a_stick.json | 18 + .../impl/textcraft/recipes/warped_hyphae.json | 17 + .../impl/textcraft/recipes/warped_planks.json | 13 + .../recipes/warped_pressure_plate.json | 15 + .../impl/textcraft/recipes/warped_sign.json | 21 + .../impl/textcraft/recipes/warped_slab.json | 16 + .../impl/textcraft/recipes/warped_stairs.json | 18 + .../textcraft/recipes/warped_trapdoor.json | 17 + .../impl/textcraft/recipes/wheat.json | 12 + .../impl/textcraft/recipes/white_banner.json | 20 + .../impl/textcraft/recipes/white_bed.json | 19 + .../impl/textcraft/recipes/white_carpet.json | 16 + .../recipes/white_concrete_powder.json | 37 + .../impl/textcraft/recipes/white_dye.json | 12 + .../white_dye_from_lily_of_the_valley.json | 12 + .../recipes/white_glazed_terracotta.json | 9 + .../recipes/white_stained_glass.json | 21 + .../recipes/white_stained_glass_pane.json | 17 + ...te_stained_glass_pane_from_glass_pane.json | 21 + .../textcraft/recipes/white_terracotta.json | 21 + .../recipes/white_wool_from_string.json | 15 + .../impl/textcraft/recipes/wooden_axe.json | 19 + .../impl/textcraft/recipes/wooden_hoe.json | 19 + .../textcraft/recipes/wooden_pickaxe.json | 19 + .../impl/textcraft/recipes/wooden_shovel.json | 19 + .../impl/textcraft/recipes/wooden_sword.json | 19 + .../impl/textcraft/recipes/writable_book.json | 17 + .../impl/textcraft/recipes/yellow_banner.json | 20 + .../impl/textcraft/recipes/yellow_bed.json | 19 + .../recipes/yellow_bed_from_white_bed.json | 15 + .../impl/textcraft/recipes/yellow_carpet.json | 16 + .../yellow_carpet_from_white_carpet.json | 21 + .../recipes/yellow_concrete_powder.json | 37 + .../recipes/yellow_dye_from_dandelion.json | 12 + .../recipes/yellow_dye_from_sunflower.json | 13 + .../recipes/yellow_glazed_terracotta.json | 9 + .../recipes/yellow_stained_glass.json | 21 + .../recipes/yellow_stained_glass_pane.json | 17 + ...ow_stained_glass_pane_from_glass_pane.json | 21 + .../textcraft/recipes/yellow_terracotta.json | 21 + .../impl/textcraft/recipes/yellow_wool.json | 15 + .../core/workflow/impl/textcraft/task.py | 53 + .../core/workflow/impl/textcraft/tasks.py | 707 ++++++++++++ .../impl/textcraft/textcraft_train.jsonl | 1000 +++++++++++++++++ .../impl/textcraft/textcraft_val.jsonl | 100 ++ .../core/workflow/impl/textcraft/workflow.py | 760 +++++++++++++ .../core/workflow/reward/textcraft_success.py | 26 + astraflow/dataflow/dataset/textcraft.py | 162 +++ docs/en/index.rst | 1 + docs/en/recipes/textcraft-recursive.md | 157 +++ .../qwen3-4b-recursive/scripts/1_astraflow.sh | 36 + .../qwen3-4b-recursive/scripts/2_raas.sh | 44 + .../scripts/3_trainer_model0.sh | 47 + .../scripts/run_qwen3-4b-recursive.sh | 116 ++ .../qwen3-4b-recursive/yaml/experiment.yaml | 166 +++ .../qwen3-4b-recursive/yaml/raas.yaml | 35 + 880 files changed, 17307 insertions(+) create mode 100644 astraflow/core/workflow/impl/textcraft/__init__.py create mode 100644 astraflow/core/workflow/impl/textcraft/env.py create mode 100644 astraflow/core/workflow/impl/textcraft/recipe_loader.py create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/acacia_boat.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/acacia_button.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/acacia_door.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/acacia_fence.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/acacia_fence_gate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/acacia_planks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/acacia_pressure_plate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/acacia_sign.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/acacia_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/acacia_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/acacia_trapdoor.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/acacia_wood.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/activator_rail.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/andesite.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/andesite_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/andesite_slab_from_andesite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/andesite_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/andesite_stairs_from_andesite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/andesite_wall.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/andesite_wall_from_andesite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/anvil.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/armor_dye.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/armor_stand.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/arrow.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/baked_potato.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/baked_potato_from_campfire_cooking.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/baked_potato_from_smoking.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/banner_duplicate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/barrel.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/beacon.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/beehive.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/beetroot_soup.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/birch_boat.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/birch_button.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/birch_door.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/birch_fence.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/birch_fence_gate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/birch_planks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/birch_pressure_plate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/birch_sign.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/birch_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/birch_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/birch_trapdoor.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/birch_wood.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/black_banner.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/black_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/black_bed_from_white_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/black_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/black_carpet_from_white_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/black_concrete_powder.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/black_dye.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/black_dye_from_wither_rose.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/black_glazed_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/black_stained_glass.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/black_stained_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/black_stained_glass_pane_from_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/black_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/black_wool.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blackstone_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blackstone_slab_from_blackstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blackstone_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blackstone_stairs_from_blackstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blackstone_wall.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blackstone_wall_from_blackstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blast_furnace.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blaze_powder.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blue_banner.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blue_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blue_bed_from_white_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blue_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blue_carpet_from_white_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blue_concrete_powder.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blue_dye.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blue_dye_from_cornflower.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blue_glazed_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blue_ice.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blue_stained_glass.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blue_stained_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blue_stained_glass_pane_from_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blue_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/blue_wool.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/bone_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/bone_meal.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/bone_meal_from_bone_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/book.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/book_cloning.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/bookshelf.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/bow.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/bowl.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/bread.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brewing_stand.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brick.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brick_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brick_slab_from_bricks_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brick_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brick_stairs_from_bricks_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brick_wall.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brick_wall_from_bricks_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/bricks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brown_banner.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brown_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brown_bed_from_white_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brown_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brown_carpet_from_white_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brown_concrete_powder.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brown_dye.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brown_glazed_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brown_stained_glass.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brown_stained_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brown_stained_glass_pane_from_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brown_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/brown_wool.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/bucket.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cake.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/campfire.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/carrot_on_a_stick.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cartography_table.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cauldron.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/chain.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/charcoal.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/chest.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/chest_minecart.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/chiseled_nether_bricks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/chiseled_nether_bricks_from_nether_bricks_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/chiseled_polished_blackstone.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/chiseled_polished_blackstone_from_blackstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/chiseled_polished_blackstone_from_polished_blackstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/chiseled_quartz_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/chiseled_quartz_block_from_quartz_block_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/chiseled_red_sandstone.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/chiseled_red_sandstone_from_red_sandstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/chiseled_sandstone.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/chiseled_sandstone_from_sandstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/chiseled_stone_bricks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/chiseled_stone_bricks_from_stone_bricks_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/chiseled_stone_bricks_stone_from_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/clay.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/clock.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/coal.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/coal_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/coal_from_blasting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/coal_from_smelting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/coarse_dirt.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cobblestone_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cobblestone_slab_from_cobblestone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cobblestone_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cobblestone_stairs_from_cobblestone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cobblestone_wall.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cobblestone_wall_from_cobblestone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/comparator.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/compass.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/composter.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/conduit.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_beef.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_beef_from_campfire_cooking.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_beef_from_smoking.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_chicken.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_chicken_from_campfire_cooking.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_chicken_from_smoking.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_cod.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_cod_from_campfire_cooking.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_cod_from_smoking.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_mutton.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_mutton_from_campfire_cooking.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_mutton_from_smoking.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_porkchop.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_porkchop_from_campfire_cooking.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_porkchop_from_smoking.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_rabbit.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_rabbit_from_campfire_cooking.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_rabbit_from_smoking.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_salmon.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_salmon_from_campfire_cooking.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cooked_salmon_from_smoking.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cookie.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cracked_nether_bricks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cracked_polished_blackstone_bricks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cracked_stone_bricks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/crafting_table.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/creeper_banner_pattern.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/crimson_button.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/crimson_door.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/crimson_fence.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/crimson_fence_gate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/crimson_hyphae.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/crimson_planks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/crimson_pressure_plate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/crimson_sign.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/crimson_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/crimson_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/crimson_trapdoor.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/crossbow.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cut_red_sandstone.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cut_red_sandstone_from_red_sandstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cut_red_sandstone_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cut_red_sandstone_slab_from_cut_red_sandstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cut_red_sandstone_slab_from_red_sandstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cut_sandstone.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cut_sandstone_from_sandstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cut_sandstone_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cut_sandstone_slab_from_cut_sandstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cut_sandstone_slab_from_sandstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cyan_banner.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cyan_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cyan_bed_from_white_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cyan_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cyan_carpet_from_white_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cyan_concrete_powder.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cyan_dye.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cyan_glazed_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cyan_stained_glass.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cyan_stained_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cyan_stained_glass_pane_from_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cyan_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/cyan_wool.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dark_oak_boat.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dark_oak_button.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dark_oak_door.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dark_oak_fence.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dark_oak_fence_gate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dark_oak_planks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dark_oak_pressure_plate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dark_oak_sign.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dark_oak_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dark_oak_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dark_oak_trapdoor.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dark_oak_wood.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dark_prismarine.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dark_prismarine_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dark_prismarine_slab_from_dark_prismarine_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dark_prismarine_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dark_prismarine_stairs_from_dark_prismarine_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/daylight_detector.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/detector_rail.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/diamond.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/diamond_axe.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/diamond_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/diamond_boots.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/diamond_chestplate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/diamond_from_blasting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/diamond_from_smelting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/diamond_helmet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/diamond_hoe.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/diamond_leggings.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/diamond_pickaxe.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/diamond_shovel.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/diamond_sword.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/diorite.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/diorite_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/diorite_slab_from_diorite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/diorite_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/diorite_stairs_from_diorite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/diorite_wall.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/diorite_wall_from_diorite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dispenser.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dried_kelp.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dried_kelp_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dried_kelp_from_campfire_cooking.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dried_kelp_from_smelting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dried_kelp_from_smoking.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/dropper.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/emerald.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/emerald_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/emerald_from_blasting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/emerald_from_smelting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/enchanting_table.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/end_crystal.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/end_rod.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_slab_from_end_stone_brick_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_slab_from_end_stone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_stairs_from_end_stone_brick_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_stairs_from_end_stone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_wall.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_wall_from_end_stone_brick_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_wall_from_end_stone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/end_stone_bricks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/end_stone_bricks_from_end_stone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/ender_chest.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/ender_eye.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/fermented_spider_eye.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/fire_charge.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/firework_rocket.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/firework_star.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/firework_star_fade.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/fishing_rod.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/fletching_table.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/flint_and_steel.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/flower_banner_pattern.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/flower_pot.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/furnace.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/furnace_minecart.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/glass.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/glass_bottle.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/glistering_melon_slice.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/glowstone.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gold_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gold_ingot.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gold_ingot_from_blasting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gold_ingot_from_gold_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gold_ingot_from_nuggets.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gold_nugget.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gold_nugget_from_blasting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gold_nugget_from_smelting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/golden_apple.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/golden_axe.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/golden_boots.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/golden_carrot.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/golden_chestplate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/golden_helmet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/golden_hoe.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/golden_leggings.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/golden_pickaxe.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/golden_shovel.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/golden_sword.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/granite.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/granite_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/granite_slab_from_granite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/granite_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/granite_stairs_from_granite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/granite_wall.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/granite_wall_from_granite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gray_banner.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gray_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gray_bed_from_white_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gray_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gray_carpet_from_white_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gray_concrete_powder.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gray_dye.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gray_glazed_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gray_stained_glass.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gray_stained_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gray_stained_glass_pane_from_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gray_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/gray_wool.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/green_banner.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/green_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/green_bed_from_white_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/green_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/green_carpet_from_white_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/green_concrete_powder.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/green_dye.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/green_glazed_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/green_stained_glass.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/green_stained_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/green_stained_glass_pane_from_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/green_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/green_wool.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/grindstone.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/hay_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/heavy_weighted_pressure_plate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/honey_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/honey_bottle.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/honeycomb_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/hopper.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/hopper_minecart.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/iron_axe.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/iron_bars.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/iron_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/iron_boots.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/iron_chestplate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/iron_door.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/iron_helmet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/iron_hoe.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/iron_ingot.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/iron_ingot_from_blasting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/iron_ingot_from_iron_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/iron_ingot_from_nuggets.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/iron_leggings.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/iron_nugget.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/iron_nugget_from_blasting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/iron_nugget_from_smelting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/iron_pickaxe.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/iron_shovel.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/iron_sword.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/iron_trapdoor.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/item_frame.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/jack_o_lantern.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/jukebox.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/jungle_boat.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/jungle_button.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/jungle_door.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/jungle_fence.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/jungle_fence_gate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/jungle_planks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/jungle_pressure_plate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/jungle_sign.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/jungle_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/jungle_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/jungle_trapdoor.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/jungle_wood.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/ladder.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lantern.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lapis_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lapis_from_blasting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lapis_from_smelting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lapis_lazuli.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lead.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/leather.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/leather_boots.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/leather_chestplate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/leather_helmet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/leather_horse_armor.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/leather_leggings.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lectern.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lever.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_blue_banner.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_blue_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_blue_bed_from_white_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_blue_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_blue_carpet_from_white_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_blue_concrete_powder.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_blue_dye_from_blue_orchid.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_blue_dye_from_blue_white_dye.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_blue_glazed_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_blue_stained_glass.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_blue_stained_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_blue_stained_glass_pane_from_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_blue_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_blue_wool.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_gray_banner.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_gray_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_gray_bed_from_white_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_gray_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_gray_carpet_from_white_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_gray_concrete_powder.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_gray_dye_from_azure_bluet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_gray_dye_from_black_white_dye.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_gray_dye_from_gray_white_dye.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_gray_dye_from_oxeye_daisy.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_gray_dye_from_white_tulip.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_gray_glazed_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_gray_stained_glass.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_gray_stained_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_gray_stained_glass_pane_from_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_gray_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_gray_wool.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/light_weighted_pressure_plate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lime_banner.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lime_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lime_bed_from_white_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lime_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lime_carpet_from_white_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lime_concrete_powder.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lime_dye.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lime_dye_from_smelting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lime_glazed_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lime_stained_glass.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lime_stained_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lime_stained_glass_pane_from_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lime_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lime_wool.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/lodestone.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/loom.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/magenta_banner.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/magenta_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/magenta_bed_from_white_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/magenta_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/magenta_carpet_from_white_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/magenta_concrete_powder.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/magenta_dye_from_allium.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/magenta_dye_from_blue_red_pink.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/magenta_dye_from_blue_red_white_dye.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/magenta_dye_from_lilac.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/magenta_dye_from_purple_and_pink.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/magenta_glazed_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/magenta_stained_glass.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/magenta_stained_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/magenta_stained_glass_pane_from_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/magenta_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/magenta_wool.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/magma_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/magma_cream.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/map.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/map_cloning.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/map_extending.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/melon.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/melon_seeds.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/minecart.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/mojang_banner_pattern.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_slab_from_mossy_cobblestone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_stairs_from_mossy_cobblestone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_wall.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_wall_from_mossy_cobblestone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_slab_from_mossy_stone_brick_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_stairs_from_mossy_stone_brick_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_wall.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_wall_from_mossy_stone_brick_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_bricks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/mushroom_stew.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/nether_brick.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/nether_brick_fence.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/nether_brick_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/nether_brick_slab_from_nether_bricks_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/nether_brick_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/nether_brick_stairs_from_nether_bricks_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/nether_brick_wall.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/nether_brick_wall_from_nether_bricks_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/nether_bricks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/nether_wart_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/netherite_axe_smithing.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/netherite_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/netherite_boots_smithing.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/netherite_chestplate_smithing.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/netherite_helmet_smithing.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/netherite_hoe_smithing.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/netherite_ingot.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/netherite_ingot_from_netherite_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/netherite_leggings_smithing.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/netherite_pickaxe_smithing.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/netherite_scrap.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/netherite_scrap_from_blasting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/netherite_shovel_smithing.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/netherite_sword_smithing.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/note_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/oak_boat.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/oak_button.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/oak_door.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/oak_fence.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/oak_fence_gate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/oak_planks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/oak_pressure_plate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/oak_sign.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/oak_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/oak_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/oak_trapdoor.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/oak_wood.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/observer.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/orange_banner.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/orange_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/orange_bed_from_white_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/orange_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/orange_carpet_from_white_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/orange_concrete_powder.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/orange_dye_from_orange_tulip.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/orange_dye_from_red_yellow.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/orange_glazed_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/orange_stained_glass.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/orange_stained_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/orange_stained_glass_pane_from_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/orange_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/orange_wool.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/packed_ice.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/painting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/paper.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/pink_banner.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/pink_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/pink_bed_from_white_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/pink_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/pink_carpet_from_white_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/pink_concrete_powder.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/pink_dye_from_peony.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/pink_dye_from_pink_tulip.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/pink_dye_from_red_white_dye.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/pink_glazed_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/pink_stained_glass.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/pink_stained_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/pink_stained_glass_pane_from_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/pink_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/pink_wool.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/piston.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_andesite.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_from_andesite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_slab_from_andesite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_slab_from_polished_andesite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_stairs_from_andesite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_stairs_from_polished_andesite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_basalt.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_basalt_from_basalt_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_slab_from_blackstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_slab_from_polished_blackstone_bricks_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_slab_from_polished_blackstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_stairs_from_blackstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_stairs_from_polished_blackstone_bricks_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_stairs_from_polished_blackstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_wall.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_wall_from_blackstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_wall_from_polished_blackstone_bricks_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_wall_from_polished_blackstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_bricks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_bricks_from_blackstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_bricks_from_polished_blackstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_button.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_from_blackstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_pressure_plate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_slab_from_blackstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_slab_from_polished_blackstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_stairs_from_blackstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_stairs_from_polished_blackstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_wall.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_wall_from_blackstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_wall_from_polished_blackstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_diorite.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_from_diorite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_slab_from_diorite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_slab_from_polished_diorite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_stairs_from_diorite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_stairs_from_polished_diorite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_granite.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_granite_from_granite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_granite_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_granite_slab_from_granite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_granite_slab_from_polished_granite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_granite_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_granite_stairs_from_granite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/polished_granite_stairs_from_polished_granite_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/popped_chorus_fruit.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/powered_rail.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/prismarine.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/prismarine_brick_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/prismarine_brick_slab_from_prismarine_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/prismarine_brick_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/prismarine_brick_stairs_from_prismarine_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/prismarine_bricks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/prismarine_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/prismarine_slab_from_prismarine_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/prismarine_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/prismarine_stairs_from_prismarine_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/prismarine_wall.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/prismarine_wall_from_prismarine_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/pumpkin_pie.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/pumpkin_seeds.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/purple_banner.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/purple_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/purple_bed_from_white_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/purple_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/purple_carpet_from_white_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/purple_concrete_powder.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/purple_dye.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/purple_glazed_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/purple_stained_glass.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/purple_stained_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/purple_stained_glass_pane_from_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/purple_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/purple_wool.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/purpur_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/purpur_pillar.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/purpur_pillar_from_purpur_block_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/purpur_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/purpur_slab_from_purpur_block_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/purpur_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/purpur_stairs_from_purpur_block_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/quartz.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/quartz_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/quartz_bricks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/quartz_bricks_from_quartz_block_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/quartz_from_blasting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/quartz_pillar.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/quartz_pillar_from_quartz_block_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/quartz_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/quartz_slab_from_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/quartz_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/quartz_stairs_from_quartz_block_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/rabbit_stew_from_brown_mushroom.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/rabbit_stew_from_red_mushroom.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/rail.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_banner.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_bed_from_white_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_carpet_from_white_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_concrete_powder.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_dye_from_beetroot.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_dye_from_poppy.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_dye_from_rose_bush.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_dye_from_tulip.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_glazed_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_slab_from_red_nether_bricks_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_stairs_from_red_nether_bricks_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_wall.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_wall_from_red_nether_bricks_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_nether_bricks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_sandstone.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_slab_from_red_sandstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_stairs_from_red_sandstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_wall.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_wall_from_red_sandstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_stained_glass.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_stained_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_stained_glass_pane_from_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/red_wool.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/redstone.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/redstone_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/redstone_from_blasting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/redstone_from_smelting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/redstone_lamp.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/redstone_torch.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/repair_item.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/repeater.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/respawn_anchor.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/sandstone.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/sandstone_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/sandstone_slab_from_sandstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/sandstone_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/sandstone_stairs_from_sandstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/sandstone_wall.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/sandstone_wall_from_sandstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/scaffolding.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/sea_lantern.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/shears.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/shield.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/shield_decoration.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/shulker_box.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/shulker_box_coloring.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/skull_banner_pattern.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/slime_ball.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/slime_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/smithing_table.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/smoker.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/smooth_quartz.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/smooth_quartz_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/smooth_quartz_slab_from_smooth_quartz_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/smooth_quartz_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/smooth_quartz_stairs_from_smooth_quartz_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/smooth_red_sandstone.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/smooth_red_sandstone_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/smooth_red_sandstone_slab_from_smooth_red_sandstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/smooth_red_sandstone_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/smooth_red_sandstone_stairs_from_smooth_red_sandstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/smooth_sandstone.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/smooth_sandstone_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/smooth_sandstone_slab_from_smooth_sandstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/smooth_sandstone_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/smooth_sandstone_stairs_from_smooth_sandstone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/smooth_stone.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/smooth_stone_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/smooth_stone_slab_from_smooth_stone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/snow.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/snow_block.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/soul_campfire.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/soul_lantern.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/soul_torch.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/spectral_arrow.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/sponge.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/spruce_boat.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/spruce_button.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/spruce_door.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/spruce_fence.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/spruce_fence_gate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/spruce_planks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/spruce_pressure_plate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/spruce_sign.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/spruce_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/spruce_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/spruce_trapdoor.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/spruce_wood.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stick.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stick_from_bamboo_item.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/sticky_piston.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_axe.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_brick_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_brick_slab_from_stone_bricks_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_brick_slab_from_stone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_brick_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_brick_stairs_from_stone_bricks_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_brick_stairs_from_stone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_brick_wall.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_brick_wall_from_stone_bricks_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_brick_walls_from_stone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_bricks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_bricks_from_stone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_button.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_hoe.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_pickaxe.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_pressure_plate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_shovel.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_slab_from_stone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_stairs_from_stone_stonecutting.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stone_sword.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stonecutter.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stripped_acacia_wood.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stripped_birch_wood.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stripped_crimson_hyphae.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stripped_dark_oak_wood.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stripped_jungle_wood.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stripped_oak_wood.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stripped_spruce_wood.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/stripped_warped_hyphae.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/sugar.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/sugar_from_honey_bottle.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/sugar_from_sugar_cane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/suspicious_stew.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/target.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/tipped_arrow.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/tnt.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/tnt_minecart.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/torch.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/trapped_chest.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/tripwire_hook.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/turtle_helmet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/warped_button.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/warped_door.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/warped_fence.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/warped_fence_gate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/warped_fungus_on_a_stick.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/warped_hyphae.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/warped_planks.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/warped_pressure_plate.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/warped_sign.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/warped_slab.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/warped_stairs.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/warped_trapdoor.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/wheat.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/white_banner.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/white_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/white_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/white_concrete_powder.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/white_dye.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/white_dye_from_lily_of_the_valley.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/white_glazed_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/white_stained_glass.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/white_stained_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/white_stained_glass_pane_from_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/white_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/white_wool_from_string.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/wooden_axe.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/wooden_hoe.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/wooden_pickaxe.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/wooden_shovel.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/wooden_sword.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/writable_book.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/yellow_banner.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/yellow_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/yellow_bed_from_white_bed.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/yellow_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/yellow_carpet_from_white_carpet.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/yellow_concrete_powder.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/yellow_dye_from_dandelion.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/yellow_dye_from_sunflower.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/yellow_glazed_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/yellow_stained_glass.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/yellow_stained_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/yellow_stained_glass_pane_from_glass_pane.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/yellow_terracotta.json create mode 100644 astraflow/core/workflow/impl/textcraft/recipes/yellow_wool.json create mode 100644 astraflow/core/workflow/impl/textcraft/task.py create mode 100644 astraflow/core/workflow/impl/textcraft/tasks.py create mode 100644 astraflow/core/workflow/impl/textcraft/textcraft_train.jsonl create mode 100644 astraflow/core/workflow/impl/textcraft/textcraft_val.jsonl create mode 100644 astraflow/core/workflow/impl/textcraft/workflow.py create mode 100644 astraflow/core/workflow/reward/textcraft_success.py create mode 100644 astraflow/dataflow/dataset/textcraft.py create mode 100644 docs/en/recipes/textcraft-recursive.md create mode 100755 examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh create mode 100755 examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh create mode 100755 examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh create mode 100755 examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh create mode 100644 examples/textcraft/qwen3-4b-recursive/yaml/experiment.yaml create mode 100644 examples/textcraft/qwen3-4b-recursive/yaml/raas.yaml diff --git a/.gitignore b/.gitignore index 09b2da4..5ea9106 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ data-data data-log tmp-yaml/ issue-draft/ +claude-doc/ .pip-tmp/ *.pid *.pdf diff --git a/astraflow/core/workflow/__init__.py b/astraflow/core/workflow/__init__.py index ec015d7..58425c1 100644 --- a/astraflow/core/workflow/__init__.py +++ b/astraflow/core/workflow/__init__.py @@ -25,9 +25,11 @@ import astraflow.core.workflow.impl.rlvr import astraflow.core.workflow.impl.sm_lg_router import astraflow.core.workflow.impl.spawn +import astraflow.core.workflow.impl.textcraft.workflow # registers recursive_agent import astraflow.core.workflow.impl.vision_rlvr import astraflow.core.workflow.reward.clevr_count_70k import astraflow.core.workflow.reward.geometry3k import astraflow.core.workflow.reward.math_verify import astraflow.core.workflow.reward.human_eval_reward import astraflow.core.workflow.reward.livecodebench_reward +import astraflow.core.workflow.reward.textcraft_success # noqa: F401 diff --git a/astraflow/core/workflow/impl/textcraft/__init__.py b/astraflow/core/workflow/impl/textcraft/__init__.py new file mode 100644 index 0000000..02fd1a7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/__init__.py @@ -0,0 +1,12 @@ +"""TextCraft env + recursive_agent workflow. + +Ported from platoon (the recursive agent training framework for stateful +environments). We adapt their TextCraft crafting environment + tasks to +run as an in-process AstraFlow workflow under our SGLang + M2PO + full-FT +infrastructure. + +Public entry point: the ``recursive_agent`` workflow, registered via +``@register_workflow`` in ``workflow.py``. Import is done lazily by the +parent ``astraflow.core.workflow.__init__`` rather than here, to avoid +ordering issues during package import. +""" diff --git a/astraflow/core/workflow/impl/textcraft/env.py b/astraflow/core/workflow/impl/textcraft/env.py new file mode 100644 index 0000000..81cf628 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/env.py @@ -0,0 +1,267 @@ +"""TextCraft environment — stateful, in-process, forkable. + +Adapted from platoon's ``TextCraftCodeExecutor`` / ``TextCraftEnv`` but +stripped of the IPython sandbox and CodeAct abstractions. This is a plain +Python object the recursive_agent workflow constructs per episode and +dispatches actions against. + +State: + - ``inventory: dict[str, int]`` — mutable; shared by reference across + parent/child forks. + - ``recipe_db: RecipeDatabase`` — read-only, shared across forks. + +Action methods return text observations. ``fork(child_task)`` returns a +new TextCraftEnv whose inventory is the SAME dict object as the parent +(matches platoon's `_share_inventory=True` pattern). +""" + +from __future__ import annotations + +import json +from pathlib import Path +from typing import Any + +from astraflow.core.workflow.impl.textcraft.recipe_loader import RecipeDatabase +from astraflow.core.workflow.impl.textcraft.task import Task + + +DEFAULT_RECIPES_DIR = Path(__file__).parent / "recipes" + +# Module-level singleton recipe DB; ~860 recipes, ~50MB resident. +# Loaded on first use, shared across all envs in the process. +_RECIPE_DB_CACHE: dict[str, RecipeDatabase] = {} + + +def get_default_recipe_db() -> RecipeDatabase: + """Return the process-global RecipeDatabase, loading on first call.""" + key = str(DEFAULT_RECIPES_DIR) + if key not in _RECIPE_DB_CACHE: + _RECIPE_DB_CACHE[key] = RecipeDatabase(DEFAULT_RECIPES_DIR) + return _RECIPE_DB_CACHE[key] + + +class TextCraftEnv: + """Stateful crafting environment. + + Parameters + ---------- + task: + The Task this env serves. Reads ``task.misc["initial_inventory"]`` + if no explicit inventory is passed; root episodes typically pass + nothing, sub-agents pass the parent's inventory dict by reference. + recipe_db: + Shared RecipeDatabase. ``None`` → use the process-global one. + inventory: + Pre-existing inventory dict. If non-None it is **aliased** (not + copied) — that's the whole point of fork(). + """ + + def __init__( + self, + task: Task, + recipe_db: RecipeDatabase | None = None, + inventory: dict[str, int] | None = None, + ): + self.task = task + self.recipe_db = recipe_db if recipe_db is not None else get_default_recipe_db() + if inventory is not None: + # Alias — mutations visible to whoever else holds this dict. + self.inventory = inventory + else: + # Fresh copy of the task's initial inventory. + init = task.misc.get("initial_inventory", {}) if task.misc else {} + self.inventory = dict(init) + self.finished: bool = False + self.finish_message: str | None = None + # Subagent telemetry for delegation shaping. Reset per env (not + # forked) — each agent tracks its own immediate children. + self.subagent_launched: int = 0 + self.subagent_succeeded: float = 0.0 + + # ------------------------------------------------------------------ fork + + def fork(self, child_task: Task) -> "TextCraftEnv": + """Return a child env that shares this env's inventory by reference.""" + return TextCraftEnv( + task=child_task, + recipe_db=self.recipe_db, # shared + inventory=self.inventory, # ALIASED — mutations propagate + ) + + # ------------------------------------------------------------------ actions + + def get_info(self, items: list[str]) -> str: + """Return JSON-text recipe info for each requested item.""" + records = [] + for item in items: + recipes = self.recipe_db.get_recipes_for_item(item) + records.append({ + "item": item, + "can_craft": self.recipe_db.can_craft(item), + "is_base": self.recipe_db.is_base_item(item), + "in_inventory": self.inventory.get(item, 0), + "crafting_depth": self.recipe_db.get_crafting_depth(item), + "recipes": [ + { + "ingredients": dict(r.ingredients), + "result_count": r.result_count, + } + for r in recipes + ], + }) + return json.dumps(records, separators=(",", ":")) + + def view_inventory(self) -> str: + """Return JSON-text snapshot of current inventory.""" + # Drop zero-counts for cleanliness. + clean = {k: v for k, v in self.inventory.items() if v > 0} + return json.dumps(clean, separators=(",", ":")) + + def craft( + self, ingredients: dict[str, int], target: tuple[str, int] | list + ) -> str: + """Consume ingredients, add target item. + + Validates against the recipe DB: + - target item must be craftable + - ingredients must match a known recipe (modulo tag resolution) + - target_count must be divisible by recipe.result_count + - all ingredients present in sufficient quantity + + On success: mutates inventory in place, returns "OK: ..." text. + On failure: returns "ERROR: ..." text. Inventory unchanged. + """ + # Accept tuple or list (JSON gives us list). + if isinstance(target, (list, tuple)) and len(target) == 2: + target_item, target_count = target[0], int(target[1]) + else: + return f"ERROR: target must be [item_name, count], got {target!r}" + + if target_count <= 0: + return f"ERROR: target count must be positive, got {target_count}" + + recipes = self.recipe_db.get_recipes_for_item(target_item) + if not recipes: + return f"ERROR: no recipe for {target_item!r} (is_base={self.recipe_db.is_base_item(target_item)})" + + # Find a matching recipe. A recipe matches if its ingredient set + # equals the requested ingredient set scaled by N (where N is the + # number of times the recipe must run to produce target_count). + # Tag ingredients accept any item that satisfies the tag. + matched_recipe = None + n_crafts = 0 + for recipe in recipes: + if target_count % recipe.result_count != 0: + continue + n = target_count // recipe.result_count + # Build the expected ingredient bag for n applications. + expected = {k: v * n for k, v in recipe.ingredients.items()} + # Resolve tags against provided ingredients. + resolved = self._match_ingredients(expected, ingredients) + if resolved is None: + continue + if resolved == dict(ingredients): + matched_recipe = recipe + n_crafts = n + break + + if matched_recipe is None: + recipe_summary = "; ".join( + f"{r.result_count}x {target_item} <- {dict(r.ingredients)}" + for r in recipes[:3] + ) + return ( + f"ERROR: ingredients {dict(ingredients)} don't match any recipe " + f"for {target_count}x {target_item}. Known recipes: {recipe_summary}" + ) + + # Validate inventory has enough of each ingredient. + for ing, count in ingredients.items(): + if self.inventory.get(ing, 0) < count: + return ( + f"ERROR: need {count}x {ing}, have {self.inventory.get(ing, 0)}. " + f"Inventory: {self.view_inventory()}" + ) + + # Consume. + for ing, count in ingredients.items(): + self.inventory[ing] = self.inventory.get(ing, 0) - count + if self.inventory[ing] <= 0: + del self.inventory[ing] + + # Produce. + self.inventory[target_item] = self.inventory.get(target_item, 0) + target_count + + return f"OK: crafted {target_count}x {target_item}. Inventory: {self.view_inventory()}" + + def _match_ingredients( + self, expected: dict[str, int], provided: dict[str, int] + ) -> dict[str, int] | None: + """Resolve tag-typed ingredients in ``expected`` against ``provided``. + + Returns the expected bag with tags rewritten to whichever concrete + item from ``provided`` satisfies them. Returns None if any tag + cannot be satisfied or counts don't line up. + """ + resolved: dict[str, int] = {} + provided_remaining = dict(provided) + # First copy over any non-tag expected items. + for k, v in expected.items(): + if not k.startswith("tag:"): + resolved[k] = v + provided_remaining[k] = provided_remaining.get(k, 0) - v + if provided_remaining[k] < 0: + return None + if provided_remaining[k] == 0: + del provided_remaining[k] + # Now resolve tags by consuming from provided_remaining. + for k, v in expected.items(): + if not k.startswith("tag:"): + continue + tag_name = k[len("tag:") :] + satisfying = set(self.recipe_db.get_items_for_tag(tag_name)) + # Find any provided item that satisfies the tag with enough count. + picked = None + for prov_item, prov_count in provided_remaining.items(): + if prov_item in satisfying and prov_count >= v: + picked = prov_item + break + if picked is None: + return None + resolved[picked] = resolved.get(picked, 0) + v + provided_remaining[picked] -= v + if provided_remaining[picked] == 0: + del provided_remaining[picked] + return resolved + + # ------------------------------------------------------------------ finish + + def finish(self, message: str) -> None: + self.finished = True + self.finish_message = message + + # ------------------------------------------------------------------ eval + + def evaluate(self) -> tuple[float, dict[str, Any]]: + """Return (score, info_dict) for reward computation. + + Score = 1.0 iff every target_item is present in inventory at >= + the requested count. Else 0.0 (binary, matches platoon). + """ + targets: dict[str, int] = self.task.misc.get("target_items", {}) if self.task.misc else {} + if not targets: + return 0.0, {"reason": "no target_items"} + + satisfied = 0 + for item, count in targets.items(): + if self.inventory.get(item, 0) >= count: + satisfied += 1 + + score = 1.0 if satisfied == len(targets) else 0.0 + info = { + "satisfied": satisfied, + "total_targets": len(targets), + "subagent_launched": self.subagent_launched, + "subagent_succeeded": self.subagent_succeeded, + } + return score, info diff --git a/astraflow/core/workflow/impl/textcraft/recipe_loader.py b/astraflow/core/workflow/impl/textcraft/recipe_loader.py new file mode 100644 index 0000000..e914282 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipe_loader.py @@ -0,0 +1,297 @@ +"""Recipe loader for Minecraft crafting recipes.""" + +import json +from collections import defaultdict +from pathlib import Path +from typing import Dict, List, Optional, Set, Tuple + + +def extract_item_name(item_str: str) -> str: + """Extract item name from minecraft:item_name format.""" + if ":" in item_str: + return item_str.split(":")[1] + return item_str + + +class Recipe: + """Represents a Minecraft crafting recipe.""" + + def __init__(self, recipe_data: dict, filename: str): + self.filename = filename + self.type = recipe_data.get("type", "") + + # Handle result - can be dict or list + result = recipe_data.get("result") + if isinstance(result, list): + # Some recipes have list results, use first one + result = result[0] + if isinstance(result, str): + # Some recipes have string results + self.result_item = extract_item_name(result) + self.result_count = 1 + elif isinstance(result, dict): + if "item" in result: + self.result_item = extract_item_name(result["item"]) + self.result_count = result.get("count", 1) + else: + raise ValueError(f"Invalid result format in {filename}: {result}") + else: + raise ValueError(f"Invalid result format in {filename}: {result}") + + # Parse ingredients based on recipe type + self.ingredients: Dict[str, int] = {} + + if self.type == "minecraft:crafting_shapeless": + # Shapeless: list of ingredients + for ing in recipe_data.get("ingredients", []): + item_name = None + if "item" in ing: + item_name = extract_item_name(ing["item"]) + elif "tag" in ing: + # For tags, we'll use the tag name as-is for now + item_name = f"tag:{extract_item_name(ing['tag'])}" + + if item_name: + self.ingredients[item_name] = self.ingredients.get(item_name, 0) + 1 + + elif self.type == "minecraft:crafting_shaped": + # Shaped: pattern + key + pattern = recipe_data.get("pattern", []) + key = recipe_data.get("key", {}) + + for row in pattern: + for char in row: + if char != " " and char in key: + ing = key[char] + item_name = None + if "item" in ing: + item_name = extract_item_name(ing["item"]) + elif "tag" in ing: + item_name = f"tag:{extract_item_name(ing['tag'])}" + + if item_name: + self.ingredients[item_name] = self.ingredients.get(item_name, 0) + 1 + + # Normalize item names (remove minecraft: prefix if present) + normalized_ingredients = {} + for item, count in self.ingredients.items(): + normalized_ingredients[item] = count + self.ingredients = normalized_ingredients + + def __repr__(self) -> str: + return f"Recipe({self.result_item} <- {self.ingredients})" + + +class RecipeDatabase: + """Database of all Minecraft recipes.""" + + def __init__(self, recipes_dir: Path): + self.recipes_dir = Path(recipes_dir) + self.recipes: Dict[str, List[Recipe]] = defaultdict(list) + self.all_items: Set[str] = set() + self.all_tags: Set[str] = set() # Track all tags found in recipes + self.tag_to_items: Dict[str, Set[str]] = defaultdict(set) # Map tags to items that satisfy them + self._load_all_recipes() + self._build_dependency_graph() + self._build_tag_mappings() + + def _load_all_recipes(self): + """Load all recipe JSON files.""" + for recipe_file in self.recipes_dir.glob("*.json"): + try: + with open(recipe_file, "r") as f: + recipe_data = json.load(f) + + # Only load crafting recipes (shaped and shapeless) + recipe_type = recipe_data.get("type", "") + if recipe_type not in ["minecraft:crafting_shaped", "minecraft:crafting_shapeless"]: + continue # Skip smelting, stonecutting, etc. + + recipe = Recipe(recipe_data, recipe_file.stem) + self.recipes[recipe.result_item].append(recipe) + self.all_items.add(recipe.result_item) + # Add ingredients to all_items and track tags + for ing in recipe.ingredients.keys(): + if ing.startswith("tag:"): + tag_name = ing.replace("tag:", "") + self.all_tags.add(tag_name) + # DO NOT add result item to tag mapping here - this causes incorrect mappings + # (e.g., warped_planks crafted from tag:warped_stems shouldn't satisfy tag:warped_stems) + # Pattern matching in _build_tag_mappings will handle correct mappings + else: + self.all_items.add(ing) + except Exception: + # Silently skip recipes we can't parse + continue + + def _build_dependency_graph(self): + """Build a dependency graph for finding hierarchical recipes.""" + # Items that can be crafted (have recipes) + self.craftable_items = set(self.recipes.keys()) + + # Items that are base materials (no recipes) + self.base_items = self.all_items - self.craftable_items + + def _build_tag_mappings(self): + """Build mappings from tags to items that satisfy them by analyzing recipes.""" + # For each tag, find items that can satisfy it + # An item satisfies a tag if it matches tag patterns (e.g., "planks" tag -> items ending in "_planks") + # NOTE: We do NOT add result items to tag mappings - if an item is crafted FROM a tag, + # it doesn't satisfy that tag (e.g., warped_planks is crafted from tag:warped_stems, + # but warped_planks doesn't satisfy tag:warped_stems) + + # First, clear and rebuild tag mappings more carefully + self.tag_to_items.clear() + + # DO NOT add result items to tag mappings - this was causing incorrect mappings + # (e.g., warped_planks being added to tag:warped_stems) + + # Now add items that match tag patterns more precisely + for tag_name in self.all_tags: + tag_lower = tag_name.lower() + + # Generic "planks" tag - all planks items + if tag_lower == "planks": + for item in self.all_items: + if item.endswith("_planks"): + self.tag_to_items[tag_name].add(item) + + # Generic "logs" tag - all log/stem items + elif tag_lower == "logs": + for item in self.all_items: + if item.endswith("_log") or item.endswith("_stem") or item == "log" or item == "stem": + self.tag_to_items[tag_name].add(item) + + # Specific wood type logs (e.g., "birch_logs") + elif tag_lower.endswith("_logs"): + wood_type = tag_lower.replace("_logs", "") + # Find items that match this specific wood type + for item in self.all_items: + if item.startswith(wood_type + "_log") or item.startswith(wood_type + "_stem"): + self.tag_to_items[tag_name].add(item) + + # Specific wood type stems (e.g., "crimson_stems") + elif tag_lower.endswith("_stems"): + wood_type = tag_lower.replace("_stems", "") + for item in self.all_items: + if item.startswith(wood_type + "_stem") or item.startswith(wood_type + "_log"): + self.tag_to_items[tag_name].add(item) + + # Wooden slabs + elif "wooden_slabs" in tag_lower or tag_lower == "wooden_slab": + for item in self.all_items: + if "_slab" in item and ("planks" in item or "wood" in item): + self.tag_to_items[tag_name].add(item) + + # Stone tool materials + elif "stone_tool" in tag_lower: + stone_items = ["cobblestone", "blackstone", "cobbled_deepslate", "stone"] + for item in stone_items: + if item in self.all_items: + self.tag_to_items[tag_name].add(item) + + # Stone crafting materials + elif "stone_crafting" in tag_lower: + stone_items = ["cobblestone", "stone", "smooth_stone"] + for item in stone_items: + if item in self.all_items: + self.tag_to_items[tag_name].add(item) + + # Coals + elif tag_lower == "coals": + coal_items = ["coal", "charcoal"] + for item in coal_items: + if item in self.all_items: + self.tag_to_items[tag_name].add(item) + + # Soul fire base blocks + elif "soul_fire" in tag_lower: + soul_items = ["soul_sand", "soul_soil"] + for item in soul_items: + if item in self.all_items: + self.tag_to_items[tag_name].add(item) + + # Wool + elif tag_lower == "wool": + for item in self.all_items: + if item.endswith("_wool"): + self.tag_to_items[tag_name].add(item) + + def get_items_for_tag(self, tag_name: str) -> List[str]: + """Get all items that satisfy a given tag.""" + return sorted(list(self.tag_to_items.get(tag_name, set()))) + + def get_recipes_for_item(self, item: str) -> List[Recipe]: + """Get all recipes that produce the given item.""" + return self.recipes.get(item, []) + + def can_craft(self, item: str) -> bool: + """Check if an item can be crafted.""" + return item in self.recipes + + def is_base_item(self, item: str) -> bool: + """Check if an item is a base material (cannot be crafted).""" + return item in self.base_items + + def get_crafting_depth(self, item: str, visited: Optional[Set[str]] = None) -> int: + """Get the maximum crafting depth required to craft an item.""" + if visited is None: + visited = set() + + if item in visited: + return 0 # Cycle detected + + if self.is_base_item(item): + return 0 + + if item not in self.recipes: + return 0 + + visited.add(item) + max_depth = 0 + + for recipe in self.recipes[item]: + for ingredient in recipe.ingredients.keys(): + if ingredient.startswith("tag:"): + continue # Skip tags for depth calculation + depth = self.get_crafting_depth(ingredient, visited.copy()) + max_depth = max(max_depth, depth + 1) + + return max_depth + + def find_hierarchical_recipes(self, min_depth: int = 2, max_depth: int = 5) -> List[str]: + """Find items that require hierarchical crafting (multiple steps).""" + hierarchical = [] + for item in self.craftable_items: + depth = self.get_crafting_depth(item) + if min_depth <= depth <= max_depth: + hierarchical.append(item) + return hierarchical + + def get_recipe_chain(self, item: str, visited: Optional[Set[str]] = None) -> List[Tuple[str, Recipe]]: + """Get a chain of recipes needed to craft an item.""" + if visited is None: + visited = set() + + if item in visited or self.is_base_item(item): + return [] + + if item not in self.recipes: + return [] + + visited.add(item) + recipes = self.recipes[item] + if not recipes: + return [] + + # Use the first recipe (could be improved to select best) + recipe = recipes[0] + chain = [(item, recipe)] + + for ingredient in recipe.ingredients.keys(): + if ingredient.startswith("tag:"): + continue + sub_chain = self.get_recipe_chain(ingredient, visited.copy()) + chain.extend(sub_chain) + + return chain diff --git a/astraflow/core/workflow/impl/textcraft/recipes/acacia_boat.json b/astraflow/core/workflow/impl/textcraft/recipes/acacia_boat.json new file mode 100644 index 0000000..c720cff --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/acacia_boat.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "boat", + "pattern": [ + "# #", + "###" + ], + "key": { + "#": { + "item": "minecraft:acacia_planks" + } + }, + "result": { + "item": "minecraft:acacia_boat" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/acacia_button.json b/astraflow/core/workflow/impl/textcraft/recipes/acacia_button.json new file mode 100644 index 0000000..8c74784 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/acacia_button.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wooden_button", + "ingredients": [ + { + "item": "minecraft:acacia_planks" + } + ], + "result": { + "item": "minecraft:acacia_button" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/acacia_door.json b/astraflow/core/workflow/impl/textcraft/recipes/acacia_door.json new file mode 100644 index 0000000..e4cbbd8 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/acacia_door.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_door", + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:acacia_planks" + } + }, + "result": { + "item": "minecraft:acacia_door", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/acacia_fence.json b/astraflow/core/workflow/impl/textcraft/recipes/acacia_fence.json new file mode 100644 index 0000000..6f2de27 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/acacia_fence.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_fence", + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "W": { + "item": "minecraft:acacia_planks" + } + }, + "result": { + "item": "minecraft:acacia_fence", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/acacia_fence_gate.json b/astraflow/core/workflow/impl/textcraft/recipes/acacia_fence_gate.json new file mode 100644 index 0000000..cbd3b24 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/acacia_fence_gate.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_fence_gate", + "pattern": [ + "#W#", + "#W#" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "W": { + "item": "minecraft:acacia_planks" + } + }, + "result": { + "item": "minecraft:acacia_fence_gate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/acacia_planks.json b/astraflow/core/workflow/impl/textcraft/recipes/acacia_planks.json new file mode 100644 index 0000000..c420aa0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/acacia_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "planks", + "ingredients": [ + { + "tag": "minecraft:acacia_logs" + } + ], + "result": { + "item": "minecraft:acacia_planks", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/acacia_pressure_plate.json b/astraflow/core/workflow/impl/textcraft/recipes/acacia_pressure_plate.json new file mode 100644 index 0000000..4cae648 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/acacia_pressure_plate.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_pressure_plate", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:acacia_planks" + } + }, + "result": { + "item": "minecraft:acacia_pressure_plate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/acacia_sign.json b/astraflow/core/workflow/impl/textcraft/recipes/acacia_sign.json new file mode 100644 index 0000000..bfb054d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/acacia_sign.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "sign", + "pattern": [ + "###", + "###", + " X " + ], + "key": { + "#": { + "item": "minecraft:acacia_planks" + }, + "X": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:acacia_sign", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/acacia_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/acacia_slab.json new file mode 100644 index 0000000..3cbd581 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/acacia_slab.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_slab", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:acacia_planks" + } + }, + "result": { + "item": "minecraft:acacia_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/acacia_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/acacia_stairs.json new file mode 100644 index 0000000..2218bb3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/acacia_stairs.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_stairs", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:acacia_planks" + } + }, + "result": { + "item": "minecraft:acacia_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/acacia_trapdoor.json b/astraflow/core/workflow/impl/textcraft/recipes/acacia_trapdoor.json new file mode 100644 index 0000000..8868cd3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/acacia_trapdoor.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_trapdoor", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:acacia_planks" + } + }, + "result": { + "item": "minecraft:acacia_trapdoor", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/acacia_wood.json b/astraflow/core/workflow/impl/textcraft/recipes/acacia_wood.json new file mode 100644 index 0000000..3d87063 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/acacia_wood.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bark", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:acacia_log" + } + }, + "result": { + "item": "minecraft:acacia_wood", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/activator_rail.json b/astraflow/core/workflow/impl/textcraft/recipes/activator_rail.json new file mode 100644 index 0000000..a697a0e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/activator_rail.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XSX", + "X#X", + "XSX" + ], + "key": { + "#": { + "item": "minecraft:redstone_torch" + }, + "S": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:activator_rail", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/andesite.json b/astraflow/core/workflow/impl/textcraft/recipes/andesite.json new file mode 100644 index 0000000..c061485 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/andesite.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:diorite" + }, + { + "item": "minecraft:cobblestone" + } + ], + "result": { + "item": "minecraft:andesite", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/andesite_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/andesite_slab.json new file mode 100644 index 0000000..f4a6c39 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/andesite_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:andesite" + } + }, + "result": { + "item": "minecraft:andesite_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/andesite_slab_from_andesite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/andesite_slab_from_andesite_stonecutting.json new file mode 100644 index 0000000..9f45b4a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/andesite_slab_from_andesite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:andesite" + }, + "result": "minecraft:andesite_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/andesite_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/andesite_stairs.json new file mode 100644 index 0000000..a5ba1c0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/andesite_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:andesite" + } + }, + "result": { + "item": "minecraft:andesite_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/andesite_stairs_from_andesite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/andesite_stairs_from_andesite_stonecutting.json new file mode 100644 index 0000000..398f661 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/andesite_stairs_from_andesite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:andesite" + }, + "result": "minecraft:andesite_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/andesite_wall.json b/astraflow/core/workflow/impl/textcraft/recipes/andesite_wall.json new file mode 100644 index 0000000..bcad685 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/andesite_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:andesite" + } + }, + "result": { + "item": "minecraft:andesite_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/andesite_wall_from_andesite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/andesite_wall_from_andesite_stonecutting.json new file mode 100644 index 0000000..0fd2650 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/andesite_wall_from_andesite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:andesite" + }, + "result": "minecraft:andesite_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/anvil.json b/astraflow/core/workflow/impl/textcraft/recipes/anvil.json new file mode 100644 index 0000000..fba3814 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/anvil.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "III", + " i ", + "iii" + ], + "key": { + "I": { + "item": "minecraft:iron_block" + }, + "i": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:anvil" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/armor_dye.json b/astraflow/core/workflow/impl/textcraft/recipes/armor_dye.json new file mode 100644 index 0000000..09dd44f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/armor_dye.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:crafting_special_armordye" +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/armor_stand.json b/astraflow/core/workflow/impl/textcraft/recipes/armor_stand.json new file mode 100644 index 0000000..d77f498 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/armor_stand.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "///", + " / ", + "/_/" + ], + "key": { + "/": { + "item": "minecraft:stick" + }, + "_": { + "item": "minecraft:smooth_stone_slab" + } + }, + "result": { + "item": "minecraft:armor_stand" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/arrow.json b/astraflow/core/workflow/impl/textcraft/recipes/arrow.json new file mode 100644 index 0000000..2d8980f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/arrow.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X", + "#", + "Y" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:flint" + }, + "Y": { + "item": "minecraft:feather" + } + }, + "result": { + "item": "minecraft:arrow", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/baked_potato.json b/astraflow/core/workflow/impl/textcraft/recipes/baked_potato.json new file mode 100644 index 0000000..a50aa2b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/baked_potato.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:potato" + }, + "result": "minecraft:baked_potato", + "experience": 0.35, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/baked_potato_from_campfire_cooking.json b/astraflow/core/workflow/impl/textcraft/recipes/baked_potato_from_campfire_cooking.json new file mode 100644 index 0000000..8b36c4e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/baked_potato_from_campfire_cooking.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:campfire_cooking", + "ingredient": { + "item": "minecraft:potato" + }, + "result": "minecraft:baked_potato", + "experience": 0.35, + "cookingtime": 600 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/baked_potato_from_smoking.json b/astraflow/core/workflow/impl/textcraft/recipes/baked_potato_from_smoking.json new file mode 100644 index 0000000..6957580 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/baked_potato_from_smoking.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smoking", + "ingredient": { + "item": "minecraft:potato" + }, + "result": "minecraft:baked_potato", + "experience": 0.35, + "cookingtime": 100 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/banner_duplicate.json b/astraflow/core/workflow/impl/textcraft/recipes/banner_duplicate.json new file mode 100644 index 0000000..1af352e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/banner_duplicate.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:crafting_special_bannerduplicate" +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/barrel.json b/astraflow/core/workflow/impl/textcraft/recipes/barrel.json new file mode 100644 index 0000000..4cdf148 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/barrel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "PSP", + "P P", + "PSP" + ], + "key": { + "P": { + "tag": "minecraft:planks" + }, + "S": { + "tag": "minecraft:wooden_slabs" + } + }, + "result": { + "item": "minecraft:barrel" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/beacon.json b/astraflow/core/workflow/impl/textcraft/recipes/beacon.json new file mode 100644 index 0000000..7b3540d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/beacon.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "GGG", + "GSG", + "OOO" + ], + "key": { + "S": { + "item": "minecraft:nether_star" + }, + "G": { + "item": "minecraft:glass" + }, + "O": { + "item": "minecraft:obsidian" + } + }, + "result": { + "item": "minecraft:beacon" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/beehive.json b/astraflow/core/workflow/impl/textcraft/recipes/beehive.json new file mode 100644 index 0000000..eddbb9e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/beehive.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "PPP", + "HHH", + "PPP" + ], + "key": { + "P": { + "tag": "minecraft:planks" + }, + "H": { + "item": "minecraft:honeycomb" + } + }, + "result": { + "item": "minecraft:beehive" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/beetroot_soup.json b/astraflow/core/workflow/impl/textcraft/recipes/beetroot_soup.json new file mode 100644 index 0000000..ef6cf63 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/beetroot_soup.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:bowl" + }, + { + "item": "minecraft:beetroot" + }, + { + "item": "minecraft:beetroot" + }, + { + "item": "minecraft:beetroot" + }, + { + "item": "minecraft:beetroot" + }, + { + "item": "minecraft:beetroot" + }, + { + "item": "minecraft:beetroot" + } + ], + "result": { + "item": "minecraft:beetroot_soup" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/birch_boat.json b/astraflow/core/workflow/impl/textcraft/recipes/birch_boat.json new file mode 100644 index 0000000..644bb8e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/birch_boat.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "boat", + "pattern": [ + "# #", + "###" + ], + "key": { + "#": { + "item": "minecraft:birch_planks" + } + }, + "result": { + "item": "minecraft:birch_boat" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/birch_button.json b/astraflow/core/workflow/impl/textcraft/recipes/birch_button.json new file mode 100644 index 0000000..0947534 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/birch_button.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wooden_button", + "ingredients": [ + { + "item": "minecraft:birch_planks" + } + ], + "result": { + "item": "minecraft:birch_button" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/birch_door.json b/astraflow/core/workflow/impl/textcraft/recipes/birch_door.json new file mode 100644 index 0000000..3e454a2 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/birch_door.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_door", + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:birch_planks" + } + }, + "result": { + "item": "minecraft:birch_door", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/birch_fence.json b/astraflow/core/workflow/impl/textcraft/recipes/birch_fence.json new file mode 100644 index 0000000..d60256a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/birch_fence.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_fence", + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "W": { + "item": "minecraft:birch_planks" + } + }, + "result": { + "item": "minecraft:birch_fence", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/birch_fence_gate.json b/astraflow/core/workflow/impl/textcraft/recipes/birch_fence_gate.json new file mode 100644 index 0000000..af0bb7d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/birch_fence_gate.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_fence_gate", + "pattern": [ + "#W#", + "#W#" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "W": { + "item": "minecraft:birch_planks" + } + }, + "result": { + "item": "minecraft:birch_fence_gate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/birch_planks.json b/astraflow/core/workflow/impl/textcraft/recipes/birch_planks.json new file mode 100644 index 0000000..8d2eeaa --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/birch_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "planks", + "ingredients": [ + { + "tag": "minecraft:birch_logs" + } + ], + "result": { + "item": "minecraft:birch_planks", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/birch_pressure_plate.json b/astraflow/core/workflow/impl/textcraft/recipes/birch_pressure_plate.json new file mode 100644 index 0000000..a4924df --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/birch_pressure_plate.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_pressure_plate", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:birch_planks" + } + }, + "result": { + "item": "minecraft:birch_pressure_plate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/birch_sign.json b/astraflow/core/workflow/impl/textcraft/recipes/birch_sign.json new file mode 100644 index 0000000..0f70b02 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/birch_sign.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "sign", + "pattern": [ + "###", + "###", + " X " + ], + "key": { + "#": { + "item": "minecraft:birch_planks" + }, + "X": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:birch_sign", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/birch_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/birch_slab.json new file mode 100644 index 0000000..5571288 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/birch_slab.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_slab", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:birch_planks" + } + }, + "result": { + "item": "minecraft:birch_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/birch_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/birch_stairs.json new file mode 100644 index 0000000..4f6478f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/birch_stairs.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_stairs", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:birch_planks" + } + }, + "result": { + "item": "minecraft:birch_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/birch_trapdoor.json b/astraflow/core/workflow/impl/textcraft/recipes/birch_trapdoor.json new file mode 100644 index 0000000..01d530c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/birch_trapdoor.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_trapdoor", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:birch_planks" + } + }, + "result": { + "item": "minecraft:birch_trapdoor", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/birch_wood.json b/astraflow/core/workflow/impl/textcraft/recipes/birch_wood.json new file mode 100644 index 0000000..cce7b81 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/birch_wood.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bark", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:birch_log" + } + }, + "result": { + "item": "minecraft:birch_wood", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/black_banner.json b/astraflow/core/workflow/impl/textcraft/recipes/black_banner.json new file mode 100644 index 0000000..321597c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/black_banner.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "banner", + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": { + "item": "minecraft:black_wool" + }, + "|": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:black_banner" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/black_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/black_bed.json new file mode 100644 index 0000000..9f2b9c7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/black_bed.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed", + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": { + "item": "minecraft:black_wool" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:black_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/black_bed_from_white_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/black_bed_from_white_bed.json new file mode 100644 index 0000000..37f3497 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/black_bed_from_white_bed.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "dyed_bed", + "ingredients": [ + { + "item": "minecraft:white_bed" + }, + { + "item": "minecraft:black_dye" + } + ], + "result": { + "item": "minecraft:black_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/black_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/black_carpet.json new file mode 100644 index 0000000..f794f06 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/black_carpet.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:black_wool" + } + }, + "result": { + "item": "minecraft:black_carpet", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/black_carpet_from_white_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/black_carpet_from_white_carpet.json new file mode 100644 index 0000000..f806475 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/black_carpet_from_white_carpet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:white_carpet" + }, + "$": { + "item": "minecraft:black_dye" + } + }, + "result": { + "item": "minecraft:black_carpet", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/black_concrete_powder.json b/astraflow/core/workflow/impl/textcraft/recipes/black_concrete_powder.json new file mode 100644 index 0000000..1ccccf6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/black_concrete_powder.json @@ -0,0 +1,37 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "concrete_powder", + "ingredients": [ + { + "item": "minecraft:black_dye" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + } + ], + "result": { + "item": "minecraft:black_concrete_powder", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/black_dye.json b/astraflow/core/workflow/impl/textcraft/recipes/black_dye.json new file mode 100644 index 0000000..c0c21f9 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/black_dye.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "black_dye", + "ingredients": [ + { + "item": "minecraft:ink_sac" + } + ], + "result": { + "item": "minecraft:black_dye" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/black_dye_from_wither_rose.json b/astraflow/core/workflow/impl/textcraft/recipes/black_dye_from_wither_rose.json new file mode 100644 index 0000000..7ba123d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/black_dye_from_wither_rose.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "black_dye", + "ingredients": [ + { + "item": "minecraft:wither_rose" + } + ], + "result": { + "item": "minecraft:black_dye" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/black_glazed_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/black_glazed_terracotta.json new file mode 100644 index 0000000..71d9dd4 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/black_glazed_terracotta.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:black_terracotta" + }, + "result": "minecraft:black_glazed_terracotta", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/black_stained_glass.json b/astraflow/core/workflow/impl/textcraft/recipes/black_stained_glass.json new file mode 100644 index 0000000..65f84a0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/black_stained_glass.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass" + }, + "X": { + "item": "minecraft:black_dye" + } + }, + "result": { + "item": "minecraft:black_stained_glass", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/black_stained_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/black_stained_glass_pane.json new file mode 100644 index 0000000..4f5b07c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/black_stained_glass_pane.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:black_stained_glass" + } + }, + "result": { + "item": "minecraft:black_stained_glass_pane", + "count": 16 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/black_stained_glass_pane_from_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/black_stained_glass_pane_from_glass_pane.json new file mode 100644 index 0000000..5d9a817 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/black_stained_glass_pane_from_glass_pane.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass_pane" + }, + "$": { + "item": "minecraft:black_dye" + } + }, + "result": { + "item": "minecraft:black_stained_glass_pane", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/black_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/black_terracotta.json new file mode 100644 index 0000000..f10ac46 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/black_terracotta.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_terracotta", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:terracotta" + }, + "X": { + "item": "minecraft:black_dye" + } + }, + "result": { + "item": "minecraft:black_terracotta", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/black_wool.json b/astraflow/core/workflow/impl/textcraft/recipes/black_wool.json new file mode 100644 index 0000000..748f907 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/black_wool.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wool", + "ingredients": [ + { + "item": "minecraft:black_dye" + }, + { + "item": "minecraft:white_wool" + } + ], + "result": { + "item": "minecraft:black_wool" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blackstone_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/blackstone_slab.json new file mode 100644 index 0000000..8aa1f44 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blackstone_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:blackstone" + } + }, + "result": { + "item": "minecraft:blackstone_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blackstone_slab_from_blackstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/blackstone_slab_from_blackstone_stonecutting.json new file mode 100644 index 0000000..fbf0337 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blackstone_slab_from_blackstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:blackstone" + }, + "result": "minecraft:blackstone_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blackstone_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/blackstone_stairs.json new file mode 100644 index 0000000..ccb230e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blackstone_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:blackstone" + } + }, + "result": { + "item": "minecraft:blackstone_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blackstone_stairs_from_blackstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/blackstone_stairs_from_blackstone_stonecutting.json new file mode 100644 index 0000000..c9a0c3c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blackstone_stairs_from_blackstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:blackstone" + }, + "result": "minecraft:blackstone_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blackstone_wall.json b/astraflow/core/workflow/impl/textcraft/recipes/blackstone_wall.json new file mode 100644 index 0000000..dd4e7a7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blackstone_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:blackstone" + } + }, + "result": { + "item": "minecraft:blackstone_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blackstone_wall_from_blackstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/blackstone_wall_from_blackstone_stonecutting.json new file mode 100644 index 0000000..fe09806 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blackstone_wall_from_blackstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:blackstone" + }, + "result": "minecraft:blackstone_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blast_furnace.json b/astraflow/core/workflow/impl/textcraft/recipes/blast_furnace.json new file mode 100644 index 0000000..ea0c117 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blast_furnace.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "III", + "IXI", + "###" + ], + "key": { + "#": { + "item": "minecraft:smooth_stone" + }, + "X": { + "item": "minecraft:furnace" + }, + "I": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:blast_furnace" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blaze_powder.json b/astraflow/core/workflow/impl/textcraft/recipes/blaze_powder.json new file mode 100644 index 0000000..b7be695 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blaze_powder.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:blaze_rod" + } + ], + "result": { + "item": "minecraft:blaze_powder", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blue_banner.json b/astraflow/core/workflow/impl/textcraft/recipes/blue_banner.json new file mode 100644 index 0000000..f079c78 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blue_banner.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "banner", + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": { + "item": "minecraft:blue_wool" + }, + "|": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:blue_banner" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blue_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/blue_bed.json new file mode 100644 index 0000000..e2ff217 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blue_bed.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed", + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": { + "item": "minecraft:blue_wool" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:blue_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blue_bed_from_white_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/blue_bed_from_white_bed.json new file mode 100644 index 0000000..7f8c551 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blue_bed_from_white_bed.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "dyed_bed", + "ingredients": [ + { + "item": "minecraft:white_bed" + }, + { + "item": "minecraft:blue_dye" + } + ], + "result": { + "item": "minecraft:blue_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blue_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/blue_carpet.json new file mode 100644 index 0000000..246e62f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blue_carpet.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:blue_wool" + } + }, + "result": { + "item": "minecraft:blue_carpet", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blue_carpet_from_white_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/blue_carpet_from_white_carpet.json new file mode 100644 index 0000000..30dddcf --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blue_carpet_from_white_carpet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:white_carpet" + }, + "$": { + "item": "minecraft:blue_dye" + } + }, + "result": { + "item": "minecraft:blue_carpet", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blue_concrete_powder.json b/astraflow/core/workflow/impl/textcraft/recipes/blue_concrete_powder.json new file mode 100644 index 0000000..c739f62 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blue_concrete_powder.json @@ -0,0 +1,37 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "concrete_powder", + "ingredients": [ + { + "item": "minecraft:blue_dye" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + } + ], + "result": { + "item": "minecraft:blue_concrete_powder", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blue_dye.json b/astraflow/core/workflow/impl/textcraft/recipes/blue_dye.json new file mode 100644 index 0000000..5ddf1a9 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blue_dye.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "blue_dye", + "ingredients": [ + { + "item": "minecraft:lapis_lazuli" + } + ], + "result": { + "item": "minecraft:blue_dye" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blue_dye_from_cornflower.json b/astraflow/core/workflow/impl/textcraft/recipes/blue_dye_from_cornflower.json new file mode 100644 index 0000000..a15fc5d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blue_dye_from_cornflower.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "blue_dye", + "ingredients": [ + { + "item": "minecraft:cornflower" + } + ], + "result": { + "item": "minecraft:blue_dye" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blue_glazed_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/blue_glazed_terracotta.json new file mode 100644 index 0000000..590f11e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blue_glazed_terracotta.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:blue_terracotta" + }, + "result": "minecraft:blue_glazed_terracotta", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blue_ice.json b/astraflow/core/workflow/impl/textcraft/recipes/blue_ice.json new file mode 100644 index 0000000..d28f4b2 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blue_ice.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:packed_ice" + } + }, + "result": { + "item": "minecraft:blue_ice" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blue_stained_glass.json b/astraflow/core/workflow/impl/textcraft/recipes/blue_stained_glass.json new file mode 100644 index 0000000..4b1d0f7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blue_stained_glass.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass" + }, + "X": { + "item": "minecraft:blue_dye" + } + }, + "result": { + "item": "minecraft:blue_stained_glass", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blue_stained_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/blue_stained_glass_pane.json new file mode 100644 index 0000000..53f76b3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blue_stained_glass_pane.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:blue_stained_glass" + } + }, + "result": { + "item": "minecraft:blue_stained_glass_pane", + "count": 16 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blue_stained_glass_pane_from_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/blue_stained_glass_pane_from_glass_pane.json new file mode 100644 index 0000000..82e02fc --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blue_stained_glass_pane_from_glass_pane.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass_pane" + }, + "$": { + "item": "minecraft:blue_dye" + } + }, + "result": { + "item": "minecraft:blue_stained_glass_pane", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blue_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/blue_terracotta.json new file mode 100644 index 0000000..a5606c9 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blue_terracotta.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_terracotta", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:terracotta" + }, + "X": { + "item": "minecraft:blue_dye" + } + }, + "result": { + "item": "minecraft:blue_terracotta", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/blue_wool.json b/astraflow/core/workflow/impl/textcraft/recipes/blue_wool.json new file mode 100644 index 0000000..7703b8a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/blue_wool.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wool", + "ingredients": [ + { + "item": "minecraft:blue_dye" + }, + { + "item": "minecraft:white_wool" + } + ], + "result": { + "item": "minecraft:blue_wool" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/bone_block.json b/astraflow/core/workflow/impl/textcraft/recipes/bone_block.json new file mode 100644 index 0000000..803fdbb --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/bone_block.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XXX", + "XXX", + "XXX" + ], + "key": { + "X": { + "item": "minecraft:bone_meal" + } + }, + "result": { + "item": "minecraft:bone_block" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/bone_meal.json b/astraflow/core/workflow/impl/textcraft/recipes/bone_meal.json new file mode 100644 index 0000000..52ffbec --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/bone_meal.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "bonemeal", + "ingredients": [ + { + "item": "minecraft:bone" + } + ], + "result": { + "item": "minecraft:bone_meal", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/bone_meal_from_bone_block.json b/astraflow/core/workflow/impl/textcraft/recipes/bone_meal_from_bone_block.json new file mode 100644 index 0000000..53a2d4a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/bone_meal_from_bone_block.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "bonemeal", + "ingredients": [ + { + "item": "minecraft:bone_block" + } + ], + "result": { + "item": "minecraft:bone_meal", + "count": 9 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/book.json b/astraflow/core/workflow/impl/textcraft/recipes/book.json new file mode 100644 index 0000000..1994cdc --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/book.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:leather" + } + ], + "result": { + "item": "minecraft:book" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/book_cloning.json b/astraflow/core/workflow/impl/textcraft/recipes/book_cloning.json new file mode 100644 index 0000000..f17b05f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/book_cloning.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:crafting_special_bookcloning" +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/bookshelf.json b/astraflow/core/workflow/impl/textcraft/recipes/bookshelf.json new file mode 100644 index 0000000..d4ff4f7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/bookshelf.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "XXX", + "###" + ], + "key": { + "#": { + "tag": "minecraft:planks" + }, + "X": { + "item": "minecraft:book" + } + }, + "result": { + "item": "minecraft:bookshelf" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/bow.json b/astraflow/core/workflow/impl/textcraft/recipes/bow.json new file mode 100644 index 0000000..c1426e2 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/bow.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " #X", + "# X", + " #X" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:string" + } + }, + "result": { + "item": "minecraft:bow" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/bowl.json b/astraflow/core/workflow/impl/textcraft/recipes/bowl.json new file mode 100644 index 0000000..b5da023 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/bowl.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# #", + " # " + ], + "key": { + "#": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:bowl", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/bread.json b/astraflow/core/workflow/impl/textcraft/recipes/bread.json new file mode 100644 index 0000000..e354265 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/bread.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:wheat" + } + }, + "result": { + "item": "minecraft:bread" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brewing_stand.json b/astraflow/core/workflow/impl/textcraft/recipes/brewing_stand.json new file mode 100644 index 0000000..986306c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brewing_stand.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " B ", + "###" + ], + "key": { + "B": { + "item": "minecraft:blaze_rod" + }, + "#": { + "tag": "minecraft:stone_crafting_materials" + } + }, + "result": { + "item": "minecraft:brewing_stand" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brick.json b/astraflow/core/workflow/impl/textcraft/recipes/brick.json new file mode 100644 index 0000000..90974f8 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brick.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:clay_ball" + }, + "result": "minecraft:brick", + "experience": 0.3, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brick_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/brick_slab.json new file mode 100644 index 0000000..49cd85a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brick_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:bricks" + } + }, + "result": { + "item": "minecraft:brick_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brick_slab_from_bricks_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/brick_slab_from_bricks_stonecutting.json new file mode 100644 index 0000000..693c225 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brick_slab_from_bricks_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:bricks" + }, + "result": "minecraft:brick_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brick_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/brick_stairs.json new file mode 100644 index 0000000..4a8a928 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brick_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:bricks" + } + }, + "result": { + "item": "minecraft:brick_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brick_stairs_from_bricks_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/brick_stairs_from_bricks_stonecutting.json new file mode 100644 index 0000000..73daa50 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brick_stairs_from_bricks_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:bricks" + }, + "result": "minecraft:brick_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brick_wall.json b/astraflow/core/workflow/impl/textcraft/recipes/brick_wall.json new file mode 100644 index 0000000..c3e564d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brick_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:bricks" + } + }, + "result": { + "item": "minecraft:brick_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brick_wall_from_bricks_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/brick_wall_from_bricks_stonecutting.json new file mode 100644 index 0000000..fd1c37c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brick_wall_from_bricks_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:bricks" + }, + "result": "minecraft:brick_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/bricks.json b/astraflow/core/workflow/impl/textcraft/recipes/bricks.json new file mode 100644 index 0000000..1c4fadf --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/bricks.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:brick" + } + }, + "result": { + "item": "minecraft:bricks" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brown_banner.json b/astraflow/core/workflow/impl/textcraft/recipes/brown_banner.json new file mode 100644 index 0000000..b18a7dc --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brown_banner.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "banner", + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": { + "item": "minecraft:brown_wool" + }, + "|": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:brown_banner" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brown_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/brown_bed.json new file mode 100644 index 0000000..1dcc26a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brown_bed.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed", + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": { + "item": "minecraft:brown_wool" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:brown_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brown_bed_from_white_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/brown_bed_from_white_bed.json new file mode 100644 index 0000000..9730508 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brown_bed_from_white_bed.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "dyed_bed", + "ingredients": [ + { + "item": "minecraft:white_bed" + }, + { + "item": "minecraft:brown_dye" + } + ], + "result": { + "item": "minecraft:brown_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brown_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/brown_carpet.json new file mode 100644 index 0000000..2cbcad7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brown_carpet.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:brown_wool" + } + }, + "result": { + "item": "minecraft:brown_carpet", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brown_carpet_from_white_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/brown_carpet_from_white_carpet.json new file mode 100644 index 0000000..c129639 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brown_carpet_from_white_carpet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:white_carpet" + }, + "$": { + "item": "minecraft:brown_dye" + } + }, + "result": { + "item": "minecraft:brown_carpet", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brown_concrete_powder.json b/astraflow/core/workflow/impl/textcraft/recipes/brown_concrete_powder.json new file mode 100644 index 0000000..9243a2f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brown_concrete_powder.json @@ -0,0 +1,37 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "concrete_powder", + "ingredients": [ + { + "item": "minecraft:brown_dye" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + } + ], + "result": { + "item": "minecraft:brown_concrete_powder", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brown_dye.json b/astraflow/core/workflow/impl/textcraft/recipes/brown_dye.json new file mode 100644 index 0000000..b46d98c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brown_dye.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "brown_dye", + "ingredients": [ + { + "item": "minecraft:cocoa_beans" + } + ], + "result": { + "item": "minecraft:brown_dye" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brown_glazed_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/brown_glazed_terracotta.json new file mode 100644 index 0000000..1100334 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brown_glazed_terracotta.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:brown_terracotta" + }, + "result": "minecraft:brown_glazed_terracotta", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brown_stained_glass.json b/astraflow/core/workflow/impl/textcraft/recipes/brown_stained_glass.json new file mode 100644 index 0000000..b3a2f45 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brown_stained_glass.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass" + }, + "X": { + "item": "minecraft:brown_dye" + } + }, + "result": { + "item": "minecraft:brown_stained_glass", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brown_stained_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/brown_stained_glass_pane.json new file mode 100644 index 0000000..9f10b1a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brown_stained_glass_pane.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:brown_stained_glass" + } + }, + "result": { + "item": "minecraft:brown_stained_glass_pane", + "count": 16 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brown_stained_glass_pane_from_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/brown_stained_glass_pane_from_glass_pane.json new file mode 100644 index 0000000..7e20375 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brown_stained_glass_pane_from_glass_pane.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass_pane" + }, + "$": { + "item": "minecraft:brown_dye" + } + }, + "result": { + "item": "minecraft:brown_stained_glass_pane", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brown_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/brown_terracotta.json new file mode 100644 index 0000000..e3dc392 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brown_terracotta.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_terracotta", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:terracotta" + }, + "X": { + "item": "minecraft:brown_dye" + } + }, + "result": { + "item": "minecraft:brown_terracotta", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/brown_wool.json b/astraflow/core/workflow/impl/textcraft/recipes/brown_wool.json new file mode 100644 index 0000000..92e20fc --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/brown_wool.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wool", + "ingredients": [ + { + "item": "minecraft:brown_dye" + }, + { + "item": "minecraft:white_wool" + } + ], + "result": { + "item": "minecraft:brown_wool" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/bucket.json b/astraflow/core/workflow/impl/textcraft/recipes/bucket.json new file mode 100644 index 0000000..f648245 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/bucket.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# #", + " # " + ], + "key": { + "#": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:bucket" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cake.json b/astraflow/core/workflow/impl/textcraft/recipes/cake.json new file mode 100644 index 0000000..1c50885 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cake.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "AAA", + "BEB", + "CCC" + ], + "key": { + "A": { + "item": "minecraft:milk_bucket" + }, + "B": { + "item": "minecraft:sugar" + }, + "C": { + "item": "minecraft:wheat" + }, + "E": { + "item": "minecraft:egg" + } + }, + "result": { + "item": "minecraft:cake" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/campfire.json b/astraflow/core/workflow/impl/textcraft/recipes/campfire.json new file mode 100644 index 0000000..3cdb158 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/campfire.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " S ", + "SCS", + "LLL" + ], + "key": { + "L": { + "tag": "minecraft:logs" + }, + "S": { + "item": "minecraft:stick" + }, + "C": { + "tag": "minecraft:coals" + } + }, + "result": { + "item": "minecraft:campfire" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/carrot_on_a_stick.json b/astraflow/core/workflow/impl/textcraft/recipes/carrot_on_a_stick.json new file mode 100644 index 0000000..a78fe1f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/carrot_on_a_stick.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + " X" + ], + "key": { + "#": { + "item": "minecraft:fishing_rod" + }, + "X": { + "item": "minecraft:carrot" + } + }, + "result": { + "item": "minecraft:carrot_on_a_stick" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cartography_table.json b/astraflow/core/workflow/impl/textcraft/recipes/cartography_table.json new file mode 100644 index 0000000..1fac415 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cartography_table.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "@@", + "##", + "##" + ], + "key": { + "#": { + "tag": "minecraft:planks" + }, + "@": { + "item": "minecraft:paper" + } + }, + "result": { + "item": "minecraft:cartography_table" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cauldron.json b/astraflow/core/workflow/impl/textcraft/recipes/cauldron.json new file mode 100644 index 0000000..542680b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cauldron.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# #", + "# #", + "###" + ], + "key": { + "#": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:cauldron" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/chain.json b/astraflow/core/workflow/impl/textcraft/recipes/chain.json new file mode 100644 index 0000000..45b2dc6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/chain.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "N", + "I", + "N" + ], + "key": { + "I": { + "item": "minecraft:iron_ingot" + }, + "N": { + "item": "minecraft:iron_nugget" + } + }, + "result": { + "item": "minecraft:chain" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/charcoal.json b/astraflow/core/workflow/impl/textcraft/recipes/charcoal.json new file mode 100644 index 0000000..3a6cc52 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/charcoal.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "tag": "minecraft:logs_that_burn" + }, + "result": "minecraft:charcoal", + "experience": 0.15, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/chest.json b/astraflow/core/workflow/impl/textcraft/recipes/chest.json new file mode 100644 index 0000000..6a289e0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/chest.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "# #", + "###" + ], + "key": { + "#": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:chest" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/chest_minecart.json b/astraflow/core/workflow/impl/textcraft/recipes/chest_minecart.json new file mode 100644 index 0000000..f0fc9ba --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/chest_minecart.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "A", + "B" + ], + "key": { + "A": { + "item": "minecraft:chest" + }, + "B": { + "item": "minecraft:minecart" + } + }, + "result": { + "item": "minecraft:chest_minecart" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/chiseled_nether_bricks.json b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_nether_bricks.json new file mode 100644 index 0000000..f07d596 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_nether_bricks.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "#" + ], + "key": { + "#": { + "item": "minecraft:nether_brick_slab" + } + }, + "result": { + "item": "minecraft:chiseled_nether_bricks" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/chiseled_nether_bricks_from_nether_bricks_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_nether_bricks_from_nether_bricks_stonecutting.json new file mode 100644 index 0000000..b51ce73 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_nether_bricks_from_nether_bricks_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:nether_bricks" + }, + "result": "minecraft:chiseled_nether_bricks", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/chiseled_polished_blackstone.json b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_polished_blackstone.json new file mode 100644 index 0000000..fff9cc7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_polished_blackstone.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "#" + ], + "key": { + "#": { + "item": "minecraft:polished_blackstone_slab" + } + }, + "result": { + "item": "minecraft:chiseled_polished_blackstone" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/chiseled_polished_blackstone_from_blackstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_polished_blackstone_from_blackstone_stonecutting.json new file mode 100644 index 0000000..fa4d403 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_polished_blackstone_from_blackstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:blackstone" + }, + "result": "minecraft:chiseled_polished_blackstone", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/chiseled_polished_blackstone_from_polished_blackstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_polished_blackstone_from_polished_blackstone_stonecutting.json new file mode 100644 index 0000000..e7d86e6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_polished_blackstone_from_polished_blackstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:polished_blackstone" + }, + "result": "minecraft:chiseled_polished_blackstone", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/chiseled_quartz_block.json b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_quartz_block.json new file mode 100644 index 0000000..dc2fef7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_quartz_block.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "#" + ], + "key": { + "#": { + "item": "minecraft:quartz_slab" + } + }, + "result": { + "item": "minecraft:chiseled_quartz_block" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/chiseled_quartz_block_from_quartz_block_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_quartz_block_from_quartz_block_stonecutting.json new file mode 100644 index 0000000..0920a1f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_quartz_block_from_quartz_block_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:quartz_block" + }, + "result": "minecraft:chiseled_quartz_block", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/chiseled_red_sandstone.json b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_red_sandstone.json new file mode 100644 index 0000000..4cf7d7f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_red_sandstone.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "#" + ], + "key": { + "#": { + "item": "minecraft:red_sandstone_slab" + } + }, + "result": { + "item": "minecraft:chiseled_red_sandstone" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/chiseled_red_sandstone_from_red_sandstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_red_sandstone_from_red_sandstone_stonecutting.json new file mode 100644 index 0000000..de8dd3f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_red_sandstone_from_red_sandstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:red_sandstone" + }, + "result": "minecraft:chiseled_red_sandstone", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/chiseled_sandstone.json b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_sandstone.json new file mode 100644 index 0000000..3506716 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_sandstone.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "#" + ], + "key": { + "#": { + "item": "minecraft:sandstone_slab" + } + }, + "result": { + "item": "minecraft:chiseled_sandstone" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/chiseled_sandstone_from_sandstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_sandstone_from_sandstone_stonecutting.json new file mode 100644 index 0000000..dde7d3b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_sandstone_from_sandstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:sandstone" + }, + "result": "minecraft:chiseled_sandstone", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/chiseled_stone_bricks.json b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_stone_bricks.json new file mode 100644 index 0000000..0727312 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_stone_bricks.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "#" + ], + "key": { + "#": { + "item": "minecraft:stone_brick_slab" + } + }, + "result": { + "item": "minecraft:chiseled_stone_bricks" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/chiseled_stone_bricks_from_stone_bricks_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_stone_bricks_from_stone_bricks_stonecutting.json new file mode 100644 index 0000000..88c6773 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_stone_bricks_from_stone_bricks_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:stone_bricks" + }, + "result": "minecraft:chiseled_stone_bricks", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/chiseled_stone_bricks_stone_from_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_stone_bricks_stone_from_stonecutting.json new file mode 100644 index 0000000..e66c3ca --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/chiseled_stone_bricks_stone_from_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:stone" + }, + "result": "minecraft:chiseled_stone_bricks", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/clay.json b/astraflow/core/workflow/impl/textcraft/recipes/clay.json new file mode 100644 index 0000000..b8e53d2 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/clay.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:clay_ball" + } + }, + "result": { + "item": "minecraft:clay" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/clock.json b/astraflow/core/workflow/impl/textcraft/recipes/clock.json new file mode 100644 index 0000000..1f14927 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/clock.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " # ", + "#X#", + " # " + ], + "key": { + "#": { + "item": "minecraft:gold_ingot" + }, + "X": { + "item": "minecraft:redstone" + } + }, + "result": { + "item": "minecraft:clock" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/coal.json b/astraflow/core/workflow/impl/textcraft/recipes/coal.json new file mode 100644 index 0000000..dd45125 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/coal.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:coal_block" + } + ], + "result": { + "item": "minecraft:coal", + "count": 9 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/coal_block.json b/astraflow/core/workflow/impl/textcraft/recipes/coal_block.json new file mode 100644 index 0000000..fa18c4a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/coal_block.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:coal" + } + }, + "result": { + "item": "minecraft:coal_block" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/coal_from_blasting.json b/astraflow/core/workflow/impl/textcraft/recipes/coal_from_blasting.json new file mode 100644 index 0000000..6a0cdbf --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/coal_from_blasting.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:blasting", + "ingredient": { + "item": "minecraft:coal_ore" + }, + "result": "minecraft:coal", + "experience": 0.1, + "cookingtime": 100 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/coal_from_smelting.json b/astraflow/core/workflow/impl/textcraft/recipes/coal_from_smelting.json new file mode 100644 index 0000000..6e22323 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/coal_from_smelting.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:coal_ore" + }, + "result": "minecraft:coal", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/coarse_dirt.json b/astraflow/core/workflow/impl/textcraft/recipes/coarse_dirt.json new file mode 100644 index 0000000..43dbebe --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/coarse_dirt.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "DG", + "GD" + ], + "key": { + "D": { + "item": "minecraft:dirt" + }, + "G": { + "item": "minecraft:gravel" + } + }, + "result": { + "item": "minecraft:coarse_dirt", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cobblestone_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/cobblestone_slab.json new file mode 100644 index 0000000..a602e9a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cobblestone_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:cobblestone" + } + }, + "result": { + "item": "minecraft:cobblestone_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cobblestone_slab_from_cobblestone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/cobblestone_slab_from_cobblestone_stonecutting.json new file mode 100644 index 0000000..81d45c3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cobblestone_slab_from_cobblestone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:cobblestone" + }, + "result": "minecraft:cobblestone_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cobblestone_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/cobblestone_stairs.json new file mode 100644 index 0000000..59ffa38 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cobblestone_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:cobblestone" + } + }, + "result": { + "item": "minecraft:cobblestone_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cobblestone_stairs_from_cobblestone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/cobblestone_stairs_from_cobblestone_stonecutting.json new file mode 100644 index 0000000..ebc2c11 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cobblestone_stairs_from_cobblestone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:cobblestone" + }, + "result": "minecraft:cobblestone_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cobblestone_wall.json b/astraflow/core/workflow/impl/textcraft/recipes/cobblestone_wall.json new file mode 100644 index 0000000..0298816 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cobblestone_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:cobblestone" + } + }, + "result": { + "item": "minecraft:cobblestone_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cobblestone_wall_from_cobblestone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/cobblestone_wall_from_cobblestone_stonecutting.json new file mode 100644 index 0000000..790063f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cobblestone_wall_from_cobblestone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:cobblestone" + }, + "result": "minecraft:cobblestone_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/comparator.json b/astraflow/core/workflow/impl/textcraft/recipes/comparator.json new file mode 100644 index 0000000..920930d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/comparator.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " # ", + "#X#", + "III" + ], + "key": { + "#": { + "item": "minecraft:redstone_torch" + }, + "X": { + "item": "minecraft:quartz" + }, + "I": { + "item": "minecraft:stone" + } + }, + "result": { + "item": "minecraft:comparator" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/compass.json b/astraflow/core/workflow/impl/textcraft/recipes/compass.json new file mode 100644 index 0000000..5ded677 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/compass.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " # ", + "#X#", + " # " + ], + "key": { + "#": { + "item": "minecraft:iron_ingot" + }, + "X": { + "item": "minecraft:redstone" + } + }, + "result": { + "item": "minecraft:compass" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/composter.json b/astraflow/core/workflow/impl/textcraft/recipes/composter.json new file mode 100644 index 0000000..24907a1 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/composter.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# #", + "# #", + "###" + ], + "key": { + "#": { + "tag": "minecraft:wooden_slabs" + } + }, + "result": { + "item": "minecraft:composter" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/conduit.json b/astraflow/core/workflow/impl/textcraft/recipes/conduit.json new file mode 100644 index 0000000..1e095e5 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/conduit.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:nautilus_shell" + }, + "X": { + "item": "minecraft:heart_of_the_sea" + } + }, + "result": { + "item": "minecraft:conduit" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_beef.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_beef.json new file mode 100644 index 0000000..e33bad4 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_beef.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:beef" + }, + "result": "minecraft:cooked_beef", + "experience": 0.35, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_beef_from_campfire_cooking.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_beef_from_campfire_cooking.json new file mode 100644 index 0000000..116e959 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_beef_from_campfire_cooking.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:campfire_cooking", + "ingredient": { + "item": "minecraft:beef" + }, + "result": "minecraft:cooked_beef", + "experience": 0.35, + "cookingtime": 600 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_beef_from_smoking.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_beef_from_smoking.json new file mode 100644 index 0000000..75ed73b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_beef_from_smoking.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smoking", + "ingredient": { + "item": "minecraft:beef" + }, + "result": "minecraft:cooked_beef", + "experience": 0.35, + "cookingtime": 100 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_chicken.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_chicken.json new file mode 100644 index 0000000..3ba4997 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_chicken.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:chicken" + }, + "result": "minecraft:cooked_chicken", + "experience": 0.35, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_chicken_from_campfire_cooking.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_chicken_from_campfire_cooking.json new file mode 100644 index 0000000..70b6f0a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_chicken_from_campfire_cooking.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:campfire_cooking", + "ingredient": { + "item": "minecraft:chicken" + }, + "result": "minecraft:cooked_chicken", + "experience": 0.35, + "cookingtime": 600 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_chicken_from_smoking.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_chicken_from_smoking.json new file mode 100644 index 0000000..378a20a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_chicken_from_smoking.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smoking", + "ingredient": { + "item": "minecraft:chicken" + }, + "result": "minecraft:cooked_chicken", + "experience": 0.35, + "cookingtime": 100 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_cod.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_cod.json new file mode 100644 index 0000000..d524fae --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_cod.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:cod" + }, + "result": "minecraft:cooked_cod", + "experience": 0.35, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_cod_from_campfire_cooking.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_cod_from_campfire_cooking.json new file mode 100644 index 0000000..e5f2c29 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_cod_from_campfire_cooking.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:campfire_cooking", + "ingredient": { + "item": "minecraft:cod" + }, + "result": "minecraft:cooked_cod", + "experience": 0.35, + "cookingtime": 600 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_cod_from_smoking.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_cod_from_smoking.json new file mode 100644 index 0000000..62d47cb --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_cod_from_smoking.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smoking", + "ingredient": { + "item": "minecraft:cod" + }, + "result": "minecraft:cooked_cod", + "experience": 0.35, + "cookingtime": 100 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_mutton.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_mutton.json new file mode 100644 index 0000000..c0f8ea9 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_mutton.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:mutton" + }, + "result": "minecraft:cooked_mutton", + "experience": 0.35, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_mutton_from_campfire_cooking.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_mutton_from_campfire_cooking.json new file mode 100644 index 0000000..35b6339 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_mutton_from_campfire_cooking.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:campfire_cooking", + "ingredient": { + "item": "minecraft:mutton" + }, + "result": "minecraft:cooked_mutton", + "experience": 0.35, + "cookingtime": 600 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_mutton_from_smoking.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_mutton_from_smoking.json new file mode 100644 index 0000000..b688a2a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_mutton_from_smoking.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smoking", + "ingredient": { + "item": "minecraft:mutton" + }, + "result": "minecraft:cooked_mutton", + "experience": 0.35, + "cookingtime": 100 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_porkchop.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_porkchop.json new file mode 100644 index 0000000..18a301e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_porkchop.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:porkchop" + }, + "result": "minecraft:cooked_porkchop", + "experience": 0.35, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_porkchop_from_campfire_cooking.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_porkchop_from_campfire_cooking.json new file mode 100644 index 0000000..0ad1c88 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_porkchop_from_campfire_cooking.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:campfire_cooking", + "ingredient": { + "item": "minecraft:porkchop" + }, + "result": "minecraft:cooked_porkchop", + "experience": 0.35, + "cookingtime": 600 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_porkchop_from_smoking.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_porkchop_from_smoking.json new file mode 100644 index 0000000..4d8cb22 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_porkchop_from_smoking.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smoking", + "ingredient": { + "item": "minecraft:porkchop" + }, + "result": "minecraft:cooked_porkchop", + "experience": 0.35, + "cookingtime": 100 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_rabbit.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_rabbit.json new file mode 100644 index 0000000..30cc815 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_rabbit.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:rabbit" + }, + "result": "minecraft:cooked_rabbit", + "experience": 0.35, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_rabbit_from_campfire_cooking.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_rabbit_from_campfire_cooking.json new file mode 100644 index 0000000..6950d25 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_rabbit_from_campfire_cooking.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:campfire_cooking", + "ingredient": { + "item": "minecraft:rabbit" + }, + "result": "minecraft:cooked_rabbit", + "experience": 0.35, + "cookingtime": 600 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_rabbit_from_smoking.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_rabbit_from_smoking.json new file mode 100644 index 0000000..098be9f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_rabbit_from_smoking.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smoking", + "ingredient": { + "item": "minecraft:rabbit" + }, + "result": "minecraft:cooked_rabbit", + "experience": 0.35, + "cookingtime": 100 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_salmon.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_salmon.json new file mode 100644 index 0000000..32e1ed9 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_salmon.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:salmon" + }, + "result": "minecraft:cooked_salmon", + "experience": 0.35, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_salmon_from_campfire_cooking.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_salmon_from_campfire_cooking.json new file mode 100644 index 0000000..cbbdb5c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_salmon_from_campfire_cooking.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:campfire_cooking", + "ingredient": { + "item": "minecraft:salmon" + }, + "result": "minecraft:cooked_salmon", + "experience": 0.35, + "cookingtime": 600 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cooked_salmon_from_smoking.json b/astraflow/core/workflow/impl/textcraft/recipes/cooked_salmon_from_smoking.json new file mode 100644 index 0000000..d567dd6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cooked_salmon_from_smoking.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smoking", + "ingredient": { + "item": "minecraft:salmon" + }, + "result": "minecraft:cooked_salmon", + "experience": 0.35, + "cookingtime": 100 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cookie.json b/astraflow/core/workflow/impl/textcraft/recipes/cookie.json new file mode 100644 index 0000000..dfbc13c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cookie.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#X#" + ], + "key": { + "#": { + "item": "minecraft:wheat" + }, + "X": { + "item": "minecraft:cocoa_beans" + } + }, + "result": { + "item": "minecraft:cookie", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cracked_nether_bricks.json b/astraflow/core/workflow/impl/textcraft/recipes/cracked_nether_bricks.json new file mode 100644 index 0000000..4dd536a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cracked_nether_bricks.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:nether_bricks" + }, + "result": "minecraft:cracked_nether_bricks", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cracked_polished_blackstone_bricks.json b/astraflow/core/workflow/impl/textcraft/recipes/cracked_polished_blackstone_bricks.json new file mode 100644 index 0000000..d694d9b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cracked_polished_blackstone_bricks.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:polished_blackstone_bricks" + }, + "result": "minecraft:cracked_polished_blackstone_bricks", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cracked_stone_bricks.json b/astraflow/core/workflow/impl/textcraft/recipes/cracked_stone_bricks.json new file mode 100644 index 0000000..9eb4337 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cracked_stone_bricks.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:stone_bricks" + }, + "result": "minecraft:cracked_stone_bricks", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/crafting_table.json b/astraflow/core/workflow/impl/textcraft/recipes/crafting_table.json new file mode 100644 index 0000000..b0dc306 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/crafting_table.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:crafting_table" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/creeper_banner_pattern.json b/astraflow/core/workflow/impl/textcraft/recipes/creeper_banner_pattern.json new file mode 100644 index 0000000..b2f6eed --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/creeper_banner_pattern.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:creeper_head" + } + ], + "result": { + "item": "minecraft:creeper_banner_pattern" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/crimson_button.json b/astraflow/core/workflow/impl/textcraft/recipes/crimson_button.json new file mode 100644 index 0000000..4dc921e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/crimson_button.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wooden_button", + "ingredients": [ + { + "item": "minecraft:crimson_planks" + } + ], + "result": { + "item": "minecraft:crimson_button" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/crimson_door.json b/astraflow/core/workflow/impl/textcraft/recipes/crimson_door.json new file mode 100644 index 0000000..f25d825 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/crimson_door.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_door", + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:crimson_planks" + } + }, + "result": { + "item": "minecraft:crimson_door", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/crimson_fence.json b/astraflow/core/workflow/impl/textcraft/recipes/crimson_fence.json new file mode 100644 index 0000000..facc629 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/crimson_fence.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_fence", + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "W": { + "item": "minecraft:crimson_planks" + } + }, + "result": { + "item": "minecraft:crimson_fence", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/crimson_fence_gate.json b/astraflow/core/workflow/impl/textcraft/recipes/crimson_fence_gate.json new file mode 100644 index 0000000..7d57669 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/crimson_fence_gate.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_fence_gate", + "pattern": [ + "#W#", + "#W#" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "W": { + "item": "minecraft:crimson_planks" + } + }, + "result": { + "item": "minecraft:crimson_fence_gate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/crimson_hyphae.json b/astraflow/core/workflow/impl/textcraft/recipes/crimson_hyphae.json new file mode 100644 index 0000000..5fb2cbe --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/crimson_hyphae.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bark", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:crimson_stem" + } + }, + "result": { + "item": "minecraft:crimson_hyphae", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/crimson_planks.json b/astraflow/core/workflow/impl/textcraft/recipes/crimson_planks.json new file mode 100644 index 0000000..cbc44f4 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/crimson_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "planks", + "ingredients": [ + { + "tag": "minecraft:crimson_stems" + } + ], + "result": { + "item": "minecraft:crimson_planks", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/crimson_pressure_plate.json b/astraflow/core/workflow/impl/textcraft/recipes/crimson_pressure_plate.json new file mode 100644 index 0000000..d91f19b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/crimson_pressure_plate.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_pressure_plate", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:crimson_planks" + } + }, + "result": { + "item": "minecraft:crimson_pressure_plate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/crimson_sign.json b/astraflow/core/workflow/impl/textcraft/recipes/crimson_sign.json new file mode 100644 index 0000000..e105a4b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/crimson_sign.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "sign", + "pattern": [ + "###", + "###", + " X " + ], + "key": { + "#": { + "item": "minecraft:crimson_planks" + }, + "X": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:crimson_sign", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/crimson_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/crimson_slab.json new file mode 100644 index 0000000..8a1f637 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/crimson_slab.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_slab", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:crimson_planks" + } + }, + "result": { + "item": "minecraft:crimson_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/crimson_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/crimson_stairs.json new file mode 100644 index 0000000..8799b69 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/crimson_stairs.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_stairs", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:crimson_planks" + } + }, + "result": { + "item": "minecraft:crimson_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/crimson_trapdoor.json b/astraflow/core/workflow/impl/textcraft/recipes/crimson_trapdoor.json new file mode 100644 index 0000000..064cbc8 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/crimson_trapdoor.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_trapdoor", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:crimson_planks" + } + }, + "result": { + "item": "minecraft:crimson_trapdoor", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/crossbow.json b/astraflow/core/workflow/impl/textcraft/recipes/crossbow.json new file mode 100644 index 0000000..cc274fc --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/crossbow.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#\u0026#", + "~$~", + " # " + ], + "key": { + "~": { + "item": "minecraft:string" + }, + "#": { + "item": "minecraft:stick" + }, + "\u0026": { + "item": "minecraft:iron_ingot" + }, + "$": { + "item": "minecraft:tripwire_hook" + } + }, + "result": { + "item": "minecraft:crossbow" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cut_red_sandstone.json b/astraflow/core/workflow/impl/textcraft/recipes/cut_red_sandstone.json new file mode 100644 index 0000000..54c744b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cut_red_sandstone.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:red_sandstone" + } + }, + "result": { + "item": "minecraft:cut_red_sandstone", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cut_red_sandstone_from_red_sandstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/cut_red_sandstone_from_red_sandstone_stonecutting.json new file mode 100644 index 0000000..b34a94d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cut_red_sandstone_from_red_sandstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:red_sandstone" + }, + "result": "minecraft:cut_red_sandstone", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cut_red_sandstone_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/cut_red_sandstone_slab.json new file mode 100644 index 0000000..f77bd25 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cut_red_sandstone_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:cut_red_sandstone" + } + }, + "result": { + "item": "minecraft:cut_red_sandstone_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cut_red_sandstone_slab_from_cut_red_sandstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/cut_red_sandstone_slab_from_cut_red_sandstone_stonecutting.json new file mode 100644 index 0000000..173b64a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cut_red_sandstone_slab_from_cut_red_sandstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:cut_red_sandstone" + }, + "result": "minecraft:cut_red_sandstone_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cut_red_sandstone_slab_from_red_sandstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/cut_red_sandstone_slab_from_red_sandstone_stonecutting.json new file mode 100644 index 0000000..fcff6d7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cut_red_sandstone_slab_from_red_sandstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:red_sandstone" + }, + "result": "minecraft:cut_red_sandstone_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cut_sandstone.json b/astraflow/core/workflow/impl/textcraft/recipes/cut_sandstone.json new file mode 100644 index 0000000..471b30f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cut_sandstone.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:sandstone" + } + }, + "result": { + "item": "minecraft:cut_sandstone", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cut_sandstone_from_sandstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/cut_sandstone_from_sandstone_stonecutting.json new file mode 100644 index 0000000..f049f64 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cut_sandstone_from_sandstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:sandstone" + }, + "result": "minecraft:cut_sandstone", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cut_sandstone_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/cut_sandstone_slab.json new file mode 100644 index 0000000..e5b86b0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cut_sandstone_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:cut_sandstone" + } + }, + "result": { + "item": "minecraft:cut_sandstone_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cut_sandstone_slab_from_cut_sandstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/cut_sandstone_slab_from_cut_sandstone_stonecutting.json new file mode 100644 index 0000000..eeb425d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cut_sandstone_slab_from_cut_sandstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:cut_sandstone" + }, + "result": "minecraft:cut_sandstone_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cut_sandstone_slab_from_sandstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/cut_sandstone_slab_from_sandstone_stonecutting.json new file mode 100644 index 0000000..5bfb4a3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cut_sandstone_slab_from_sandstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:sandstone" + }, + "result": "minecraft:cut_sandstone_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cyan_banner.json b/astraflow/core/workflow/impl/textcraft/recipes/cyan_banner.json new file mode 100644 index 0000000..a1004f7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cyan_banner.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "banner", + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": { + "item": "minecraft:cyan_wool" + }, + "|": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:cyan_banner" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cyan_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/cyan_bed.json new file mode 100644 index 0000000..e396e04 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cyan_bed.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed", + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": { + "item": "minecraft:cyan_wool" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:cyan_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cyan_bed_from_white_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/cyan_bed_from_white_bed.json new file mode 100644 index 0000000..88bb80c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cyan_bed_from_white_bed.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "dyed_bed", + "ingredients": [ + { + "item": "minecraft:white_bed" + }, + { + "item": "minecraft:cyan_dye" + } + ], + "result": { + "item": "minecraft:cyan_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cyan_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/cyan_carpet.json new file mode 100644 index 0000000..83c49eb --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cyan_carpet.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:cyan_wool" + } + }, + "result": { + "item": "minecraft:cyan_carpet", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cyan_carpet_from_white_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/cyan_carpet_from_white_carpet.json new file mode 100644 index 0000000..71013c6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cyan_carpet_from_white_carpet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:white_carpet" + }, + "$": { + "item": "minecraft:cyan_dye" + } + }, + "result": { + "item": "minecraft:cyan_carpet", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cyan_concrete_powder.json b/astraflow/core/workflow/impl/textcraft/recipes/cyan_concrete_powder.json new file mode 100644 index 0000000..fae84bb --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cyan_concrete_powder.json @@ -0,0 +1,37 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "concrete_powder", + "ingredients": [ + { + "item": "minecraft:cyan_dye" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + } + ], + "result": { + "item": "minecraft:cyan_concrete_powder", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cyan_dye.json b/astraflow/core/workflow/impl/textcraft/recipes/cyan_dye.json new file mode 100644 index 0000000..58381b8 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cyan_dye.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:blue_dye" + }, + { + "item": "minecraft:green_dye" + } + ], + "result": { + "item": "minecraft:cyan_dye", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cyan_glazed_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/cyan_glazed_terracotta.json new file mode 100644 index 0000000..25a8e47 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cyan_glazed_terracotta.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:cyan_terracotta" + }, + "result": "minecraft:cyan_glazed_terracotta", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cyan_stained_glass.json b/astraflow/core/workflow/impl/textcraft/recipes/cyan_stained_glass.json new file mode 100644 index 0000000..33e2bd4 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cyan_stained_glass.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass" + }, + "X": { + "item": "minecraft:cyan_dye" + } + }, + "result": { + "item": "minecraft:cyan_stained_glass", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cyan_stained_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/cyan_stained_glass_pane.json new file mode 100644 index 0000000..c853586 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cyan_stained_glass_pane.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:cyan_stained_glass" + } + }, + "result": { + "item": "minecraft:cyan_stained_glass_pane", + "count": 16 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cyan_stained_glass_pane_from_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/cyan_stained_glass_pane_from_glass_pane.json new file mode 100644 index 0000000..c673027 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cyan_stained_glass_pane_from_glass_pane.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass_pane" + }, + "$": { + "item": "minecraft:cyan_dye" + } + }, + "result": { + "item": "minecraft:cyan_stained_glass_pane", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cyan_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/cyan_terracotta.json new file mode 100644 index 0000000..a35c2d3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cyan_terracotta.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_terracotta", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:terracotta" + }, + "X": { + "item": "minecraft:cyan_dye" + } + }, + "result": { + "item": "minecraft:cyan_terracotta", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/cyan_wool.json b/astraflow/core/workflow/impl/textcraft/recipes/cyan_wool.json new file mode 100644 index 0000000..7e16181 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/cyan_wool.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wool", + "ingredients": [ + { + "item": "minecraft:cyan_dye" + }, + { + "item": "minecraft:white_wool" + } + ], + "result": { + "item": "minecraft:cyan_wool" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_boat.json b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_boat.json new file mode 100644 index 0000000..3ca003c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_boat.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "boat", + "pattern": [ + "# #", + "###" + ], + "key": { + "#": { + "item": "minecraft:dark_oak_planks" + } + }, + "result": { + "item": "minecraft:dark_oak_boat" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_button.json b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_button.json new file mode 100644 index 0000000..bd19c4b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_button.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wooden_button", + "ingredients": [ + { + "item": "minecraft:dark_oak_planks" + } + ], + "result": { + "item": "minecraft:dark_oak_button" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_door.json b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_door.json new file mode 100644 index 0000000..08ce2b1 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_door.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_door", + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:dark_oak_planks" + } + }, + "result": { + "item": "minecraft:dark_oak_door", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_fence.json b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_fence.json new file mode 100644 index 0000000..469e500 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_fence.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_fence", + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "W": { + "item": "minecraft:dark_oak_planks" + } + }, + "result": { + "item": "minecraft:dark_oak_fence", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_fence_gate.json b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_fence_gate.json new file mode 100644 index 0000000..9448672 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_fence_gate.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_fence_gate", + "pattern": [ + "#W#", + "#W#" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "W": { + "item": "minecraft:dark_oak_planks" + } + }, + "result": { + "item": "minecraft:dark_oak_fence_gate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_planks.json b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_planks.json new file mode 100644 index 0000000..215751f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "planks", + "ingredients": [ + { + "tag": "minecraft:dark_oak_logs" + } + ], + "result": { + "item": "minecraft:dark_oak_planks", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_pressure_plate.json b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_pressure_plate.json new file mode 100644 index 0000000..359c41a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_pressure_plate.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_pressure_plate", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:dark_oak_planks" + } + }, + "result": { + "item": "minecraft:dark_oak_pressure_plate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_sign.json b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_sign.json new file mode 100644 index 0000000..047af17 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_sign.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "sign", + "pattern": [ + "###", + "###", + " X " + ], + "key": { + "#": { + "item": "minecraft:dark_oak_planks" + }, + "X": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:dark_oak_sign", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_slab.json new file mode 100644 index 0000000..f75c405 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_slab.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_slab", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:dark_oak_planks" + } + }, + "result": { + "item": "minecraft:dark_oak_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_stairs.json new file mode 100644 index 0000000..abdb8d8 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_stairs.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_stairs", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:dark_oak_planks" + } + }, + "result": { + "item": "minecraft:dark_oak_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_trapdoor.json b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_trapdoor.json new file mode 100644 index 0000000..a6ba90b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_trapdoor.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_trapdoor", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:dark_oak_planks" + } + }, + "result": { + "item": "minecraft:dark_oak_trapdoor", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_wood.json b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_wood.json new file mode 100644 index 0000000..10bd96d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dark_oak_wood.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bark", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:dark_oak_log" + } + }, + "result": { + "item": "minecraft:dark_oak_wood", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dark_prismarine.json b/astraflow/core/workflow/impl/textcraft/recipes/dark_prismarine.json new file mode 100644 index 0000000..fd9581a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dark_prismarine.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SSS", + "SIS", + "SSS" + ], + "key": { + "S": { + "item": "minecraft:prismarine_shard" + }, + "I": { + "item": "minecraft:black_dye" + } + }, + "result": { + "item": "minecraft:dark_prismarine" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dark_prismarine_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/dark_prismarine_slab.json new file mode 100644 index 0000000..c2be0d0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dark_prismarine_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:dark_prismarine" + } + }, + "result": { + "item": "minecraft:dark_prismarine_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dark_prismarine_slab_from_dark_prismarine_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/dark_prismarine_slab_from_dark_prismarine_stonecutting.json new file mode 100644 index 0000000..c416c88 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dark_prismarine_slab_from_dark_prismarine_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:dark_prismarine" + }, + "result": "minecraft:dark_prismarine_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dark_prismarine_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/dark_prismarine_stairs.json new file mode 100644 index 0000000..4e74217 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dark_prismarine_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:dark_prismarine" + } + }, + "result": { + "item": "minecraft:dark_prismarine_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dark_prismarine_stairs_from_dark_prismarine_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/dark_prismarine_stairs_from_dark_prismarine_stonecutting.json new file mode 100644 index 0000000..a497f7f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dark_prismarine_stairs_from_dark_prismarine_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:dark_prismarine" + }, + "result": "minecraft:dark_prismarine_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/daylight_detector.json b/astraflow/core/workflow/impl/textcraft/recipes/daylight_detector.json new file mode 100644 index 0000000..6b3b61a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/daylight_detector.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "GGG", + "QQQ", + "WWW" + ], + "key": { + "Q": { + "item": "minecraft:quartz" + }, + "G": { + "item": "minecraft:glass" + }, + "W": { + "tag": "minecraft:wooden_slabs" + } + }, + "result": { + "item": "minecraft:daylight_detector" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/detector_rail.json b/astraflow/core/workflow/impl/textcraft/recipes/detector_rail.json new file mode 100644 index 0000000..2d1c95d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/detector_rail.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X X", + "X#X", + "XRX" + ], + "key": { + "R": { + "item": "minecraft:redstone" + }, + "#": { + "item": "minecraft:stone_pressure_plate" + }, + "X": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:detector_rail", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/diamond.json b/astraflow/core/workflow/impl/textcraft/recipes/diamond.json new file mode 100644 index 0000000..b90351a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/diamond.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:diamond_block" + } + ], + "result": { + "item": "minecraft:diamond", + "count": 9 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/diamond_axe.json b/astraflow/core/workflow/impl/textcraft/recipes/diamond_axe.json new file mode 100644 index 0000000..b77f0df --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/diamond_axe.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XX", + "X#", + " #" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:diamond" + } + }, + "result": { + "item": "minecraft:diamond_axe" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/diamond_block.json b/astraflow/core/workflow/impl/textcraft/recipes/diamond_block.json new file mode 100644 index 0000000..d6bbb6d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/diamond_block.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:diamond" + } + }, + "result": { + "item": "minecraft:diamond_block" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/diamond_boots.json b/astraflow/core/workflow/impl/textcraft/recipes/diamond_boots.json new file mode 100644 index 0000000..548eb8c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/diamond_boots.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X X", + "X X" + ], + "key": { + "X": { + "item": "minecraft:diamond" + } + }, + "result": { + "item": "minecraft:diamond_boots" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/diamond_chestplate.json b/astraflow/core/workflow/impl/textcraft/recipes/diamond_chestplate.json new file mode 100644 index 0000000..55fd936 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/diamond_chestplate.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X X", + "XXX", + "XXX" + ], + "key": { + "X": { + "item": "minecraft:diamond" + } + }, + "result": { + "item": "minecraft:diamond_chestplate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/diamond_from_blasting.json b/astraflow/core/workflow/impl/textcraft/recipes/diamond_from_blasting.json new file mode 100644 index 0000000..816cf11 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/diamond_from_blasting.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:blasting", + "ingredient": { + "item": "minecraft:diamond_ore" + }, + "result": "minecraft:diamond", + "experience": 1.0, + "cookingtime": 100 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/diamond_from_smelting.json b/astraflow/core/workflow/impl/textcraft/recipes/diamond_from_smelting.json new file mode 100644 index 0000000..cf31cf9 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/diamond_from_smelting.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:diamond_ore" + }, + "result": "minecraft:diamond", + "experience": 1.0, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/diamond_helmet.json b/astraflow/core/workflow/impl/textcraft/recipes/diamond_helmet.json new file mode 100644 index 0000000..c83a492 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/diamond_helmet.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XXX", + "X X" + ], + "key": { + "X": { + "item": "minecraft:diamond" + } + }, + "result": { + "item": "minecraft:diamond_helmet" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/diamond_hoe.json b/astraflow/core/workflow/impl/textcraft/recipes/diamond_hoe.json new file mode 100644 index 0000000..2401cb2 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/diamond_hoe.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XX", + " #", + " #" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:diamond" + } + }, + "result": { + "item": "minecraft:diamond_hoe" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/diamond_leggings.json b/astraflow/core/workflow/impl/textcraft/recipes/diamond_leggings.json new file mode 100644 index 0000000..32f4c2b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/diamond_leggings.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XXX", + "X X", + "X X" + ], + "key": { + "X": { + "item": "minecraft:diamond" + } + }, + "result": { + "item": "minecraft:diamond_leggings" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/diamond_pickaxe.json b/astraflow/core/workflow/impl/textcraft/recipes/diamond_pickaxe.json new file mode 100644 index 0000000..56fc30e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/diamond_pickaxe.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XXX", + " # ", + " # " + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:diamond" + } + }, + "result": { + "item": "minecraft:diamond_pickaxe" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/diamond_shovel.json b/astraflow/core/workflow/impl/textcraft/recipes/diamond_shovel.json new file mode 100644 index 0000000..84d2d4f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/diamond_shovel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X", + "#", + "#" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:diamond" + } + }, + "result": { + "item": "minecraft:diamond_shovel" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/diamond_sword.json b/astraflow/core/workflow/impl/textcraft/recipes/diamond_sword.json new file mode 100644 index 0000000..d4bf6ee --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/diamond_sword.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X", + "X", + "#" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:diamond" + } + }, + "result": { + "item": "minecraft:diamond_sword" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/diorite.json b/astraflow/core/workflow/impl/textcraft/recipes/diorite.json new file mode 100644 index 0000000..69c4996 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/diorite.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "CQ", + "QC" + ], + "key": { + "Q": { + "item": "minecraft:quartz" + }, + "C": { + "item": "minecraft:cobblestone" + } + }, + "result": { + "item": "minecraft:diorite", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/diorite_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/diorite_slab.json new file mode 100644 index 0000000..61ed93f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/diorite_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:diorite" + } + }, + "result": { + "item": "minecraft:diorite_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/diorite_slab_from_diorite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/diorite_slab_from_diorite_stonecutting.json new file mode 100644 index 0000000..67d77c7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/diorite_slab_from_diorite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:diorite" + }, + "result": "minecraft:diorite_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/diorite_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/diorite_stairs.json new file mode 100644 index 0000000..c11c032 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/diorite_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:diorite" + } + }, + "result": { + "item": "minecraft:diorite_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/diorite_stairs_from_diorite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/diorite_stairs_from_diorite_stonecutting.json new file mode 100644 index 0000000..c3e963e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/diorite_stairs_from_diorite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:diorite" + }, + "result": "minecraft:diorite_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/diorite_wall.json b/astraflow/core/workflow/impl/textcraft/recipes/diorite_wall.json new file mode 100644 index 0000000..16f9b8d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/diorite_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:diorite" + } + }, + "result": { + "item": "minecraft:diorite_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/diorite_wall_from_diorite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/diorite_wall_from_diorite_stonecutting.json new file mode 100644 index 0000000..f3f3e82 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/diorite_wall_from_diorite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:diorite" + }, + "result": "minecraft:diorite_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dispenser.json b/astraflow/core/workflow/impl/textcraft/recipes/dispenser.json new file mode 100644 index 0000000..93d89cb --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dispenser.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "#X#", + "#R#" + ], + "key": { + "R": { + "item": "minecraft:redstone" + }, + "#": { + "item": "minecraft:cobblestone" + }, + "X": { + "item": "minecraft:bow" + } + }, + "result": { + "item": "minecraft:dispenser" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dried_kelp.json b/astraflow/core/workflow/impl/textcraft/recipes/dried_kelp.json new file mode 100644 index 0000000..2e95b1c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dried_kelp.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:dried_kelp_block" + } + ], + "result": { + "item": "minecraft:dried_kelp", + "count": 9 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dried_kelp_block.json b/astraflow/core/workflow/impl/textcraft/recipes/dried_kelp_block.json new file mode 100644 index 0000000..cd1414c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dried_kelp_block.json @@ -0,0 +1,35 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:dried_kelp" + }, + { + "item": "minecraft:dried_kelp" + }, + { + "item": "minecraft:dried_kelp" + }, + { + "item": "minecraft:dried_kelp" + }, + { + "item": "minecraft:dried_kelp" + }, + { + "item": "minecraft:dried_kelp" + }, + { + "item": "minecraft:dried_kelp" + }, + { + "item": "minecraft:dried_kelp" + }, + { + "item": "minecraft:dried_kelp" + } + ], + "result": { + "item": "minecraft:dried_kelp_block" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dried_kelp_from_campfire_cooking.json b/astraflow/core/workflow/impl/textcraft/recipes/dried_kelp_from_campfire_cooking.json new file mode 100644 index 0000000..6d8a7ad --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dried_kelp_from_campfire_cooking.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:campfire_cooking", + "ingredient": { + "item": "minecraft:kelp" + }, + "result": "minecraft:dried_kelp", + "experience": 0.1, + "cookingtime": 600 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dried_kelp_from_smelting.json b/astraflow/core/workflow/impl/textcraft/recipes/dried_kelp_from_smelting.json new file mode 100644 index 0000000..d288d9c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dried_kelp_from_smelting.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:kelp" + }, + "result": "minecraft:dried_kelp", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dried_kelp_from_smoking.json b/astraflow/core/workflow/impl/textcraft/recipes/dried_kelp_from_smoking.json new file mode 100644 index 0000000..cdc40ba --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dried_kelp_from_smoking.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smoking", + "ingredient": { + "item": "minecraft:kelp" + }, + "result": "minecraft:dried_kelp", + "experience": 0.1, + "cookingtime": 100 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/dropper.json b/astraflow/core/workflow/impl/textcraft/recipes/dropper.json new file mode 100644 index 0000000..d276f16 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/dropper.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "# #", + "#R#" + ], + "key": { + "R": { + "item": "minecraft:redstone" + }, + "#": { + "item": "minecraft:cobblestone" + } + }, + "result": { + "item": "minecraft:dropper" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/emerald.json b/astraflow/core/workflow/impl/textcraft/recipes/emerald.json new file mode 100644 index 0000000..d337d44 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/emerald.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:emerald_block" + } + ], + "result": { + "item": "minecraft:emerald", + "count": 9 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/emerald_block.json b/astraflow/core/workflow/impl/textcraft/recipes/emerald_block.json new file mode 100644 index 0000000..9ebdb20 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/emerald_block.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:emerald" + } + }, + "result": { + "item": "minecraft:emerald_block" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/emerald_from_blasting.json b/astraflow/core/workflow/impl/textcraft/recipes/emerald_from_blasting.json new file mode 100644 index 0000000..853b427 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/emerald_from_blasting.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:blasting", + "ingredient": { + "item": "minecraft:emerald_ore" + }, + "result": "minecraft:emerald", + "experience": 1.0, + "cookingtime": 100 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/emerald_from_smelting.json b/astraflow/core/workflow/impl/textcraft/recipes/emerald_from_smelting.json new file mode 100644 index 0000000..695e393 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/emerald_from_smelting.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:emerald_ore" + }, + "result": "minecraft:emerald", + "experience": 1.0, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/enchanting_table.json b/astraflow/core/workflow/impl/textcraft/recipes/enchanting_table.json new file mode 100644 index 0000000..16eb0d3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/enchanting_table.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " B ", + "D#D", + "###" + ], + "key": { + "B": { + "item": "minecraft:book" + }, + "#": { + "item": "minecraft:obsidian" + }, + "D": { + "item": "minecraft:diamond" + } + }, + "result": { + "item": "minecraft:enchanting_table" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/end_crystal.json b/astraflow/core/workflow/impl/textcraft/recipes/end_crystal.json new file mode 100644 index 0000000..d9e40b5 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/end_crystal.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "GGG", + "GEG", + "GTG" + ], + "key": { + "T": { + "item": "minecraft:ghast_tear" + }, + "E": { + "item": "minecraft:ender_eye" + }, + "G": { + "item": "minecraft:glass" + } + }, + "result": { + "item": "minecraft:end_crystal" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/end_rod.json b/astraflow/core/workflow/impl/textcraft/recipes/end_rod.json new file mode 100644 index 0000000..be2bd41 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/end_rod.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "/", + "#" + ], + "key": { + "#": { + "item": "minecraft:popped_chorus_fruit" + }, + "/": { + "item": "minecraft:blaze_rod" + } + }, + "result": { + "item": "minecraft:end_rod", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_slab.json new file mode 100644 index 0000000..4dbbb67 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:end_stone_bricks" + } + }, + "result": { + "item": "minecraft:end_stone_brick_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_slab_from_end_stone_brick_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_slab_from_end_stone_brick_stonecutting.json new file mode 100644 index 0000000..a043a1b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_slab_from_end_stone_brick_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:end_stone_bricks" + }, + "result": "minecraft:end_stone_brick_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_slab_from_end_stone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_slab_from_end_stone_stonecutting.json new file mode 100644 index 0000000..e257cce --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_slab_from_end_stone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:end_stone" + }, + "result": "minecraft:end_stone_brick_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_stairs.json new file mode 100644 index 0000000..ce0512d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:end_stone_bricks" + } + }, + "result": { + "item": "minecraft:end_stone_brick_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_stairs_from_end_stone_brick_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_stairs_from_end_stone_brick_stonecutting.json new file mode 100644 index 0000000..e2310de --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_stairs_from_end_stone_brick_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:end_stone_bricks" + }, + "result": "minecraft:end_stone_brick_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_stairs_from_end_stone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_stairs_from_end_stone_stonecutting.json new file mode 100644 index 0000000..bd3bfe6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_stairs_from_end_stone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:end_stone" + }, + "result": "minecraft:end_stone_brick_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_wall.json b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_wall.json new file mode 100644 index 0000000..7bf02d2 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:end_stone_bricks" + } + }, + "result": { + "item": "minecraft:end_stone_brick_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_wall_from_end_stone_brick_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_wall_from_end_stone_brick_stonecutting.json new file mode 100644 index 0000000..ab11740 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_wall_from_end_stone_brick_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:end_stone_bricks" + }, + "result": "minecraft:end_stone_brick_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_wall_from_end_stone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_wall_from_end_stone_stonecutting.json new file mode 100644 index 0000000..cb04bfd --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_brick_wall_from_end_stone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:end_stone" + }, + "result": "minecraft:end_stone_brick_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/end_stone_bricks.json b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_bricks.json new file mode 100644 index 0000000..70989ac --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_bricks.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:end_stone" + } + }, + "result": { + "item": "minecraft:end_stone_bricks", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/end_stone_bricks_from_end_stone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_bricks_from_end_stone_stonecutting.json new file mode 100644 index 0000000..bf96a6e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/end_stone_bricks_from_end_stone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:end_stone" + }, + "result": "minecraft:end_stone_bricks", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/ender_chest.json b/astraflow/core/workflow/impl/textcraft/recipes/ender_chest.json new file mode 100644 index 0000000..a1d1338 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/ender_chest.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "#E#", + "###" + ], + "key": { + "#": { + "item": "minecraft:obsidian" + }, + "E": { + "item": "minecraft:ender_eye" + } + }, + "result": { + "item": "minecraft:ender_chest" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/ender_eye.json b/astraflow/core/workflow/impl/textcraft/recipes/ender_eye.json new file mode 100644 index 0000000..59ad02b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/ender_eye.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:ender_pearl" + }, + { + "item": "minecraft:blaze_powder" + } + ], + "result": { + "item": "minecraft:ender_eye" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/fermented_spider_eye.json b/astraflow/core/workflow/impl/textcraft/recipes/fermented_spider_eye.json new file mode 100644 index 0000000..bce59e6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/fermented_spider_eye.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:spider_eye" + }, + { + "item": "minecraft:brown_mushroom" + }, + { + "item": "minecraft:sugar" + } + ], + "result": { + "item": "minecraft:fermented_spider_eye" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/fire_charge.json b/astraflow/core/workflow/impl/textcraft/recipes/fire_charge.json new file mode 100644 index 0000000..f7e57e6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/fire_charge.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:gunpowder" + }, + { + "item": "minecraft:blaze_powder" + }, + [ + { + "item": "minecraft:coal" + }, + { + "item": "minecraft:charcoal" + } + ] + ], + "result": { + "item": "minecraft:fire_charge", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/firework_rocket.json b/astraflow/core/workflow/impl/textcraft/recipes/firework_rocket.json new file mode 100644 index 0000000..889dedc --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/firework_rocket.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:crafting_special_firework_rocket" +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/firework_star.json b/astraflow/core/workflow/impl/textcraft/recipes/firework_star.json new file mode 100644 index 0000000..7168ef9 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/firework_star.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:crafting_special_firework_star" +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/firework_star_fade.json b/astraflow/core/workflow/impl/textcraft/recipes/firework_star_fade.json new file mode 100644 index 0000000..c6b8065 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/firework_star_fade.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:crafting_special_firework_star_fade" +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/fishing_rod.json b/astraflow/core/workflow/impl/textcraft/recipes/fishing_rod.json new file mode 100644 index 0000000..d79d9ac --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/fishing_rod.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " #", + " #X", + "# X" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:string" + } + }, + "result": { + "item": "minecraft:fishing_rod" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/fletching_table.json b/astraflow/core/workflow/impl/textcraft/recipes/fletching_table.json new file mode 100644 index 0000000..d91cf28 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/fletching_table.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "@@", + "##", + "##" + ], + "key": { + "#": { + "tag": "minecraft:planks" + }, + "@": { + "item": "minecraft:flint" + } + }, + "result": { + "item": "minecraft:fletching_table" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/flint_and_steel.json b/astraflow/core/workflow/impl/textcraft/recipes/flint_and_steel.json new file mode 100644 index 0000000..ec77442 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/flint_and_steel.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:iron_ingot" + }, + { + "item": "minecraft:flint" + } + ], + "result": { + "item": "minecraft:flint_and_steel" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/flower_banner_pattern.json b/astraflow/core/workflow/impl/textcraft/recipes/flower_banner_pattern.json new file mode 100644 index 0000000..fa398b6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/flower_banner_pattern.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:oxeye_daisy" + } + ], + "result": { + "item": "minecraft:flower_banner_pattern" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/flower_pot.json b/astraflow/core/workflow/impl/textcraft/recipes/flower_pot.json new file mode 100644 index 0000000..1bf914c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/flower_pot.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# #", + " # " + ], + "key": { + "#": { + "item": "minecraft:brick" + } + }, + "result": { + "item": "minecraft:flower_pot" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/furnace.json b/astraflow/core/workflow/impl/textcraft/recipes/furnace.json new file mode 100644 index 0000000..60f78a8 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/furnace.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "# #", + "###" + ], + "key": { + "#": { + "tag": "minecraft:stone_crafting_materials" + } + }, + "result": { + "item": "minecraft:furnace" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/furnace_minecart.json b/astraflow/core/workflow/impl/textcraft/recipes/furnace_minecart.json new file mode 100644 index 0000000..28802cb --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/furnace_minecart.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "A", + "B" + ], + "key": { + "A": { + "item": "minecraft:furnace" + }, + "B": { + "item": "minecraft:minecart" + } + }, + "result": { + "item": "minecraft:furnace_minecart" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/glass.json b/astraflow/core/workflow/impl/textcraft/recipes/glass.json new file mode 100644 index 0000000..32b5ece --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/glass.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "tag": "minecraft:sand" + }, + "result": "minecraft:glass", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/glass_bottle.json b/astraflow/core/workflow/impl/textcraft/recipes/glass_bottle.json new file mode 100644 index 0000000..81885ac --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/glass_bottle.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# #", + " # " + ], + "key": { + "#": { + "item": "minecraft:glass" + } + }, + "result": { + "item": "minecraft:glass_bottle", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/glass_pane.json new file mode 100644 index 0000000..a10664d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/glass_pane.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass" + } + }, + "result": { + "item": "minecraft:glass_pane", + "count": 16 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/glistering_melon_slice.json b/astraflow/core/workflow/impl/textcraft/recipes/glistering_melon_slice.json new file mode 100644 index 0000000..1e4c7d2 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/glistering_melon_slice.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:gold_nugget" + }, + "X": { + "item": "minecraft:melon_slice" + } + }, + "result": { + "item": "minecraft:glistering_melon_slice" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/glowstone.json b/astraflow/core/workflow/impl/textcraft/recipes/glowstone.json new file mode 100644 index 0000000..8e58f3f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/glowstone.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:glowstone_dust" + } + }, + "result": { + "item": "minecraft:glowstone" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gold_block.json b/astraflow/core/workflow/impl/textcraft/recipes/gold_block.json new file mode 100644 index 0000000..28f1a3e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gold_block.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:gold_ingot" + } + }, + "result": { + "item": "minecraft:gold_block" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gold_ingot.json b/astraflow/core/workflow/impl/textcraft/recipes/gold_ingot.json new file mode 100644 index 0000000..a839b99 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gold_ingot.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "tag": "minecraft:gold_ores" + }, + "result": "minecraft:gold_ingot", + "experience": 1.0, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gold_ingot_from_blasting.json b/astraflow/core/workflow/impl/textcraft/recipes/gold_ingot_from_blasting.json new file mode 100644 index 0000000..d344cfa --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gold_ingot_from_blasting.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:blasting", + "ingredient": { + "tag": "minecraft:gold_ores" + }, + "result": "minecraft:gold_ingot", + "experience": 1.0, + "cookingtime": 100 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gold_ingot_from_gold_block.json b/astraflow/core/workflow/impl/textcraft/recipes/gold_ingot_from_gold_block.json new file mode 100644 index 0000000..bcaf158 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gold_ingot_from_gold_block.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "gold_ingot", + "ingredients": [ + { + "item": "minecraft:gold_block" + } + ], + "result": { + "item": "minecraft:gold_ingot", + "count": 9 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gold_ingot_from_nuggets.json b/astraflow/core/workflow/impl/textcraft/recipes/gold_ingot_from_nuggets.json new file mode 100644 index 0000000..0dae15c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gold_ingot_from_nuggets.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "gold_ingot", + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:gold_nugget" + } + }, + "result": { + "item": "minecraft:gold_ingot" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gold_nugget.json b/astraflow/core/workflow/impl/textcraft/recipes/gold_nugget.json new file mode 100644 index 0000000..170d877 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gold_nugget.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:gold_ingot" + } + ], + "result": { + "item": "minecraft:gold_nugget", + "count": 9 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gold_nugget_from_blasting.json b/astraflow/core/workflow/impl/textcraft/recipes/gold_nugget_from_blasting.json new file mode 100644 index 0000000..e2f1acd --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gold_nugget_from_blasting.json @@ -0,0 +1,38 @@ +{ + "type": "minecraft:blasting", + "ingredient": [ + { + "item": "minecraft:golden_pickaxe" + }, + { + "item": "minecraft:golden_shovel" + }, + { + "item": "minecraft:golden_axe" + }, + { + "item": "minecraft:golden_hoe" + }, + { + "item": "minecraft:golden_sword" + }, + { + "item": "minecraft:golden_helmet" + }, + { + "item": "minecraft:golden_chestplate" + }, + { + "item": "minecraft:golden_leggings" + }, + { + "item": "minecraft:golden_boots" + }, + { + "item": "minecraft:golden_horse_armor" + } + ], + "result": "minecraft:gold_nugget", + "experience": 0.1, + "cookingtime": 100 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gold_nugget_from_smelting.json b/astraflow/core/workflow/impl/textcraft/recipes/gold_nugget_from_smelting.json new file mode 100644 index 0000000..58e52b6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gold_nugget_from_smelting.json @@ -0,0 +1,38 @@ +{ + "type": "minecraft:smelting", + "ingredient": [ + { + "item": "minecraft:golden_pickaxe" + }, + { + "item": "minecraft:golden_shovel" + }, + { + "item": "minecraft:golden_axe" + }, + { + "item": "minecraft:golden_hoe" + }, + { + "item": "minecraft:golden_sword" + }, + { + "item": "minecraft:golden_helmet" + }, + { + "item": "minecraft:golden_chestplate" + }, + { + "item": "minecraft:golden_leggings" + }, + { + "item": "minecraft:golden_boots" + }, + { + "item": "minecraft:golden_horse_armor" + } + ], + "result": "minecraft:gold_nugget", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/golden_apple.json b/astraflow/core/workflow/impl/textcraft/recipes/golden_apple.json new file mode 100644 index 0000000..fe8f98a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/golden_apple.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:gold_ingot" + }, + "X": { + "item": "minecraft:apple" + } + }, + "result": { + "item": "minecraft:golden_apple" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/golden_axe.json b/astraflow/core/workflow/impl/textcraft/recipes/golden_axe.json new file mode 100644 index 0000000..265a258 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/golden_axe.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XX", + "X#", + " #" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:gold_ingot" + } + }, + "result": { + "item": "minecraft:golden_axe" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/golden_boots.json b/astraflow/core/workflow/impl/textcraft/recipes/golden_boots.json new file mode 100644 index 0000000..c55a355 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/golden_boots.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X X", + "X X" + ], + "key": { + "X": { + "item": "minecraft:gold_ingot" + } + }, + "result": { + "item": "minecraft:golden_boots" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/golden_carrot.json b/astraflow/core/workflow/impl/textcraft/recipes/golden_carrot.json new file mode 100644 index 0000000..c0f6966 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/golden_carrot.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:gold_nugget" + }, + "X": { + "item": "minecraft:carrot" + } + }, + "result": { + "item": "minecraft:golden_carrot" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/golden_chestplate.json b/astraflow/core/workflow/impl/textcraft/recipes/golden_chestplate.json new file mode 100644 index 0000000..7e98350 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/golden_chestplate.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X X", + "XXX", + "XXX" + ], + "key": { + "X": { + "item": "minecraft:gold_ingot" + } + }, + "result": { + "item": "minecraft:golden_chestplate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/golden_helmet.json b/astraflow/core/workflow/impl/textcraft/recipes/golden_helmet.json new file mode 100644 index 0000000..cd547a1 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/golden_helmet.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XXX", + "X X" + ], + "key": { + "X": { + "item": "minecraft:gold_ingot" + } + }, + "result": { + "item": "minecraft:golden_helmet" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/golden_hoe.json b/astraflow/core/workflow/impl/textcraft/recipes/golden_hoe.json new file mode 100644 index 0000000..3baa42f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/golden_hoe.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XX", + " #", + " #" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:gold_ingot" + } + }, + "result": { + "item": "minecraft:golden_hoe" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/golden_leggings.json b/astraflow/core/workflow/impl/textcraft/recipes/golden_leggings.json new file mode 100644 index 0000000..1d12b5a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/golden_leggings.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XXX", + "X X", + "X X" + ], + "key": { + "X": { + "item": "minecraft:gold_ingot" + } + }, + "result": { + "item": "minecraft:golden_leggings" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/golden_pickaxe.json b/astraflow/core/workflow/impl/textcraft/recipes/golden_pickaxe.json new file mode 100644 index 0000000..32f5675 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/golden_pickaxe.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XXX", + " # ", + " # " + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:gold_ingot" + } + }, + "result": { + "item": "minecraft:golden_pickaxe" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/golden_shovel.json b/astraflow/core/workflow/impl/textcraft/recipes/golden_shovel.json new file mode 100644 index 0000000..fd9b522 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/golden_shovel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X", + "#", + "#" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:gold_ingot" + } + }, + "result": { + "item": "minecraft:golden_shovel" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/golden_sword.json b/astraflow/core/workflow/impl/textcraft/recipes/golden_sword.json new file mode 100644 index 0000000..21d5982 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/golden_sword.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X", + "X", + "#" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:gold_ingot" + } + }, + "result": { + "item": "minecraft:golden_sword" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/granite.json b/astraflow/core/workflow/impl/textcraft/recipes/granite.json new file mode 100644 index 0000000..42c945c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/granite.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:diorite" + }, + { + "item": "minecraft:quartz" + } + ], + "result": { + "item": "minecraft:granite" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/granite_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/granite_slab.json new file mode 100644 index 0000000..1b94399 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/granite_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:granite" + } + }, + "result": { + "item": "minecraft:granite_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/granite_slab_from_granite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/granite_slab_from_granite_stonecutting.json new file mode 100644 index 0000000..275a858 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/granite_slab_from_granite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:granite" + }, + "result": "minecraft:granite_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/granite_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/granite_stairs.json new file mode 100644 index 0000000..63d6f6d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/granite_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:granite" + } + }, + "result": { + "item": "minecraft:granite_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/granite_stairs_from_granite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/granite_stairs_from_granite_stonecutting.json new file mode 100644 index 0000000..941b987 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/granite_stairs_from_granite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:granite" + }, + "result": "minecraft:granite_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/granite_wall.json b/astraflow/core/workflow/impl/textcraft/recipes/granite_wall.json new file mode 100644 index 0000000..ca18577 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/granite_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:granite" + } + }, + "result": { + "item": "minecraft:granite_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/granite_wall_from_granite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/granite_wall_from_granite_stonecutting.json new file mode 100644 index 0000000..1bbc4f2 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/granite_wall_from_granite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:granite" + }, + "result": "minecraft:granite_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gray_banner.json b/astraflow/core/workflow/impl/textcraft/recipes/gray_banner.json new file mode 100644 index 0000000..6155552 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gray_banner.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "banner", + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": { + "item": "minecraft:gray_wool" + }, + "|": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:gray_banner" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gray_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/gray_bed.json new file mode 100644 index 0000000..4941f32 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gray_bed.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed", + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": { + "item": "minecraft:gray_wool" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:gray_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gray_bed_from_white_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/gray_bed_from_white_bed.json new file mode 100644 index 0000000..ff07964 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gray_bed_from_white_bed.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "dyed_bed", + "ingredients": [ + { + "item": "minecraft:white_bed" + }, + { + "item": "minecraft:gray_dye" + } + ], + "result": { + "item": "minecraft:gray_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gray_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/gray_carpet.json new file mode 100644 index 0000000..3538c16 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gray_carpet.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:gray_wool" + } + }, + "result": { + "item": "minecraft:gray_carpet", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gray_carpet_from_white_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/gray_carpet_from_white_carpet.json new file mode 100644 index 0000000..4a5a40a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gray_carpet_from_white_carpet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:white_carpet" + }, + "$": { + "item": "minecraft:gray_dye" + } + }, + "result": { + "item": "minecraft:gray_carpet", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gray_concrete_powder.json b/astraflow/core/workflow/impl/textcraft/recipes/gray_concrete_powder.json new file mode 100644 index 0000000..235c847 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gray_concrete_powder.json @@ -0,0 +1,37 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "concrete_powder", + "ingredients": [ + { + "item": "minecraft:gray_dye" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + } + ], + "result": { + "item": "minecraft:gray_concrete_powder", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gray_dye.json b/astraflow/core/workflow/impl/textcraft/recipes/gray_dye.json new file mode 100644 index 0000000..0402c1c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gray_dye.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:black_dye" + }, + { + "item": "minecraft:white_dye" + } + ], + "result": { + "item": "minecraft:gray_dye", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gray_glazed_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/gray_glazed_terracotta.json new file mode 100644 index 0000000..d8280bf --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gray_glazed_terracotta.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:gray_terracotta" + }, + "result": "minecraft:gray_glazed_terracotta", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gray_stained_glass.json b/astraflow/core/workflow/impl/textcraft/recipes/gray_stained_glass.json new file mode 100644 index 0000000..8841283 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gray_stained_glass.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass" + }, + "X": { + "item": "minecraft:gray_dye" + } + }, + "result": { + "item": "minecraft:gray_stained_glass", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gray_stained_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/gray_stained_glass_pane.json new file mode 100644 index 0000000..bcbc136 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gray_stained_glass_pane.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:gray_stained_glass" + } + }, + "result": { + "item": "minecraft:gray_stained_glass_pane", + "count": 16 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gray_stained_glass_pane_from_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/gray_stained_glass_pane_from_glass_pane.json new file mode 100644 index 0000000..dc40e8f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gray_stained_glass_pane_from_glass_pane.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass_pane" + }, + "$": { + "item": "minecraft:gray_dye" + } + }, + "result": { + "item": "minecraft:gray_stained_glass_pane", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gray_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/gray_terracotta.json new file mode 100644 index 0000000..79d10ed --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gray_terracotta.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_terracotta", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:terracotta" + }, + "X": { + "item": "minecraft:gray_dye" + } + }, + "result": { + "item": "minecraft:gray_terracotta", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/gray_wool.json b/astraflow/core/workflow/impl/textcraft/recipes/gray_wool.json new file mode 100644 index 0000000..f886b51 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/gray_wool.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wool", + "ingredients": [ + { + "item": "minecraft:gray_dye" + }, + { + "item": "minecraft:white_wool" + } + ], + "result": { + "item": "minecraft:gray_wool" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/green_banner.json b/astraflow/core/workflow/impl/textcraft/recipes/green_banner.json new file mode 100644 index 0000000..a8dd983 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/green_banner.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "banner", + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": { + "item": "minecraft:green_wool" + }, + "|": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:green_banner" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/green_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/green_bed.json new file mode 100644 index 0000000..2a75621 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/green_bed.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed", + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": { + "item": "minecraft:green_wool" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:green_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/green_bed_from_white_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/green_bed_from_white_bed.json new file mode 100644 index 0000000..45b7784 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/green_bed_from_white_bed.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "dyed_bed", + "ingredients": [ + { + "item": "minecraft:white_bed" + }, + { + "item": "minecraft:green_dye" + } + ], + "result": { + "item": "minecraft:green_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/green_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/green_carpet.json new file mode 100644 index 0000000..9384363 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/green_carpet.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:green_wool" + } + }, + "result": { + "item": "minecraft:green_carpet", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/green_carpet_from_white_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/green_carpet_from_white_carpet.json new file mode 100644 index 0000000..6fc0d1c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/green_carpet_from_white_carpet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:white_carpet" + }, + "$": { + "item": "minecraft:green_dye" + } + }, + "result": { + "item": "minecraft:green_carpet", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/green_concrete_powder.json b/astraflow/core/workflow/impl/textcraft/recipes/green_concrete_powder.json new file mode 100644 index 0000000..ac1c1ad --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/green_concrete_powder.json @@ -0,0 +1,37 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "concrete_powder", + "ingredients": [ + { + "item": "minecraft:green_dye" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + } + ], + "result": { + "item": "minecraft:green_concrete_powder", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/green_dye.json b/astraflow/core/workflow/impl/textcraft/recipes/green_dye.json new file mode 100644 index 0000000..871c8ed --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/green_dye.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:cactus" + }, + "result": "minecraft:green_dye", + "experience": 1.0, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/green_glazed_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/green_glazed_terracotta.json new file mode 100644 index 0000000..efd4eb3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/green_glazed_terracotta.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:green_terracotta" + }, + "result": "minecraft:green_glazed_terracotta", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/green_stained_glass.json b/astraflow/core/workflow/impl/textcraft/recipes/green_stained_glass.json new file mode 100644 index 0000000..9894998 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/green_stained_glass.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass" + }, + "X": { + "item": "minecraft:green_dye" + } + }, + "result": { + "item": "minecraft:green_stained_glass", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/green_stained_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/green_stained_glass_pane.json new file mode 100644 index 0000000..6ed28b0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/green_stained_glass_pane.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:green_stained_glass" + } + }, + "result": { + "item": "minecraft:green_stained_glass_pane", + "count": 16 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/green_stained_glass_pane_from_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/green_stained_glass_pane_from_glass_pane.json new file mode 100644 index 0000000..90cf3ee --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/green_stained_glass_pane_from_glass_pane.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass_pane" + }, + "$": { + "item": "minecraft:green_dye" + } + }, + "result": { + "item": "minecraft:green_stained_glass_pane", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/green_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/green_terracotta.json new file mode 100644 index 0000000..db34bd7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/green_terracotta.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_terracotta", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:terracotta" + }, + "X": { + "item": "minecraft:green_dye" + } + }, + "result": { + "item": "minecraft:green_terracotta", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/green_wool.json b/astraflow/core/workflow/impl/textcraft/recipes/green_wool.json new file mode 100644 index 0000000..19b441c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/green_wool.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wool", + "ingredients": [ + { + "item": "minecraft:green_dye" + }, + { + "item": "minecraft:white_wool" + } + ], + "result": { + "item": "minecraft:green_wool" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/grindstone.json b/astraflow/core/workflow/impl/textcraft/recipes/grindstone.json new file mode 100644 index 0000000..6a72558 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/grindstone.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "I-I", + "# #" + ], + "key": { + "I": { + "item": "minecraft:stick" + }, + "-": { + "item": "minecraft:stone_slab" + }, + "#": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:grindstone" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/hay_block.json b/astraflow/core/workflow/impl/textcraft/recipes/hay_block.json new file mode 100644 index 0000000..2a80b8d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/hay_block.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:wheat" + } + }, + "result": { + "item": "minecraft:hay_block" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/heavy_weighted_pressure_plate.json b/astraflow/core/workflow/impl/textcraft/recipes/heavy_weighted_pressure_plate.json new file mode 100644 index 0000000..ee28d2d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/heavy_weighted_pressure_plate.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:heavy_weighted_pressure_plate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/honey_block.json b/astraflow/core/workflow/impl/textcraft/recipes/honey_block.json new file mode 100644 index 0000000..dc06fd4 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/honey_block.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SS", + "SS" + ], + "key": { + "S": { + "item": "minecraft:honey_bottle" + } + }, + "result": { + "item": "minecraft:honey_block" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/honey_bottle.json b/astraflow/core/workflow/impl/textcraft/recipes/honey_bottle.json new file mode 100644 index 0000000..f16d660 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/honey_bottle.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:honey_block" + }, + { + "item": "minecraft:glass_bottle" + }, + { + "item": "minecraft:glass_bottle" + }, + { + "item": "minecraft:glass_bottle" + }, + { + "item": "minecraft:glass_bottle" + } + ], + "result": { + "item": "minecraft:honey_bottle", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/honeycomb_block.json b/astraflow/core/workflow/impl/textcraft/recipes/honeycomb_block.json new file mode 100644 index 0000000..da03404 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/honeycomb_block.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "HH", + "HH" + ], + "key": { + "H": { + "item": "minecraft:honeycomb" + } + }, + "result": { + "item": "minecraft:honeycomb_block" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/hopper.json b/astraflow/core/workflow/impl/textcraft/recipes/hopper.json new file mode 100644 index 0000000..5ccbe92 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/hopper.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "I I", + "ICI", + " I " + ], + "key": { + "C": { + "item": "minecraft:chest" + }, + "I": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:hopper" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/hopper_minecart.json b/astraflow/core/workflow/impl/textcraft/recipes/hopper_minecart.json new file mode 100644 index 0000000..f85471b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/hopper_minecart.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "A", + "B" + ], + "key": { + "A": { + "item": "minecraft:hopper" + }, + "B": { + "item": "minecraft:minecart" + } + }, + "result": { + "item": "minecraft:hopper_minecart" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/iron_axe.json b/astraflow/core/workflow/impl/textcraft/recipes/iron_axe.json new file mode 100644 index 0000000..8d3430b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/iron_axe.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XX", + "X#", + " #" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:iron_axe" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/iron_bars.json b/astraflow/core/workflow/impl/textcraft/recipes/iron_bars.json new file mode 100644 index 0000000..0e2552f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/iron_bars.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:iron_bars", + "count": 16 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/iron_block.json b/astraflow/core/workflow/impl/textcraft/recipes/iron_block.json new file mode 100644 index 0000000..5cdfe03 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/iron_block.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:iron_block" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/iron_boots.json b/astraflow/core/workflow/impl/textcraft/recipes/iron_boots.json new file mode 100644 index 0000000..f257c35 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/iron_boots.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X X", + "X X" + ], + "key": { + "X": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:iron_boots" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/iron_chestplate.json b/astraflow/core/workflow/impl/textcraft/recipes/iron_chestplate.json new file mode 100644 index 0000000..d06a59c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/iron_chestplate.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X X", + "XXX", + "XXX" + ], + "key": { + "X": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:iron_chestplate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/iron_door.json b/astraflow/core/workflow/impl/textcraft/recipes/iron_door.json new file mode 100644 index 0000000..c1d6bdd --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/iron_door.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:iron_door", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/iron_helmet.json b/astraflow/core/workflow/impl/textcraft/recipes/iron_helmet.json new file mode 100644 index 0000000..0542327 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/iron_helmet.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XXX", + "X X" + ], + "key": { + "X": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:iron_helmet" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/iron_hoe.json b/astraflow/core/workflow/impl/textcraft/recipes/iron_hoe.json new file mode 100644 index 0000000..f235957 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/iron_hoe.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XX", + " #", + " #" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:iron_hoe" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/iron_ingot.json b/astraflow/core/workflow/impl/textcraft/recipes/iron_ingot.json new file mode 100644 index 0000000..08171ea --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/iron_ingot.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:iron_ore" + }, + "result": "minecraft:iron_ingot", + "experience": 0.7, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/iron_ingot_from_blasting.json b/astraflow/core/workflow/impl/textcraft/recipes/iron_ingot_from_blasting.json new file mode 100644 index 0000000..4626b15 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/iron_ingot_from_blasting.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:blasting", + "ingredient": { + "item": "minecraft:iron_ore" + }, + "result": "minecraft:iron_ingot", + "experience": 0.7, + "cookingtime": 100 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/iron_ingot_from_iron_block.json b/astraflow/core/workflow/impl/textcraft/recipes/iron_ingot_from_iron_block.json new file mode 100644 index 0000000..d0acfdf --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/iron_ingot_from_iron_block.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "iron_ingot", + "ingredients": [ + { + "item": "minecraft:iron_block" + } + ], + "result": { + "item": "minecraft:iron_ingot", + "count": 9 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/iron_ingot_from_nuggets.json b/astraflow/core/workflow/impl/textcraft/recipes/iron_ingot_from_nuggets.json new file mode 100644 index 0000000..c095051 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/iron_ingot_from_nuggets.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "iron_ingot", + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:iron_nugget" + } + }, + "result": { + "item": "minecraft:iron_ingot" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/iron_leggings.json b/astraflow/core/workflow/impl/textcraft/recipes/iron_leggings.json new file mode 100644 index 0000000..25898f4 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/iron_leggings.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XXX", + "X X", + "X X" + ], + "key": { + "X": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:iron_leggings" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/iron_nugget.json b/astraflow/core/workflow/impl/textcraft/recipes/iron_nugget.json new file mode 100644 index 0000000..82b1e0f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/iron_nugget.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:iron_ingot" + } + ], + "result": { + "item": "minecraft:iron_nugget", + "count": 9 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/iron_nugget_from_blasting.json b/astraflow/core/workflow/impl/textcraft/recipes/iron_nugget_from_blasting.json new file mode 100644 index 0000000..1ce36c6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/iron_nugget_from_blasting.json @@ -0,0 +1,50 @@ +{ + "type": "minecraft:blasting", + "ingredient": [ + { + "item": "minecraft:iron_pickaxe" + }, + { + "item": "minecraft:iron_shovel" + }, + { + "item": "minecraft:iron_axe" + }, + { + "item": "minecraft:iron_hoe" + }, + { + "item": "minecraft:iron_sword" + }, + { + "item": "minecraft:iron_helmet" + }, + { + "item": "minecraft:iron_chestplate" + }, + { + "item": "minecraft:iron_leggings" + }, + { + "item": "minecraft:iron_boots" + }, + { + "item": "minecraft:iron_horse_armor" + }, + { + "item": "minecraft:chainmail_helmet" + }, + { + "item": "minecraft:chainmail_chestplate" + }, + { + "item": "minecraft:chainmail_leggings" + }, + { + "item": "minecraft:chainmail_boots" + } + ], + "result": "minecraft:iron_nugget", + "experience": 0.1, + "cookingtime": 100 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/iron_nugget_from_smelting.json b/astraflow/core/workflow/impl/textcraft/recipes/iron_nugget_from_smelting.json new file mode 100644 index 0000000..9002330 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/iron_nugget_from_smelting.json @@ -0,0 +1,50 @@ +{ + "type": "minecraft:smelting", + "ingredient": [ + { + "item": "minecraft:iron_pickaxe" + }, + { + "item": "minecraft:iron_shovel" + }, + { + "item": "minecraft:iron_axe" + }, + { + "item": "minecraft:iron_hoe" + }, + { + "item": "minecraft:iron_sword" + }, + { + "item": "minecraft:iron_helmet" + }, + { + "item": "minecraft:iron_chestplate" + }, + { + "item": "minecraft:iron_leggings" + }, + { + "item": "minecraft:iron_boots" + }, + { + "item": "minecraft:iron_horse_armor" + }, + { + "item": "minecraft:chainmail_helmet" + }, + { + "item": "minecraft:chainmail_chestplate" + }, + { + "item": "minecraft:chainmail_leggings" + }, + { + "item": "minecraft:chainmail_boots" + } + ], + "result": "minecraft:iron_nugget", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/iron_pickaxe.json b/astraflow/core/workflow/impl/textcraft/recipes/iron_pickaxe.json new file mode 100644 index 0000000..d85cb57 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/iron_pickaxe.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XXX", + " # ", + " # " + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:iron_pickaxe" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/iron_shovel.json b/astraflow/core/workflow/impl/textcraft/recipes/iron_shovel.json new file mode 100644 index 0000000..b08e6ac --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/iron_shovel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X", + "#", + "#" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:iron_shovel" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/iron_sword.json b/astraflow/core/workflow/impl/textcraft/recipes/iron_sword.json new file mode 100644 index 0000000..069e94b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/iron_sword.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X", + "X", + "#" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:iron_sword" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/iron_trapdoor.json b/astraflow/core/workflow/impl/textcraft/recipes/iron_trapdoor.json new file mode 100644 index 0000000..ffc5716 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/iron_trapdoor.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:iron_trapdoor" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/item_frame.json b/astraflow/core/workflow/impl/textcraft/recipes/item_frame.json new file mode 100644 index 0000000..3dd76f7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/item_frame.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:leather" + } + }, + "result": { + "item": "minecraft:item_frame" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/jack_o_lantern.json b/astraflow/core/workflow/impl/textcraft/recipes/jack_o_lantern.json new file mode 100644 index 0000000..386ccf2 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/jack_o_lantern.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "A", + "B" + ], + "key": { + "A": { + "item": "minecraft:carved_pumpkin" + }, + "B": { + "item": "minecraft:torch" + } + }, + "result": { + "item": "minecraft:jack_o_lantern" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/jukebox.json b/astraflow/core/workflow/impl/textcraft/recipes/jukebox.json new file mode 100644 index 0000000..3bce8a5 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/jukebox.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "tag": "minecraft:planks" + }, + "X": { + "item": "minecraft:diamond" + } + }, + "result": { + "item": "minecraft:jukebox" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/jungle_boat.json b/astraflow/core/workflow/impl/textcraft/recipes/jungle_boat.json new file mode 100644 index 0000000..e0975b5 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/jungle_boat.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "boat", + "pattern": [ + "# #", + "###" + ], + "key": { + "#": { + "item": "minecraft:jungle_planks" + } + }, + "result": { + "item": "minecraft:jungle_boat" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/jungle_button.json b/astraflow/core/workflow/impl/textcraft/recipes/jungle_button.json new file mode 100644 index 0000000..467014c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/jungle_button.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wooden_button", + "ingredients": [ + { + "item": "minecraft:jungle_planks" + } + ], + "result": { + "item": "minecraft:jungle_button" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/jungle_door.json b/astraflow/core/workflow/impl/textcraft/recipes/jungle_door.json new file mode 100644 index 0000000..d622528 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/jungle_door.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_door", + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:jungle_planks" + } + }, + "result": { + "item": "minecraft:jungle_door", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/jungle_fence.json b/astraflow/core/workflow/impl/textcraft/recipes/jungle_fence.json new file mode 100644 index 0000000..46e54a3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/jungle_fence.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_fence", + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "W": { + "item": "minecraft:jungle_planks" + } + }, + "result": { + "item": "minecraft:jungle_fence", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/jungle_fence_gate.json b/astraflow/core/workflow/impl/textcraft/recipes/jungle_fence_gate.json new file mode 100644 index 0000000..ca06f9a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/jungle_fence_gate.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_fence_gate", + "pattern": [ + "#W#", + "#W#" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "W": { + "item": "minecraft:jungle_planks" + } + }, + "result": { + "item": "minecraft:jungle_fence_gate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/jungle_planks.json b/astraflow/core/workflow/impl/textcraft/recipes/jungle_planks.json new file mode 100644 index 0000000..e556105 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/jungle_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "planks", + "ingredients": [ + { + "tag": "minecraft:jungle_logs" + } + ], + "result": { + "item": "minecraft:jungle_planks", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/jungle_pressure_plate.json b/astraflow/core/workflow/impl/textcraft/recipes/jungle_pressure_plate.json new file mode 100644 index 0000000..526818e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/jungle_pressure_plate.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_pressure_plate", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:jungle_planks" + } + }, + "result": { + "item": "minecraft:jungle_pressure_plate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/jungle_sign.json b/astraflow/core/workflow/impl/textcraft/recipes/jungle_sign.json new file mode 100644 index 0000000..ae02f3d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/jungle_sign.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "sign", + "pattern": [ + "###", + "###", + " X " + ], + "key": { + "#": { + "item": "minecraft:jungle_planks" + }, + "X": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:jungle_sign", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/jungle_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/jungle_slab.json new file mode 100644 index 0000000..70bc8b0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/jungle_slab.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_slab", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:jungle_planks" + } + }, + "result": { + "item": "minecraft:jungle_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/jungle_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/jungle_stairs.json new file mode 100644 index 0000000..826e2bf --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/jungle_stairs.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_stairs", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:jungle_planks" + } + }, + "result": { + "item": "minecraft:jungle_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/jungle_trapdoor.json b/astraflow/core/workflow/impl/textcraft/recipes/jungle_trapdoor.json new file mode 100644 index 0000000..109463f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/jungle_trapdoor.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_trapdoor", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:jungle_planks" + } + }, + "result": { + "item": "minecraft:jungle_trapdoor", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/jungle_wood.json b/astraflow/core/workflow/impl/textcraft/recipes/jungle_wood.json new file mode 100644 index 0000000..e69b047 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/jungle_wood.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bark", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:jungle_log" + } + }, + "result": { + "item": "minecraft:jungle_wood", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/ladder.json b/astraflow/core/workflow/impl/textcraft/recipes/ladder.json new file mode 100644 index 0000000..dc5c6ff --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/ladder.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# #", + "###", + "# #" + ], + "key": { + "#": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:ladder", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lantern.json b/astraflow/core/workflow/impl/textcraft/recipes/lantern.json new file mode 100644 index 0000000..0215e06 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lantern.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XXX", + "X#X", + "XXX" + ], + "key": { + "#": { + "item": "minecraft:torch" + }, + "X": { + "item": "minecraft:iron_nugget" + } + }, + "result": { + "item": "minecraft:lantern" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lapis_block.json b/astraflow/core/workflow/impl/textcraft/recipes/lapis_block.json new file mode 100644 index 0000000..b7c6231 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lapis_block.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:lapis_lazuli" + } + }, + "result": { + "item": "minecraft:lapis_block" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lapis_from_blasting.json b/astraflow/core/workflow/impl/textcraft/recipes/lapis_from_blasting.json new file mode 100644 index 0000000..1f4e162 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lapis_from_blasting.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:blasting", + "ingredient": { + "item": "minecraft:lapis_ore" + }, + "result": "minecraft:lapis_lazuli", + "experience": 0.2, + "cookingtime": 100 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lapis_from_smelting.json b/astraflow/core/workflow/impl/textcraft/recipes/lapis_from_smelting.json new file mode 100644 index 0000000..5d11c13 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lapis_from_smelting.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:lapis_ore" + }, + "result": "minecraft:lapis_lazuli", + "experience": 0.2, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lapis_lazuli.json b/astraflow/core/workflow/impl/textcraft/recipes/lapis_lazuli.json new file mode 100644 index 0000000..b15a540 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lapis_lazuli.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:lapis_block" + } + ], + "result": { + "item": "minecraft:lapis_lazuli", + "count": 9 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lead.json b/astraflow/core/workflow/impl/textcraft/recipes/lead.json new file mode 100644 index 0000000..5e1976a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lead.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "~~ ", + "~O ", + " ~" + ], + "key": { + "~": { + "item": "minecraft:string" + }, + "O": { + "item": "minecraft:slime_ball" + } + }, + "result": { + "item": "minecraft:lead", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/leather.json b/astraflow/core/workflow/impl/textcraft/recipes/leather.json new file mode 100644 index 0000000..028548e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/leather.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:rabbit_hide" + } + }, + "result": { + "item": "minecraft:leather" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/leather_boots.json b/astraflow/core/workflow/impl/textcraft/recipes/leather_boots.json new file mode 100644 index 0000000..75a20b2 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/leather_boots.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X X", + "X X" + ], + "key": { + "X": { + "item": "minecraft:leather" + } + }, + "result": { + "item": "minecraft:leather_boots" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/leather_chestplate.json b/astraflow/core/workflow/impl/textcraft/recipes/leather_chestplate.json new file mode 100644 index 0000000..f0c5f84 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/leather_chestplate.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X X", + "XXX", + "XXX" + ], + "key": { + "X": { + "item": "minecraft:leather" + } + }, + "result": { + "item": "minecraft:leather_chestplate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/leather_helmet.json b/astraflow/core/workflow/impl/textcraft/recipes/leather_helmet.json new file mode 100644 index 0000000..cd72471 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/leather_helmet.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XXX", + "X X" + ], + "key": { + "X": { + "item": "minecraft:leather" + } + }, + "result": { + "item": "minecraft:leather_helmet" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/leather_horse_armor.json b/astraflow/core/workflow/impl/textcraft/recipes/leather_horse_armor.json new file mode 100644 index 0000000..d7677bd --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/leather_horse_armor.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X X", + "XXX", + "X X" + ], + "key": { + "X": { + "item": "minecraft:leather" + } + }, + "result": { + "item": "minecraft:leather_horse_armor" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/leather_leggings.json b/astraflow/core/workflow/impl/textcraft/recipes/leather_leggings.json new file mode 100644 index 0000000..8adb27a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/leather_leggings.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XXX", + "X X", + "X X" + ], + "key": { + "X": { + "item": "minecraft:leather" + } + }, + "result": { + "item": "minecraft:leather_leggings" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lectern.json b/astraflow/core/workflow/impl/textcraft/recipes/lectern.json new file mode 100644 index 0000000..c58f949 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lectern.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SSS", + " B ", + " S " + ], + "key": { + "S": { + "tag": "minecraft:wooden_slabs" + }, + "B": { + "item": "minecraft:bookshelf" + } + }, + "result": { + "item": "minecraft:lectern" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lever.json b/astraflow/core/workflow/impl/textcraft/recipes/lever.json new file mode 100644 index 0000000..4032feb --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lever.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X", + "#" + ], + "key": { + "#": { + "item": "minecraft:cobblestone" + }, + "X": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:lever" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_blue_banner.json b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_banner.json new file mode 100644 index 0000000..6b1cf55 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_banner.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "banner", + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": { + "item": "minecraft:light_blue_wool" + }, + "|": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:light_blue_banner" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_blue_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_bed.json new file mode 100644 index 0000000..71c8efa --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_bed.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed", + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": { + "item": "minecraft:light_blue_wool" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:light_blue_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_blue_bed_from_white_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_bed_from_white_bed.json new file mode 100644 index 0000000..ff47a25 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_bed_from_white_bed.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "dyed_bed", + "ingredients": [ + { + "item": "minecraft:white_bed" + }, + { + "item": "minecraft:light_blue_dye" + } + ], + "result": { + "item": "minecraft:light_blue_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_blue_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_carpet.json new file mode 100644 index 0000000..298a9ce --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_carpet.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:light_blue_wool" + } + }, + "result": { + "item": "minecraft:light_blue_carpet", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_blue_carpet_from_white_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_carpet_from_white_carpet.json new file mode 100644 index 0000000..6be4700 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_carpet_from_white_carpet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:white_carpet" + }, + "$": { + "item": "minecraft:light_blue_dye" + } + }, + "result": { + "item": "minecraft:light_blue_carpet", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_blue_concrete_powder.json b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_concrete_powder.json new file mode 100644 index 0000000..5377768 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_concrete_powder.json @@ -0,0 +1,37 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "concrete_powder", + "ingredients": [ + { + "item": "minecraft:light_blue_dye" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + } + ], + "result": { + "item": "minecraft:light_blue_concrete_powder", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_blue_dye_from_blue_orchid.json b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_dye_from_blue_orchid.json new file mode 100644 index 0000000..d670f91 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_dye_from_blue_orchid.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "light_blue_dye", + "ingredients": [ + { + "item": "minecraft:blue_orchid" + } + ], + "result": { + "item": "minecraft:light_blue_dye" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_blue_dye_from_blue_white_dye.json b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_dye_from_blue_white_dye.json new file mode 100644 index 0000000..7a61de2 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_dye_from_blue_white_dye.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "light_blue_dye", + "ingredients": [ + { + "item": "minecraft:blue_dye" + }, + { + "item": "minecraft:white_dye" + } + ], + "result": { + "item": "minecraft:light_blue_dye", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_blue_glazed_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_glazed_terracotta.json new file mode 100644 index 0000000..d4d2be4 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_glazed_terracotta.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:light_blue_terracotta" + }, + "result": "minecraft:light_blue_glazed_terracotta", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_blue_stained_glass.json b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_stained_glass.json new file mode 100644 index 0000000..4af7f3d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_stained_glass.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass" + }, + "X": { + "item": "minecraft:light_blue_dye" + } + }, + "result": { + "item": "minecraft:light_blue_stained_glass", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_blue_stained_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_stained_glass_pane.json new file mode 100644 index 0000000..a0b1027 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_stained_glass_pane.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:light_blue_stained_glass" + } + }, + "result": { + "item": "minecraft:light_blue_stained_glass_pane", + "count": 16 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_blue_stained_glass_pane_from_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_stained_glass_pane_from_glass_pane.json new file mode 100644 index 0000000..f6a9291 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_stained_glass_pane_from_glass_pane.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass_pane" + }, + "$": { + "item": "minecraft:light_blue_dye" + } + }, + "result": { + "item": "minecraft:light_blue_stained_glass_pane", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_blue_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_terracotta.json new file mode 100644 index 0000000..3cb36df --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_terracotta.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_terracotta", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:terracotta" + }, + "X": { + "item": "minecraft:light_blue_dye" + } + }, + "result": { + "item": "minecraft:light_blue_terracotta", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_blue_wool.json b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_wool.json new file mode 100644 index 0000000..c69ddf5 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_blue_wool.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wool", + "ingredients": [ + { + "item": "minecraft:light_blue_dye" + }, + { + "item": "minecraft:white_wool" + } + ], + "result": { + "item": "minecraft:light_blue_wool" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_gray_banner.json b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_banner.json new file mode 100644 index 0000000..b94336b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_banner.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "banner", + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": { + "item": "minecraft:light_gray_wool" + }, + "|": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:light_gray_banner" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_gray_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_bed.json new file mode 100644 index 0000000..245b256 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_bed.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed", + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": { + "item": "minecraft:light_gray_wool" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:light_gray_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_gray_bed_from_white_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_bed_from_white_bed.json new file mode 100644 index 0000000..ae3473e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_bed_from_white_bed.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "dyed_bed", + "ingredients": [ + { + "item": "minecraft:white_bed" + }, + { + "item": "minecraft:light_gray_dye" + } + ], + "result": { + "item": "minecraft:light_gray_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_gray_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_carpet.json new file mode 100644 index 0000000..eaa24ea --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_carpet.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:light_gray_wool" + } + }, + "result": { + "item": "minecraft:light_gray_carpet", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_gray_carpet_from_white_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_carpet_from_white_carpet.json new file mode 100644 index 0000000..37754b5 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_carpet_from_white_carpet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:white_carpet" + }, + "$": { + "item": "minecraft:light_gray_dye" + } + }, + "result": { + "item": "minecraft:light_gray_carpet", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_gray_concrete_powder.json b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_concrete_powder.json new file mode 100644 index 0000000..c831b65 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_concrete_powder.json @@ -0,0 +1,37 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "concrete_powder", + "ingredients": [ + { + "item": "minecraft:light_gray_dye" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + } + ], + "result": { + "item": "minecraft:light_gray_concrete_powder", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_gray_dye_from_azure_bluet.json b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_dye_from_azure_bluet.json new file mode 100644 index 0000000..2b3f4b2 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_dye_from_azure_bluet.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "light_gray_dye", + "ingredients": [ + { + "item": "minecraft:azure_bluet" + } + ], + "result": { + "item": "minecraft:light_gray_dye" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_gray_dye_from_black_white_dye.json b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_dye_from_black_white_dye.json new file mode 100644 index 0000000..ecea949 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_dye_from_black_white_dye.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "light_gray_dye", + "ingredients": [ + { + "item": "minecraft:black_dye" + }, + { + "item": "minecraft:white_dye" + }, + { + "item": "minecraft:white_dye" + } + ], + "result": { + "item": "minecraft:light_gray_dye", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_gray_dye_from_gray_white_dye.json b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_dye_from_gray_white_dye.json new file mode 100644 index 0000000..fc7936f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_dye_from_gray_white_dye.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "light_gray_dye", + "ingredients": [ + { + "item": "minecraft:gray_dye" + }, + { + "item": "minecraft:white_dye" + } + ], + "result": { + "item": "minecraft:light_gray_dye", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_gray_dye_from_oxeye_daisy.json b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_dye_from_oxeye_daisy.json new file mode 100644 index 0000000..399a287 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_dye_from_oxeye_daisy.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "light_gray_dye", + "ingredients": [ + { + "item": "minecraft:oxeye_daisy" + } + ], + "result": { + "item": "minecraft:light_gray_dye" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_gray_dye_from_white_tulip.json b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_dye_from_white_tulip.json new file mode 100644 index 0000000..74c305c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_dye_from_white_tulip.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "light_gray_dye", + "ingredients": [ + { + "item": "minecraft:white_tulip" + } + ], + "result": { + "item": "minecraft:light_gray_dye" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_gray_glazed_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_glazed_terracotta.json new file mode 100644 index 0000000..2272f45 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_glazed_terracotta.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:light_gray_terracotta" + }, + "result": "minecraft:light_gray_glazed_terracotta", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_gray_stained_glass.json b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_stained_glass.json new file mode 100644 index 0000000..799584d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_stained_glass.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass" + }, + "X": { + "item": "minecraft:light_gray_dye" + } + }, + "result": { + "item": "minecraft:light_gray_stained_glass", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_gray_stained_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_stained_glass_pane.json new file mode 100644 index 0000000..a06d2f6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_stained_glass_pane.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:light_gray_stained_glass" + } + }, + "result": { + "item": "minecraft:light_gray_stained_glass_pane", + "count": 16 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_gray_stained_glass_pane_from_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_stained_glass_pane_from_glass_pane.json new file mode 100644 index 0000000..5bd8e69 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_stained_glass_pane_from_glass_pane.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass_pane" + }, + "$": { + "item": "minecraft:light_gray_dye" + } + }, + "result": { + "item": "minecraft:light_gray_stained_glass_pane", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_gray_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_terracotta.json new file mode 100644 index 0000000..b178027 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_terracotta.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_terracotta", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:terracotta" + }, + "X": { + "item": "minecraft:light_gray_dye" + } + }, + "result": { + "item": "minecraft:light_gray_terracotta", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_gray_wool.json b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_wool.json new file mode 100644 index 0000000..e5c52ed --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_gray_wool.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wool", + "ingredients": [ + { + "item": "minecraft:light_gray_dye" + }, + { + "item": "minecraft:white_wool" + } + ], + "result": { + "item": "minecraft:light_gray_wool" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/light_weighted_pressure_plate.json b/astraflow/core/workflow/impl/textcraft/recipes/light_weighted_pressure_plate.json new file mode 100644 index 0000000..7dd012d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/light_weighted_pressure_plate.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:gold_ingot" + } + }, + "result": { + "item": "minecraft:light_weighted_pressure_plate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lime_banner.json b/astraflow/core/workflow/impl/textcraft/recipes/lime_banner.json new file mode 100644 index 0000000..d7047e8 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lime_banner.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "banner", + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": { + "item": "minecraft:lime_wool" + }, + "|": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:lime_banner" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lime_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/lime_bed.json new file mode 100644 index 0000000..12da0ab --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lime_bed.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed", + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": { + "item": "minecraft:lime_wool" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:lime_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lime_bed_from_white_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/lime_bed_from_white_bed.json new file mode 100644 index 0000000..8fc7e36 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lime_bed_from_white_bed.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "dyed_bed", + "ingredients": [ + { + "item": "minecraft:white_bed" + }, + { + "item": "minecraft:lime_dye" + } + ], + "result": { + "item": "minecraft:lime_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lime_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/lime_carpet.json new file mode 100644 index 0000000..afdfdf5 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lime_carpet.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:lime_wool" + } + }, + "result": { + "item": "minecraft:lime_carpet", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lime_carpet_from_white_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/lime_carpet_from_white_carpet.json new file mode 100644 index 0000000..19fc5eb --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lime_carpet_from_white_carpet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:white_carpet" + }, + "$": { + "item": "minecraft:lime_dye" + } + }, + "result": { + "item": "minecraft:lime_carpet", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lime_concrete_powder.json b/astraflow/core/workflow/impl/textcraft/recipes/lime_concrete_powder.json new file mode 100644 index 0000000..2aec6fa --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lime_concrete_powder.json @@ -0,0 +1,37 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "concrete_powder", + "ingredients": [ + { + "item": "minecraft:lime_dye" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + } + ], + "result": { + "item": "minecraft:lime_concrete_powder", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lime_dye.json b/astraflow/core/workflow/impl/textcraft/recipes/lime_dye.json new file mode 100644 index 0000000..5c185c8 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lime_dye.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:green_dye" + }, + { + "item": "minecraft:white_dye" + } + ], + "result": { + "item": "minecraft:lime_dye", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lime_dye_from_smelting.json b/astraflow/core/workflow/impl/textcraft/recipes/lime_dye_from_smelting.json new file mode 100644 index 0000000..bfe390e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lime_dye_from_smelting.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:sea_pickle" + }, + "result": "minecraft:lime_dye", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lime_glazed_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/lime_glazed_terracotta.json new file mode 100644 index 0000000..e0034f1 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lime_glazed_terracotta.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:lime_terracotta" + }, + "result": "minecraft:lime_glazed_terracotta", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lime_stained_glass.json b/astraflow/core/workflow/impl/textcraft/recipes/lime_stained_glass.json new file mode 100644 index 0000000..a0f45d3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lime_stained_glass.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass" + }, + "X": { + "item": "minecraft:lime_dye" + } + }, + "result": { + "item": "minecraft:lime_stained_glass", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lime_stained_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/lime_stained_glass_pane.json new file mode 100644 index 0000000..3781a7a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lime_stained_glass_pane.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:lime_stained_glass" + } + }, + "result": { + "item": "minecraft:lime_stained_glass_pane", + "count": 16 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lime_stained_glass_pane_from_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/lime_stained_glass_pane_from_glass_pane.json new file mode 100644 index 0000000..aee7f0b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lime_stained_glass_pane_from_glass_pane.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass_pane" + }, + "$": { + "item": "minecraft:lime_dye" + } + }, + "result": { + "item": "minecraft:lime_stained_glass_pane", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lime_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/lime_terracotta.json new file mode 100644 index 0000000..46769ae --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lime_terracotta.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_terracotta", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:terracotta" + }, + "X": { + "item": "minecraft:lime_dye" + } + }, + "result": { + "item": "minecraft:lime_terracotta", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lime_wool.json b/astraflow/core/workflow/impl/textcraft/recipes/lime_wool.json new file mode 100644 index 0000000..28e3ed1 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lime_wool.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wool", + "ingredients": [ + { + "item": "minecraft:lime_dye" + }, + { + "item": "minecraft:white_wool" + } + ], + "result": { + "item": "minecraft:lime_wool" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/lodestone.json b/astraflow/core/workflow/impl/textcraft/recipes/lodestone.json new file mode 100644 index 0000000..c18325c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/lodestone.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SSS", + "S#S", + "SSS" + ], + "key": { + "S": { + "item": "minecraft:chiseled_stone_bricks" + }, + "#": { + "item": "minecraft:netherite_ingot" + } + }, + "result": { + "item": "minecraft:lodestone" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/loom.json b/astraflow/core/workflow/impl/textcraft/recipes/loom.json new file mode 100644 index 0000000..def1838 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/loom.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "@@", + "##" + ], + "key": { + "#": { + "tag": "minecraft:planks" + }, + "@": { + "item": "minecraft:string" + } + }, + "result": { + "item": "minecraft:loom" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/magenta_banner.json b/astraflow/core/workflow/impl/textcraft/recipes/magenta_banner.json new file mode 100644 index 0000000..5ecf760 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/magenta_banner.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "banner", + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": { + "item": "minecraft:magenta_wool" + }, + "|": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:magenta_banner" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/magenta_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/magenta_bed.json new file mode 100644 index 0000000..60395c0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/magenta_bed.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed", + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": { + "item": "minecraft:magenta_wool" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:magenta_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/magenta_bed_from_white_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/magenta_bed_from_white_bed.json new file mode 100644 index 0000000..a861654 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/magenta_bed_from_white_bed.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "dyed_bed", + "ingredients": [ + { + "item": "minecraft:white_bed" + }, + { + "item": "minecraft:magenta_dye" + } + ], + "result": { + "item": "minecraft:magenta_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/magenta_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/magenta_carpet.json new file mode 100644 index 0000000..bc1c90a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/magenta_carpet.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:magenta_wool" + } + }, + "result": { + "item": "minecraft:magenta_carpet", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/magenta_carpet_from_white_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/magenta_carpet_from_white_carpet.json new file mode 100644 index 0000000..023405c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/magenta_carpet_from_white_carpet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:white_carpet" + }, + "$": { + "item": "minecraft:magenta_dye" + } + }, + "result": { + "item": "minecraft:magenta_carpet", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/magenta_concrete_powder.json b/astraflow/core/workflow/impl/textcraft/recipes/magenta_concrete_powder.json new file mode 100644 index 0000000..1e1963c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/magenta_concrete_powder.json @@ -0,0 +1,37 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "concrete_powder", + "ingredients": [ + { + "item": "minecraft:magenta_dye" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + } + ], + "result": { + "item": "minecraft:magenta_concrete_powder", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/magenta_dye_from_allium.json b/astraflow/core/workflow/impl/textcraft/recipes/magenta_dye_from_allium.json new file mode 100644 index 0000000..33d1527 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/magenta_dye_from_allium.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "magenta_dye", + "ingredients": [ + { + "item": "minecraft:allium" + } + ], + "result": { + "item": "minecraft:magenta_dye" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/magenta_dye_from_blue_red_pink.json b/astraflow/core/workflow/impl/textcraft/recipes/magenta_dye_from_blue_red_pink.json new file mode 100644 index 0000000..e0c10e8 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/magenta_dye_from_blue_red_pink.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "magenta_dye", + "ingredients": [ + { + "item": "minecraft:blue_dye" + }, + { + "item": "minecraft:red_dye" + }, + { + "item": "minecraft:pink_dye" + } + ], + "result": { + "item": "minecraft:magenta_dye", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/magenta_dye_from_blue_red_white_dye.json b/astraflow/core/workflow/impl/textcraft/recipes/magenta_dye_from_blue_red_white_dye.json new file mode 100644 index 0000000..ce8ec2d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/magenta_dye_from_blue_red_white_dye.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "magenta_dye", + "ingredients": [ + { + "item": "minecraft:blue_dye" + }, + { + "item": "minecraft:red_dye" + }, + { + "item": "minecraft:red_dye" + }, + { + "item": "minecraft:white_dye" + } + ], + "result": { + "item": "minecraft:magenta_dye", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/magenta_dye_from_lilac.json b/astraflow/core/workflow/impl/textcraft/recipes/magenta_dye_from_lilac.json new file mode 100644 index 0000000..2290ae8 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/magenta_dye_from_lilac.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "magenta_dye", + "ingredients": [ + { + "item": "minecraft:lilac" + } + ], + "result": { + "item": "minecraft:magenta_dye", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/magenta_dye_from_purple_and_pink.json b/astraflow/core/workflow/impl/textcraft/recipes/magenta_dye_from_purple_and_pink.json new file mode 100644 index 0000000..5bd698d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/magenta_dye_from_purple_and_pink.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "magenta_dye", + "ingredients": [ + { + "item": "minecraft:purple_dye" + }, + { + "item": "minecraft:pink_dye" + } + ], + "result": { + "item": "minecraft:magenta_dye", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/magenta_glazed_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/magenta_glazed_terracotta.json new file mode 100644 index 0000000..afd84f7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/magenta_glazed_terracotta.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:magenta_terracotta" + }, + "result": "minecraft:magenta_glazed_terracotta", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/magenta_stained_glass.json b/astraflow/core/workflow/impl/textcraft/recipes/magenta_stained_glass.json new file mode 100644 index 0000000..20aac2c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/magenta_stained_glass.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass" + }, + "X": { + "item": "minecraft:magenta_dye" + } + }, + "result": { + "item": "minecraft:magenta_stained_glass", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/magenta_stained_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/magenta_stained_glass_pane.json new file mode 100644 index 0000000..58e794d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/magenta_stained_glass_pane.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:magenta_stained_glass" + } + }, + "result": { + "item": "minecraft:magenta_stained_glass_pane", + "count": 16 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/magenta_stained_glass_pane_from_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/magenta_stained_glass_pane_from_glass_pane.json new file mode 100644 index 0000000..84eea68 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/magenta_stained_glass_pane_from_glass_pane.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass_pane" + }, + "$": { + "item": "minecraft:magenta_dye" + } + }, + "result": { + "item": "minecraft:magenta_stained_glass_pane", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/magenta_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/magenta_terracotta.json new file mode 100644 index 0000000..d981d39 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/magenta_terracotta.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_terracotta", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:terracotta" + }, + "X": { + "item": "minecraft:magenta_dye" + } + }, + "result": { + "item": "minecraft:magenta_terracotta", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/magenta_wool.json b/astraflow/core/workflow/impl/textcraft/recipes/magenta_wool.json new file mode 100644 index 0000000..bdd3afb --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/magenta_wool.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wool", + "ingredients": [ + { + "item": "minecraft:magenta_dye" + }, + { + "item": "minecraft:white_wool" + } + ], + "result": { + "item": "minecraft:magenta_wool" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/magma_block.json b/astraflow/core/workflow/impl/textcraft/recipes/magma_block.json new file mode 100644 index 0000000..79ea04d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/magma_block.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:magma_cream" + } + }, + "result": { + "item": "minecraft:magma_block" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/magma_cream.json b/astraflow/core/workflow/impl/textcraft/recipes/magma_cream.json new file mode 100644 index 0000000..36981e0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/magma_cream.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:blaze_powder" + }, + { + "item": "minecraft:slime_ball" + } + ], + "result": { + "item": "minecraft:magma_cream" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/map.json b/astraflow/core/workflow/impl/textcraft/recipes/map.json new file mode 100644 index 0000000..7ac390b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/map.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:paper" + }, + "X": { + "item": "minecraft:compass" + } + }, + "result": { + "item": "minecraft:map" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/map_cloning.json b/astraflow/core/workflow/impl/textcraft/recipes/map_cloning.json new file mode 100644 index 0000000..8fdbbce --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/map_cloning.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:crafting_special_mapcloning" +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/map_extending.json b/astraflow/core/workflow/impl/textcraft/recipes/map_extending.json new file mode 100644 index 0000000..97a5a92 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/map_extending.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:crafting_special_mapextending" +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/melon.json b/astraflow/core/workflow/impl/textcraft/recipes/melon.json new file mode 100644 index 0000000..f2f0034 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/melon.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "MMM", + "MMM", + "MMM" + ], + "key": { + "M": { + "item": "minecraft:melon_slice" + } + }, + "result": { + "item": "minecraft:melon" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/melon_seeds.json b/astraflow/core/workflow/impl/textcraft/recipes/melon_seeds.json new file mode 100644 index 0000000..334e9e3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/melon_seeds.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:melon_slice" + } + ], + "result": { + "item": "minecraft:melon_seeds" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/minecart.json b/astraflow/core/workflow/impl/textcraft/recipes/minecart.json new file mode 100644 index 0000000..ea35220 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/minecart.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# #", + "###" + ], + "key": { + "#": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:minecart" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/mojang_banner_pattern.json b/astraflow/core/workflow/impl/textcraft/recipes/mojang_banner_pattern.json new file mode 100644 index 0000000..079f221 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/mojang_banner_pattern.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:enchanted_golden_apple" + } + ], + "result": { + "item": "minecraft:mojang_banner_pattern" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone.json b/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone.json new file mode 100644 index 0000000..f7bf19b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:cobblestone" + }, + { + "item": "minecraft:vine" + } + ], + "result": { + "item": "minecraft:mossy_cobblestone" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_slab.json new file mode 100644 index 0000000..84de5e0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:mossy_cobblestone" + } + }, + "result": { + "item": "minecraft:mossy_cobblestone_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_slab_from_mossy_cobblestone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_slab_from_mossy_cobblestone_stonecutting.json new file mode 100644 index 0000000..eb76e9d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_slab_from_mossy_cobblestone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:mossy_cobblestone" + }, + "result": "minecraft:mossy_cobblestone_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_stairs.json new file mode 100644 index 0000000..e859d20 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:mossy_cobblestone" + } + }, + "result": { + "item": "minecraft:mossy_cobblestone_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_stairs_from_mossy_cobblestone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_stairs_from_mossy_cobblestone_stonecutting.json new file mode 100644 index 0000000..58f7843 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_stairs_from_mossy_cobblestone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:mossy_cobblestone" + }, + "result": "minecraft:mossy_cobblestone_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_wall.json b/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_wall.json new file mode 100644 index 0000000..eaa9f1c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:mossy_cobblestone" + } + }, + "result": { + "item": "minecraft:mossy_cobblestone_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_wall_from_mossy_cobblestone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_wall_from_mossy_cobblestone_stonecutting.json new file mode 100644 index 0000000..1265aa8 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/mossy_cobblestone_wall_from_mossy_cobblestone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:mossy_cobblestone" + }, + "result": "minecraft:mossy_cobblestone_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_slab.json new file mode 100644 index 0000000..63a7b20 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:mossy_stone_bricks" + } + }, + "result": { + "item": "minecraft:mossy_stone_brick_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_slab_from_mossy_stone_brick_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_slab_from_mossy_stone_brick_stonecutting.json new file mode 100644 index 0000000..5c6cdda --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_slab_from_mossy_stone_brick_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:mossy_stone_bricks" + }, + "result": "minecraft:mossy_stone_brick_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_stairs.json new file mode 100644 index 0000000..ce787b1 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:mossy_stone_bricks" + } + }, + "result": { + "item": "minecraft:mossy_stone_brick_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_stairs_from_mossy_stone_brick_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_stairs_from_mossy_stone_brick_stonecutting.json new file mode 100644 index 0000000..9b2e172 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_stairs_from_mossy_stone_brick_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:mossy_stone_bricks" + }, + "result": "minecraft:mossy_stone_brick_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_wall.json b/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_wall.json new file mode 100644 index 0000000..e91a8eb --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:mossy_stone_bricks" + } + }, + "result": { + "item": "minecraft:mossy_stone_brick_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_wall_from_mossy_stone_brick_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_wall_from_mossy_stone_brick_stonecutting.json new file mode 100644 index 0000000..cd58b30 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_brick_wall_from_mossy_stone_brick_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:mossy_stone_bricks" + }, + "result": "minecraft:mossy_stone_brick_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_bricks.json b/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_bricks.json new file mode 100644 index 0000000..74fa333 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/mossy_stone_bricks.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:stone_bricks" + }, + { + "item": "minecraft:vine" + } + ], + "result": { + "item": "minecraft:mossy_stone_bricks" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/mushroom_stew.json b/astraflow/core/workflow/impl/textcraft/recipes/mushroom_stew.json new file mode 100644 index 0000000..507d110 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/mushroom_stew.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:brown_mushroom" + }, + { + "item": "minecraft:red_mushroom" + }, + { + "item": "minecraft:bowl" + } + ], + "result": { + "item": "minecraft:mushroom_stew" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/nether_brick.json b/astraflow/core/workflow/impl/textcraft/recipes/nether_brick.json new file mode 100644 index 0000000..205d738 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/nether_brick.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:netherrack" + }, + "result": "minecraft:nether_brick", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_fence.json b/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_fence.json new file mode 100644 index 0000000..e8acd84 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_fence.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#-#", + "#-#" + ], + "key": { + "#": { + "item": "minecraft:nether_bricks" + }, + "-": { + "item": "minecraft:nether_brick" + } + }, + "result": { + "item": "minecraft:nether_brick_fence", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_slab.json new file mode 100644 index 0000000..65806f5 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:nether_bricks" + } + }, + "result": { + "item": "minecraft:nether_brick_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_slab_from_nether_bricks_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_slab_from_nether_bricks_stonecutting.json new file mode 100644 index 0000000..5da3c14 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_slab_from_nether_bricks_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:nether_bricks" + }, + "result": "minecraft:nether_brick_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_stairs.json new file mode 100644 index 0000000..bb9789f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:nether_bricks" + } + }, + "result": { + "item": "minecraft:nether_brick_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_stairs_from_nether_bricks_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_stairs_from_nether_bricks_stonecutting.json new file mode 100644 index 0000000..955937b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_stairs_from_nether_bricks_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:nether_bricks" + }, + "result": "minecraft:nether_brick_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_wall.json b/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_wall.json new file mode 100644 index 0000000..351346c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:nether_bricks" + } + }, + "result": { + "item": "minecraft:nether_brick_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_wall_from_nether_bricks_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_wall_from_nether_bricks_stonecutting.json new file mode 100644 index 0000000..650fd27 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/nether_brick_wall_from_nether_bricks_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:nether_bricks" + }, + "result": "minecraft:nether_brick_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/nether_bricks.json b/astraflow/core/workflow/impl/textcraft/recipes/nether_bricks.json new file mode 100644 index 0000000..b0fb36a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/nether_bricks.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "NN", + "NN" + ], + "key": { + "N": { + "item": "minecraft:nether_brick" + } + }, + "result": { + "item": "minecraft:nether_bricks" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/nether_wart_block.json b/astraflow/core/workflow/impl/textcraft/recipes/nether_wart_block.json new file mode 100644 index 0000000..d826325 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/nether_wart_block.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:nether_wart" + } + }, + "result": { + "item": "minecraft:nether_wart_block" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/netherite_axe_smithing.json b/astraflow/core/workflow/impl/textcraft/recipes/netherite_axe_smithing.json new file mode 100644 index 0000000..c2996de --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/netherite_axe_smithing.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:smithing", + "base": { + "item": "minecraft:diamond_axe" + }, + "addition": { + "item": "minecraft:netherite_ingot" + }, + "result": { + "item": "minecraft:netherite_axe" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/netherite_block.json b/astraflow/core/workflow/impl/textcraft/recipes/netherite_block.json new file mode 100644 index 0000000..cbf3126 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/netherite_block.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:netherite_ingot" + } + }, + "result": { + "item": "minecraft:netherite_block" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/netherite_boots_smithing.json b/astraflow/core/workflow/impl/textcraft/recipes/netherite_boots_smithing.json new file mode 100644 index 0000000..48b3da7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/netherite_boots_smithing.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:smithing", + "base": { + "item": "minecraft:diamond_boots" + }, + "addition": { + "item": "minecraft:netherite_ingot" + }, + "result": { + "item": "minecraft:netherite_boots" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/netherite_chestplate_smithing.json b/astraflow/core/workflow/impl/textcraft/recipes/netherite_chestplate_smithing.json new file mode 100644 index 0000000..87b583b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/netherite_chestplate_smithing.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:smithing", + "base": { + "item": "minecraft:diamond_chestplate" + }, + "addition": { + "item": "minecraft:netherite_ingot" + }, + "result": { + "item": "minecraft:netherite_chestplate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/netherite_helmet_smithing.json b/astraflow/core/workflow/impl/textcraft/recipes/netherite_helmet_smithing.json new file mode 100644 index 0000000..3788b0c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/netherite_helmet_smithing.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:smithing", + "base": { + "item": "minecraft:diamond_helmet" + }, + "addition": { + "item": "minecraft:netherite_ingot" + }, + "result": { + "item": "minecraft:netherite_helmet" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/netherite_hoe_smithing.json b/astraflow/core/workflow/impl/textcraft/recipes/netherite_hoe_smithing.json new file mode 100644 index 0000000..8c59317 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/netherite_hoe_smithing.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:smithing", + "base": { + "item": "minecraft:diamond_hoe" + }, + "addition": { + "item": "minecraft:netherite_ingot" + }, + "result": { + "item": "minecraft:netherite_hoe" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/netherite_ingot.json b/astraflow/core/workflow/impl/textcraft/recipes/netherite_ingot.json new file mode 100644 index 0000000..6077a9b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/netherite_ingot.json @@ -0,0 +1,33 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "netherite_ingot", + "ingredients": [ + { + "item": "minecraft:netherite_scrap" + }, + { + "item": "minecraft:netherite_scrap" + }, + { + "item": "minecraft:netherite_scrap" + }, + { + "item": "minecraft:netherite_scrap" + }, + { + "item": "minecraft:gold_ingot" + }, + { + "item": "minecraft:gold_ingot" + }, + { + "item": "minecraft:gold_ingot" + }, + { + "item": "minecraft:gold_ingot" + } + ], + "result": { + "item": "minecraft:netherite_ingot" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/netherite_ingot_from_netherite_block.json b/astraflow/core/workflow/impl/textcraft/recipes/netherite_ingot_from_netherite_block.json new file mode 100644 index 0000000..e61416e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/netherite_ingot_from_netherite_block.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "netherite_ingot", + "ingredients": [ + { + "item": "minecraft:netherite_block" + } + ], + "result": { + "item": "minecraft:netherite_ingot", + "count": 9 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/netherite_leggings_smithing.json b/astraflow/core/workflow/impl/textcraft/recipes/netherite_leggings_smithing.json new file mode 100644 index 0000000..b646d52 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/netherite_leggings_smithing.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:smithing", + "base": { + "item": "minecraft:diamond_leggings" + }, + "addition": { + "item": "minecraft:netherite_ingot" + }, + "result": { + "item": "minecraft:netherite_leggings" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/netherite_pickaxe_smithing.json b/astraflow/core/workflow/impl/textcraft/recipes/netherite_pickaxe_smithing.json new file mode 100644 index 0000000..c39310c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/netherite_pickaxe_smithing.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:smithing", + "base": { + "item": "minecraft:diamond_pickaxe" + }, + "addition": { + "item": "minecraft:netherite_ingot" + }, + "result": { + "item": "minecraft:netherite_pickaxe" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/netherite_scrap.json b/astraflow/core/workflow/impl/textcraft/recipes/netherite_scrap.json new file mode 100644 index 0000000..8cf69f5 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/netherite_scrap.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:ancient_debris" + }, + "result": "minecraft:netherite_scrap", + "experience": 2.0, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/netherite_scrap_from_blasting.json b/astraflow/core/workflow/impl/textcraft/recipes/netherite_scrap_from_blasting.json new file mode 100644 index 0000000..dd586b3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/netherite_scrap_from_blasting.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:blasting", + "ingredient": { + "item": "minecraft:ancient_debris" + }, + "result": "minecraft:netherite_scrap", + "experience": 2.0, + "cookingtime": 100 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/netherite_shovel_smithing.json b/astraflow/core/workflow/impl/textcraft/recipes/netherite_shovel_smithing.json new file mode 100644 index 0000000..4530289 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/netherite_shovel_smithing.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:smithing", + "base": { + "item": "minecraft:diamond_shovel" + }, + "addition": { + "item": "minecraft:netherite_ingot" + }, + "result": { + "item": "minecraft:netherite_shovel" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/netherite_sword_smithing.json b/astraflow/core/workflow/impl/textcraft/recipes/netherite_sword_smithing.json new file mode 100644 index 0000000..15afa77 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/netherite_sword_smithing.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:smithing", + "base": { + "item": "minecraft:diamond_sword" + }, + "addition": { + "item": "minecraft:netherite_ingot" + }, + "result": { + "item": "minecraft:netherite_sword" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/note_block.json b/astraflow/core/workflow/impl/textcraft/recipes/note_block.json new file mode 100644 index 0000000..6baea02 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/note_block.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "tag": "minecraft:planks" + }, + "X": { + "item": "minecraft:redstone" + } + }, + "result": { + "item": "minecraft:note_block" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/oak_boat.json b/astraflow/core/workflow/impl/textcraft/recipes/oak_boat.json new file mode 100644 index 0000000..1de9bf3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/oak_boat.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "boat", + "pattern": [ + "# #", + "###" + ], + "key": { + "#": { + "item": "minecraft:oak_planks" + } + }, + "result": { + "item": "minecraft:oak_boat" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/oak_button.json b/astraflow/core/workflow/impl/textcraft/recipes/oak_button.json new file mode 100644 index 0000000..afbfedd --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/oak_button.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wooden_button", + "ingredients": [ + { + "item": "minecraft:oak_planks" + } + ], + "result": { + "item": "minecraft:oak_button" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/oak_door.json b/astraflow/core/workflow/impl/textcraft/recipes/oak_door.json new file mode 100644 index 0000000..92779b1 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/oak_door.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_door", + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:oak_planks" + } + }, + "result": { + "item": "minecraft:oak_door", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/oak_fence.json b/astraflow/core/workflow/impl/textcraft/recipes/oak_fence.json new file mode 100644 index 0000000..7ad33d7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/oak_fence.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_fence", + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "W": { + "item": "minecraft:oak_planks" + } + }, + "result": { + "item": "minecraft:oak_fence", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/oak_fence_gate.json b/astraflow/core/workflow/impl/textcraft/recipes/oak_fence_gate.json new file mode 100644 index 0000000..563bfb3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/oak_fence_gate.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_fence_gate", + "pattern": [ + "#W#", + "#W#" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "W": { + "item": "minecraft:oak_planks" + } + }, + "result": { + "item": "minecraft:oak_fence_gate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/oak_planks.json b/astraflow/core/workflow/impl/textcraft/recipes/oak_planks.json new file mode 100644 index 0000000..e6e4279 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/oak_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "planks", + "ingredients": [ + { + "tag": "minecraft:oak_logs" + } + ], + "result": { + "item": "minecraft:oak_planks", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/oak_pressure_plate.json b/astraflow/core/workflow/impl/textcraft/recipes/oak_pressure_plate.json new file mode 100644 index 0000000..03e3df6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/oak_pressure_plate.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_pressure_plate", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:oak_planks" + } + }, + "result": { + "item": "minecraft:oak_pressure_plate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/oak_sign.json b/astraflow/core/workflow/impl/textcraft/recipes/oak_sign.json new file mode 100644 index 0000000..1c3a03a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/oak_sign.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "sign", + "pattern": [ + "###", + "###", + " X " + ], + "key": { + "#": { + "item": "minecraft:oak_planks" + }, + "X": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:oak_sign", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/oak_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/oak_slab.json new file mode 100644 index 0000000..8e36e00 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/oak_slab.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_slab", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:oak_planks" + } + }, + "result": { + "item": "minecraft:oak_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/oak_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/oak_stairs.json new file mode 100644 index 0000000..1fa97dd --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/oak_stairs.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_stairs", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:oak_planks" + } + }, + "result": { + "item": "minecraft:oak_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/oak_trapdoor.json b/astraflow/core/workflow/impl/textcraft/recipes/oak_trapdoor.json new file mode 100644 index 0000000..4c2b717 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/oak_trapdoor.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_trapdoor", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:oak_planks" + } + }, + "result": { + "item": "minecraft:oak_trapdoor", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/oak_wood.json b/astraflow/core/workflow/impl/textcraft/recipes/oak_wood.json new file mode 100644 index 0000000..6212454 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/oak_wood.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bark", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:oak_log" + } + }, + "result": { + "item": "minecraft:oak_wood", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/observer.json b/astraflow/core/workflow/impl/textcraft/recipes/observer.json new file mode 100644 index 0000000..0637ba9 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/observer.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "RRQ", + "###" + ], + "key": { + "Q": { + "item": "minecraft:quartz" + }, + "R": { + "item": "minecraft:redstone" + }, + "#": { + "item": "minecraft:cobblestone" + } + }, + "result": { + "item": "minecraft:observer" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/orange_banner.json b/astraflow/core/workflow/impl/textcraft/recipes/orange_banner.json new file mode 100644 index 0000000..70692a4 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/orange_banner.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "banner", + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": { + "item": "minecraft:orange_wool" + }, + "|": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:orange_banner" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/orange_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/orange_bed.json new file mode 100644 index 0000000..8f7ae1c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/orange_bed.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed", + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": { + "item": "minecraft:orange_wool" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:orange_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/orange_bed_from_white_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/orange_bed_from_white_bed.json new file mode 100644 index 0000000..3d223a0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/orange_bed_from_white_bed.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "dyed_bed", + "ingredients": [ + { + "item": "minecraft:white_bed" + }, + { + "item": "minecraft:orange_dye" + } + ], + "result": { + "item": "minecraft:orange_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/orange_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/orange_carpet.json new file mode 100644 index 0000000..f22346a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/orange_carpet.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:orange_wool" + } + }, + "result": { + "item": "minecraft:orange_carpet", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/orange_carpet_from_white_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/orange_carpet_from_white_carpet.json new file mode 100644 index 0000000..fc2d2a1 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/orange_carpet_from_white_carpet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:white_carpet" + }, + "$": { + "item": "minecraft:orange_dye" + } + }, + "result": { + "item": "minecraft:orange_carpet", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/orange_concrete_powder.json b/astraflow/core/workflow/impl/textcraft/recipes/orange_concrete_powder.json new file mode 100644 index 0000000..7b603f7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/orange_concrete_powder.json @@ -0,0 +1,37 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "concrete_powder", + "ingredients": [ + { + "item": "minecraft:orange_dye" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + } + ], + "result": { + "item": "minecraft:orange_concrete_powder", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/orange_dye_from_orange_tulip.json b/astraflow/core/workflow/impl/textcraft/recipes/orange_dye_from_orange_tulip.json new file mode 100644 index 0000000..257ca4f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/orange_dye_from_orange_tulip.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "orange_dye", + "ingredients": [ + { + "item": "minecraft:orange_tulip" + } + ], + "result": { + "item": "minecraft:orange_dye" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/orange_dye_from_red_yellow.json b/astraflow/core/workflow/impl/textcraft/recipes/orange_dye_from_red_yellow.json new file mode 100644 index 0000000..e801eeb --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/orange_dye_from_red_yellow.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "orange_dye", + "ingredients": [ + { + "item": "minecraft:red_dye" + }, + { + "item": "minecraft:yellow_dye" + } + ], + "result": { + "item": "minecraft:orange_dye", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/orange_glazed_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/orange_glazed_terracotta.json new file mode 100644 index 0000000..ee417a3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/orange_glazed_terracotta.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:orange_terracotta" + }, + "result": "minecraft:orange_glazed_terracotta", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/orange_stained_glass.json b/astraflow/core/workflow/impl/textcraft/recipes/orange_stained_glass.json new file mode 100644 index 0000000..bc5f43f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/orange_stained_glass.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass" + }, + "X": { + "item": "minecraft:orange_dye" + } + }, + "result": { + "item": "minecraft:orange_stained_glass", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/orange_stained_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/orange_stained_glass_pane.json new file mode 100644 index 0000000..d7f02d1 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/orange_stained_glass_pane.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:orange_stained_glass" + } + }, + "result": { + "item": "minecraft:orange_stained_glass_pane", + "count": 16 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/orange_stained_glass_pane_from_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/orange_stained_glass_pane_from_glass_pane.json new file mode 100644 index 0000000..ba93859 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/orange_stained_glass_pane_from_glass_pane.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass_pane" + }, + "$": { + "item": "minecraft:orange_dye" + } + }, + "result": { + "item": "minecraft:orange_stained_glass_pane", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/orange_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/orange_terracotta.json new file mode 100644 index 0000000..e252427 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/orange_terracotta.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_terracotta", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:terracotta" + }, + "X": { + "item": "minecraft:orange_dye" + } + }, + "result": { + "item": "minecraft:orange_terracotta", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/orange_wool.json b/astraflow/core/workflow/impl/textcraft/recipes/orange_wool.json new file mode 100644 index 0000000..7ab4e68 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/orange_wool.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wool", + "ingredients": [ + { + "item": "minecraft:orange_dye" + }, + { + "item": "minecraft:white_wool" + } + ], + "result": { + "item": "minecraft:orange_wool" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/packed_ice.json b/astraflow/core/workflow/impl/textcraft/recipes/packed_ice.json new file mode 100644 index 0000000..bba6176 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/packed_ice.json @@ -0,0 +1,35 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:ice" + }, + { + "item": "minecraft:ice" + }, + { + "item": "minecraft:ice" + }, + { + "item": "minecraft:ice" + }, + { + "item": "minecraft:ice" + }, + { + "item": "minecraft:ice" + }, + { + "item": "minecraft:ice" + }, + { + "item": "minecraft:ice" + }, + { + "item": "minecraft:ice" + } + ], + "result": { + "item": "minecraft:packed_ice" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/painting.json b/astraflow/core/workflow/impl/textcraft/recipes/painting.json new file mode 100644 index 0000000..5ee04b5 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/painting.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "tag": "minecraft:wool" + } + }, + "result": { + "item": "minecraft:painting" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/paper.json b/astraflow/core/workflow/impl/textcraft/recipes/paper.json new file mode 100644 index 0000000..b03abbe --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/paper.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:sugar_cane" + } + }, + "result": { + "item": "minecraft:paper", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/pink_banner.json b/astraflow/core/workflow/impl/textcraft/recipes/pink_banner.json new file mode 100644 index 0000000..9369d3d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/pink_banner.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "banner", + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": { + "item": "minecraft:pink_wool" + }, + "|": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:pink_banner" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/pink_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/pink_bed.json new file mode 100644 index 0000000..81b023e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/pink_bed.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed", + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": { + "item": "minecraft:pink_wool" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:pink_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/pink_bed_from_white_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/pink_bed_from_white_bed.json new file mode 100644 index 0000000..ff59068 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/pink_bed_from_white_bed.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "dyed_bed", + "ingredients": [ + { + "item": "minecraft:white_bed" + }, + { + "item": "minecraft:pink_dye" + } + ], + "result": { + "item": "minecraft:pink_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/pink_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/pink_carpet.json new file mode 100644 index 0000000..27eb799 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/pink_carpet.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:pink_wool" + } + }, + "result": { + "item": "minecraft:pink_carpet", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/pink_carpet_from_white_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/pink_carpet_from_white_carpet.json new file mode 100644 index 0000000..a2fd626 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/pink_carpet_from_white_carpet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:white_carpet" + }, + "$": { + "item": "minecraft:pink_dye" + } + }, + "result": { + "item": "minecraft:pink_carpet", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/pink_concrete_powder.json b/astraflow/core/workflow/impl/textcraft/recipes/pink_concrete_powder.json new file mode 100644 index 0000000..0dde6d5 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/pink_concrete_powder.json @@ -0,0 +1,37 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "concrete_powder", + "ingredients": [ + { + "item": "minecraft:pink_dye" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + } + ], + "result": { + "item": "minecraft:pink_concrete_powder", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/pink_dye_from_peony.json b/astraflow/core/workflow/impl/textcraft/recipes/pink_dye_from_peony.json new file mode 100644 index 0000000..af2a378 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/pink_dye_from_peony.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "pink_dye", + "ingredients": [ + { + "item": "minecraft:peony" + } + ], + "result": { + "item": "minecraft:pink_dye", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/pink_dye_from_pink_tulip.json b/astraflow/core/workflow/impl/textcraft/recipes/pink_dye_from_pink_tulip.json new file mode 100644 index 0000000..15b063f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/pink_dye_from_pink_tulip.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "pink_dye", + "ingredients": [ + { + "item": "minecraft:pink_tulip" + } + ], + "result": { + "item": "minecraft:pink_dye" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/pink_dye_from_red_white_dye.json b/astraflow/core/workflow/impl/textcraft/recipes/pink_dye_from_red_white_dye.json new file mode 100644 index 0000000..3ed8161 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/pink_dye_from_red_white_dye.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "pink_dye", + "ingredients": [ + { + "item": "minecraft:red_dye" + }, + { + "item": "minecraft:white_dye" + } + ], + "result": { + "item": "minecraft:pink_dye", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/pink_glazed_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/pink_glazed_terracotta.json new file mode 100644 index 0000000..d3b6d67 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/pink_glazed_terracotta.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:pink_terracotta" + }, + "result": "minecraft:pink_glazed_terracotta", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/pink_stained_glass.json b/astraflow/core/workflow/impl/textcraft/recipes/pink_stained_glass.json new file mode 100644 index 0000000..b7888ee --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/pink_stained_glass.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass" + }, + "X": { + "item": "minecraft:pink_dye" + } + }, + "result": { + "item": "minecraft:pink_stained_glass", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/pink_stained_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/pink_stained_glass_pane.json new file mode 100644 index 0000000..8dd8d9e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/pink_stained_glass_pane.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:pink_stained_glass" + } + }, + "result": { + "item": "minecraft:pink_stained_glass_pane", + "count": 16 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/pink_stained_glass_pane_from_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/pink_stained_glass_pane_from_glass_pane.json new file mode 100644 index 0000000..3892925 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/pink_stained_glass_pane_from_glass_pane.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass_pane" + }, + "$": { + "item": "minecraft:pink_dye" + } + }, + "result": { + "item": "minecraft:pink_stained_glass_pane", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/pink_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/pink_terracotta.json new file mode 100644 index 0000000..2b3fc18 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/pink_terracotta.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_terracotta", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:terracotta" + }, + "X": { + "item": "minecraft:pink_dye" + } + }, + "result": { + "item": "minecraft:pink_terracotta", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/pink_wool.json b/astraflow/core/workflow/impl/textcraft/recipes/pink_wool.json new file mode 100644 index 0000000..8654621 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/pink_wool.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wool", + "ingredients": [ + { + "item": "minecraft:pink_dye" + }, + { + "item": "minecraft:white_wool" + } + ], + "result": { + "item": "minecraft:pink_wool" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/piston.json b/astraflow/core/workflow/impl/textcraft/recipes/piston.json new file mode 100644 index 0000000..5d44f8b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/piston.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "TTT", + "#X#", + "#R#" + ], + "key": { + "R": { + "item": "minecraft:redstone" + }, + "#": { + "item": "minecraft:cobblestone" + }, + "T": { + "tag": "minecraft:planks" + }, + "X": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:piston" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite.json new file mode 100644 index 0000000..98cbdfd --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SS", + "SS" + ], + "key": { + "S": { + "item": "minecraft:andesite" + } + }, + "result": { + "item": "minecraft:polished_andesite", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_from_andesite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_from_andesite_stonecutting.json new file mode 100644 index 0000000..0291f16 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_from_andesite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:andesite" + }, + "result": "minecraft:polished_andesite", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_slab.json new file mode 100644 index 0000000..36e787c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:polished_andesite" + } + }, + "result": { + "item": "minecraft:polished_andesite_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_slab_from_andesite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_slab_from_andesite_stonecutting.json new file mode 100644 index 0000000..ced7b27 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_slab_from_andesite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:andesite" + }, + "result": "minecraft:polished_andesite_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_slab_from_polished_andesite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_slab_from_polished_andesite_stonecutting.json new file mode 100644 index 0000000..6447812 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_slab_from_polished_andesite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:polished_andesite" + }, + "result": "minecraft:polished_andesite_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_stairs.json new file mode 100644 index 0000000..d0afed3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:polished_andesite" + } + }, + "result": { + "item": "minecraft:polished_andesite_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_stairs_from_andesite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_stairs_from_andesite_stonecutting.json new file mode 100644 index 0000000..3331782 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_stairs_from_andesite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:andesite" + }, + "result": "minecraft:polished_andesite_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_stairs_from_polished_andesite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_stairs_from_polished_andesite_stonecutting.json new file mode 100644 index 0000000..e47f70f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_andesite_stairs_from_polished_andesite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:polished_andesite" + }, + "result": "minecraft:polished_andesite_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_basalt.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_basalt.json new file mode 100644 index 0000000..0ff33eb --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_basalt.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SS", + "SS" + ], + "key": { + "S": { + "item": "minecraft:basalt" + } + }, + "result": { + "item": "minecraft:polished_basalt", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_basalt_from_basalt_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_basalt_from_basalt_stonecutting.json new file mode 100644 index 0000000..ae62b09 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_basalt_from_basalt_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:basalt" + }, + "result": "minecraft:polished_basalt", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone.json new file mode 100644 index 0000000..b59335a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SS", + "SS" + ], + "key": { + "S": { + "item": "minecraft:blackstone" + } + }, + "result": { + "item": "minecraft:polished_blackstone", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_slab.json new file mode 100644 index 0000000..c0f2f67 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:polished_blackstone_bricks" + } + }, + "result": { + "item": "minecraft:polished_blackstone_brick_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_slab_from_blackstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_slab_from_blackstone_stonecutting.json new file mode 100644 index 0000000..4b50e4e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_slab_from_blackstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:blackstone" + }, + "result": "minecraft:polished_blackstone_brick_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_slab_from_polished_blackstone_bricks_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_slab_from_polished_blackstone_bricks_stonecutting.json new file mode 100644 index 0000000..07af914 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_slab_from_polished_blackstone_bricks_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:polished_blackstone_bricks" + }, + "result": "minecraft:polished_blackstone_brick_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_slab_from_polished_blackstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_slab_from_polished_blackstone_stonecutting.json new file mode 100644 index 0000000..52d92d4 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_slab_from_polished_blackstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:polished_blackstone" + }, + "result": "minecraft:polished_blackstone_brick_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_stairs.json new file mode 100644 index 0000000..4591b01 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:polished_blackstone_bricks" + } + }, + "result": { + "item": "minecraft:polished_blackstone_brick_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_stairs_from_blackstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_stairs_from_blackstone_stonecutting.json new file mode 100644 index 0000000..5f6d13e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_stairs_from_blackstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:blackstone" + }, + "result": "minecraft:polished_blackstone_brick_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_stairs_from_polished_blackstone_bricks_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_stairs_from_polished_blackstone_bricks_stonecutting.json new file mode 100644 index 0000000..bca3891 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_stairs_from_polished_blackstone_bricks_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:polished_blackstone_bricks" + }, + "result": "minecraft:polished_blackstone_brick_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_stairs_from_polished_blackstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_stairs_from_polished_blackstone_stonecutting.json new file mode 100644 index 0000000..e997166 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_stairs_from_polished_blackstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:polished_blackstone" + }, + "result": "minecraft:polished_blackstone_brick_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_wall.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_wall.json new file mode 100644 index 0000000..9dbf776 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:polished_blackstone_bricks" + } + }, + "result": { + "item": "minecraft:polished_blackstone_brick_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_wall_from_blackstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_wall_from_blackstone_stonecutting.json new file mode 100644 index 0000000..0af88de --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_wall_from_blackstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:blackstone" + }, + "result": "minecraft:polished_blackstone_brick_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_wall_from_polished_blackstone_bricks_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_wall_from_polished_blackstone_bricks_stonecutting.json new file mode 100644 index 0000000..55124ec --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_wall_from_polished_blackstone_bricks_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:polished_blackstone_bricks" + }, + "result": "minecraft:polished_blackstone_brick_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_wall_from_polished_blackstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_wall_from_polished_blackstone_stonecutting.json new file mode 100644 index 0000000..fe937e3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_brick_wall_from_polished_blackstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:polished_blackstone" + }, + "result": "minecraft:polished_blackstone_brick_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_bricks.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_bricks.json new file mode 100644 index 0000000..4f18772 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_bricks.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:polished_blackstone" + } + }, + "result": { + "item": "minecraft:polished_blackstone_bricks", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_bricks_from_blackstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_bricks_from_blackstone_stonecutting.json new file mode 100644 index 0000000..bbea702 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_bricks_from_blackstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:blackstone" + }, + "result": "minecraft:polished_blackstone_bricks", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_bricks_from_polished_blackstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_bricks_from_polished_blackstone_stonecutting.json new file mode 100644 index 0000000..d9cd661 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_bricks_from_polished_blackstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:polished_blackstone" + }, + "result": "minecraft:polished_blackstone_bricks", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_button.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_button.json new file mode 100644 index 0000000..292d1fd --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_button.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:polished_blackstone" + } + ], + "result": { + "item": "minecraft:polished_blackstone_button" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_from_blackstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_from_blackstone_stonecutting.json new file mode 100644 index 0000000..d1e9e50 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_from_blackstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:blackstone" + }, + "result": "minecraft:polished_blackstone", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_pressure_plate.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_pressure_plate.json new file mode 100644 index 0000000..e853ec9 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_pressure_plate.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:polished_blackstone" + } + }, + "result": { + "item": "minecraft:polished_blackstone_pressure_plate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_slab.json new file mode 100644 index 0000000..c4ad40c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:polished_blackstone" + } + }, + "result": { + "item": "minecraft:polished_blackstone_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_slab_from_blackstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_slab_from_blackstone_stonecutting.json new file mode 100644 index 0000000..3c00f20 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_slab_from_blackstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:blackstone" + }, + "result": "minecraft:polished_blackstone_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_slab_from_polished_blackstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_slab_from_polished_blackstone_stonecutting.json new file mode 100644 index 0000000..8bf386b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_slab_from_polished_blackstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:polished_blackstone" + }, + "result": "minecraft:polished_blackstone_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_stairs.json new file mode 100644 index 0000000..2abf250 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:polished_blackstone" + } + }, + "result": { + "item": "minecraft:polished_blackstone_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_stairs_from_blackstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_stairs_from_blackstone_stonecutting.json new file mode 100644 index 0000000..c793f74 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_stairs_from_blackstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:blackstone" + }, + "result": "minecraft:polished_blackstone_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_stairs_from_polished_blackstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_stairs_from_polished_blackstone_stonecutting.json new file mode 100644 index 0000000..fa77af5 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_stairs_from_polished_blackstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:polished_blackstone" + }, + "result": "minecraft:polished_blackstone_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_wall.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_wall.json new file mode 100644 index 0000000..555486e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:polished_blackstone" + } + }, + "result": { + "item": "minecraft:polished_blackstone_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_wall_from_blackstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_wall_from_blackstone_stonecutting.json new file mode 100644 index 0000000..e40a0cd --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_wall_from_blackstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:blackstone" + }, + "result": "minecraft:polished_blackstone_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_wall_from_polished_blackstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_wall_from_polished_blackstone_stonecutting.json new file mode 100644 index 0000000..ba3c0f3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_blackstone_wall_from_polished_blackstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:polished_blackstone" + }, + "result": "minecraft:polished_blackstone_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite.json new file mode 100644 index 0000000..94020d0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SS", + "SS" + ], + "key": { + "S": { + "item": "minecraft:diorite" + } + }, + "result": { + "item": "minecraft:polished_diorite", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_from_diorite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_from_diorite_stonecutting.json new file mode 100644 index 0000000..144024c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_from_diorite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:diorite" + }, + "result": "minecraft:polished_diorite", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_slab.json new file mode 100644 index 0000000..52f0257 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:polished_diorite" + } + }, + "result": { + "item": "minecraft:polished_diorite_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_slab_from_diorite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_slab_from_diorite_stonecutting.json new file mode 100644 index 0000000..897753f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_slab_from_diorite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:diorite" + }, + "result": "minecraft:polished_diorite_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_slab_from_polished_diorite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_slab_from_polished_diorite_stonecutting.json new file mode 100644 index 0000000..63b9932 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_slab_from_polished_diorite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:polished_diorite" + }, + "result": "minecraft:polished_diorite_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_stairs.json new file mode 100644 index 0000000..4aa8827 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:polished_diorite" + } + }, + "result": { + "item": "minecraft:polished_diorite_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_stairs_from_diorite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_stairs_from_diorite_stonecutting.json new file mode 100644 index 0000000..6081197 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_stairs_from_diorite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:diorite" + }, + "result": "minecraft:polished_diorite_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_stairs_from_polished_diorite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_stairs_from_polished_diorite_stonecutting.json new file mode 100644 index 0000000..2dcf368 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_diorite_stairs_from_polished_diorite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:polished_diorite" + }, + "result": "minecraft:polished_diorite_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_granite.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_granite.json new file mode 100644 index 0000000..aaac5bc --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_granite.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SS", + "SS" + ], + "key": { + "S": { + "item": "minecraft:granite" + } + }, + "result": { + "item": "minecraft:polished_granite", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_from_granite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_from_granite_stonecutting.json new file mode 100644 index 0000000..701aaac --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_from_granite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:granite" + }, + "result": "minecraft:polished_granite", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_slab.json new file mode 100644 index 0000000..6657ae2 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:polished_granite" + } + }, + "result": { + "item": "minecraft:polished_granite_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_slab_from_granite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_slab_from_granite_stonecutting.json new file mode 100644 index 0000000..abc85b0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_slab_from_granite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:granite" + }, + "result": "minecraft:polished_granite_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_slab_from_polished_granite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_slab_from_polished_granite_stonecutting.json new file mode 100644 index 0000000..590afc3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_slab_from_polished_granite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:polished_granite" + }, + "result": "minecraft:polished_granite_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_stairs.json new file mode 100644 index 0000000..761db4d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:polished_granite" + } + }, + "result": { + "item": "minecraft:polished_granite_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_stairs_from_granite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_stairs_from_granite_stonecutting.json new file mode 100644 index 0000000..7231f28 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_stairs_from_granite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:granite" + }, + "result": "minecraft:polished_granite_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_stairs_from_polished_granite_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_stairs_from_polished_granite_stonecutting.json new file mode 100644 index 0000000..ecee75c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/polished_granite_stairs_from_polished_granite_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:polished_granite" + }, + "result": "minecraft:polished_granite_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/popped_chorus_fruit.json b/astraflow/core/workflow/impl/textcraft/recipes/popped_chorus_fruit.json new file mode 100644 index 0000000..bce84d3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/popped_chorus_fruit.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:chorus_fruit" + }, + "result": "minecraft:popped_chorus_fruit", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/powered_rail.json b/astraflow/core/workflow/impl/textcraft/recipes/powered_rail.json new file mode 100644 index 0000000..d531334 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/powered_rail.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X X", + "X#X", + "XRX" + ], + "key": { + "R": { + "item": "minecraft:redstone" + }, + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:gold_ingot" + } + }, + "result": { + "item": "minecraft:powered_rail", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/prismarine.json b/astraflow/core/workflow/impl/textcraft/recipes/prismarine.json new file mode 100644 index 0000000..bc4b3a8 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/prismarine.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SS", + "SS" + ], + "key": { + "S": { + "item": "minecraft:prismarine_shard" + } + }, + "result": { + "item": "minecraft:prismarine" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/prismarine_brick_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_brick_slab.json new file mode 100644 index 0000000..23be8e5 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_brick_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:prismarine_bricks" + } + }, + "result": { + "item": "minecraft:prismarine_brick_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/prismarine_brick_slab_from_prismarine_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_brick_slab_from_prismarine_stonecutting.json new file mode 100644 index 0000000..09763ce --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_brick_slab_from_prismarine_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:prismarine_bricks" + }, + "result": "minecraft:prismarine_brick_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/prismarine_brick_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_brick_stairs.json new file mode 100644 index 0000000..68601e4 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_brick_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:prismarine_bricks" + } + }, + "result": { + "item": "minecraft:prismarine_brick_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/prismarine_brick_stairs_from_prismarine_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_brick_stairs_from_prismarine_stonecutting.json new file mode 100644 index 0000000..bd34ab3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_brick_stairs_from_prismarine_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:prismarine_bricks" + }, + "result": "minecraft:prismarine_brick_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/prismarine_bricks.json b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_bricks.json new file mode 100644 index 0000000..a682ed9 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_bricks.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SSS", + "SSS", + "SSS" + ], + "key": { + "S": { + "item": "minecraft:prismarine_shard" + } + }, + "result": { + "item": "minecraft:prismarine_bricks" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/prismarine_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_slab.json new file mode 100644 index 0000000..5957feb --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:prismarine" + } + }, + "result": { + "item": "minecraft:prismarine_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/prismarine_slab_from_prismarine_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_slab_from_prismarine_stonecutting.json new file mode 100644 index 0000000..6bbbdd6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_slab_from_prismarine_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:prismarine" + }, + "result": "minecraft:prismarine_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/prismarine_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_stairs.json new file mode 100644 index 0000000..03335c1 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:prismarine" + } + }, + "result": { + "item": "minecraft:prismarine_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/prismarine_stairs_from_prismarine_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_stairs_from_prismarine_stonecutting.json new file mode 100644 index 0000000..39eef1e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_stairs_from_prismarine_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:prismarine" + }, + "result": "minecraft:prismarine_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/prismarine_wall.json b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_wall.json new file mode 100644 index 0000000..e80d38b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:prismarine" + } + }, + "result": { + "item": "minecraft:prismarine_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/prismarine_wall_from_prismarine_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_wall_from_prismarine_stonecutting.json new file mode 100644 index 0000000..fe46ef6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/prismarine_wall_from_prismarine_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:prismarine" + }, + "result": "minecraft:prismarine_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/pumpkin_pie.json b/astraflow/core/workflow/impl/textcraft/recipes/pumpkin_pie.json new file mode 100644 index 0000000..bff9f68 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/pumpkin_pie.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:pumpkin" + }, + { + "item": "minecraft:sugar" + }, + { + "item": "minecraft:egg" + } + ], + "result": { + "item": "minecraft:pumpkin_pie" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/pumpkin_seeds.json b/astraflow/core/workflow/impl/textcraft/recipes/pumpkin_seeds.json new file mode 100644 index 0000000..da8f3b4 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/pumpkin_seeds.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:pumpkin" + } + ], + "result": { + "item": "minecraft:pumpkin_seeds", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/purple_banner.json b/astraflow/core/workflow/impl/textcraft/recipes/purple_banner.json new file mode 100644 index 0000000..d18a8d5 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/purple_banner.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "banner", + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": { + "item": "minecraft:purple_wool" + }, + "|": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:purple_banner" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/purple_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/purple_bed.json new file mode 100644 index 0000000..0d23fec --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/purple_bed.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed", + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": { + "item": "minecraft:purple_wool" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:purple_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/purple_bed_from_white_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/purple_bed_from_white_bed.json new file mode 100644 index 0000000..218754f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/purple_bed_from_white_bed.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "dyed_bed", + "ingredients": [ + { + "item": "minecraft:white_bed" + }, + { + "item": "minecraft:purple_dye" + } + ], + "result": { + "item": "minecraft:purple_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/purple_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/purple_carpet.json new file mode 100644 index 0000000..b2f8e9d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/purple_carpet.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:purple_wool" + } + }, + "result": { + "item": "minecraft:purple_carpet", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/purple_carpet_from_white_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/purple_carpet_from_white_carpet.json new file mode 100644 index 0000000..93010dd --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/purple_carpet_from_white_carpet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:white_carpet" + }, + "$": { + "item": "minecraft:purple_dye" + } + }, + "result": { + "item": "minecraft:purple_carpet", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/purple_concrete_powder.json b/astraflow/core/workflow/impl/textcraft/recipes/purple_concrete_powder.json new file mode 100644 index 0000000..431f887 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/purple_concrete_powder.json @@ -0,0 +1,37 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "concrete_powder", + "ingredients": [ + { + "item": "minecraft:purple_dye" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + } + ], + "result": { + "item": "minecraft:purple_concrete_powder", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/purple_dye.json b/astraflow/core/workflow/impl/textcraft/recipes/purple_dye.json new file mode 100644 index 0000000..750d549 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/purple_dye.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:blue_dye" + }, + { + "item": "minecraft:red_dye" + } + ], + "result": { + "item": "minecraft:purple_dye", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/purple_glazed_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/purple_glazed_terracotta.json new file mode 100644 index 0000000..5b130a0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/purple_glazed_terracotta.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:purple_terracotta" + }, + "result": "minecraft:purple_glazed_terracotta", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/purple_stained_glass.json b/astraflow/core/workflow/impl/textcraft/recipes/purple_stained_glass.json new file mode 100644 index 0000000..4b9a91d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/purple_stained_glass.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass" + }, + "X": { + "item": "minecraft:purple_dye" + } + }, + "result": { + "item": "minecraft:purple_stained_glass", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/purple_stained_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/purple_stained_glass_pane.json new file mode 100644 index 0000000..8aa7364 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/purple_stained_glass_pane.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:purple_stained_glass" + } + }, + "result": { + "item": "minecraft:purple_stained_glass_pane", + "count": 16 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/purple_stained_glass_pane_from_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/purple_stained_glass_pane_from_glass_pane.json new file mode 100644 index 0000000..6925ffe --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/purple_stained_glass_pane_from_glass_pane.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass_pane" + }, + "$": { + "item": "minecraft:purple_dye" + } + }, + "result": { + "item": "minecraft:purple_stained_glass_pane", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/purple_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/purple_terracotta.json new file mode 100644 index 0000000..81e60a1 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/purple_terracotta.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_terracotta", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:terracotta" + }, + "X": { + "item": "minecraft:purple_dye" + } + }, + "result": { + "item": "minecraft:purple_terracotta", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/purple_wool.json b/astraflow/core/workflow/impl/textcraft/recipes/purple_wool.json new file mode 100644 index 0000000..dd3674e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/purple_wool.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wool", + "ingredients": [ + { + "item": "minecraft:purple_dye" + }, + { + "item": "minecraft:white_wool" + } + ], + "result": { + "item": "minecraft:purple_wool" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/purpur_block.json b/astraflow/core/workflow/impl/textcraft/recipes/purpur_block.json new file mode 100644 index 0000000..1ef4ce0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/purpur_block.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "FF", + "FF" + ], + "key": { + "F": { + "item": "minecraft:popped_chorus_fruit" + } + }, + "result": { + "item": "minecraft:purpur_block", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/purpur_pillar.json b/astraflow/core/workflow/impl/textcraft/recipes/purpur_pillar.json new file mode 100644 index 0000000..11ab831 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/purpur_pillar.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "#" + ], + "key": { + "#": { + "item": "minecraft:purpur_slab" + } + }, + "result": { + "item": "minecraft:purpur_pillar" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/purpur_pillar_from_purpur_block_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/purpur_pillar_from_purpur_block_stonecutting.json new file mode 100644 index 0000000..8b89545 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/purpur_pillar_from_purpur_block_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:purpur_block" + }, + "result": "minecraft:purpur_pillar", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/purpur_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/purpur_slab.json new file mode 100644 index 0000000..f837478 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/purpur_slab.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": [ + { + "item": "minecraft:purpur_block" + }, + { + "item": "minecraft:purpur_pillar" + } + ] + }, + "result": { + "item": "minecraft:purpur_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/purpur_slab_from_purpur_block_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/purpur_slab_from_purpur_block_stonecutting.json new file mode 100644 index 0000000..14b8e88 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/purpur_slab_from_purpur_block_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:purpur_block" + }, + "result": "minecraft:purpur_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/purpur_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/purpur_stairs.json new file mode 100644 index 0000000..fc02093 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/purpur_stairs.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": [ + { + "item": "minecraft:purpur_block" + }, + { + "item": "minecraft:purpur_pillar" + } + ] + }, + "result": { + "item": "minecraft:purpur_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/purpur_stairs_from_purpur_block_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/purpur_stairs_from_purpur_block_stonecutting.json new file mode 100644 index 0000000..fef0028 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/purpur_stairs_from_purpur_block_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:purpur_block" + }, + "result": "minecraft:purpur_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/quartz.json b/astraflow/core/workflow/impl/textcraft/recipes/quartz.json new file mode 100644 index 0000000..26f2e3a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/quartz.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:nether_quartz_ore" + }, + "result": "minecraft:quartz", + "experience": 0.2, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/quartz_block.json b/astraflow/core/workflow/impl/textcraft/recipes/quartz_block.json new file mode 100644 index 0000000..102e898 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/quartz_block.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:quartz" + } + }, + "result": { + "item": "minecraft:quartz_block" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/quartz_bricks.json b/astraflow/core/workflow/impl/textcraft/recipes/quartz_bricks.json new file mode 100644 index 0000000..f2c9444 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/quartz_bricks.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:quartz_block" + } + }, + "result": { + "item": "minecraft:quartz_bricks", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/quartz_bricks_from_quartz_block_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/quartz_bricks_from_quartz_block_stonecutting.json new file mode 100644 index 0000000..475b5f3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/quartz_bricks_from_quartz_block_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:quartz_block" + }, + "result": "minecraft:quartz_bricks", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/quartz_from_blasting.json b/astraflow/core/workflow/impl/textcraft/recipes/quartz_from_blasting.json new file mode 100644 index 0000000..097af64 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/quartz_from_blasting.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:blasting", + "ingredient": { + "item": "minecraft:nether_quartz_ore" + }, + "result": "minecraft:quartz", + "experience": 0.2, + "cookingtime": 100 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/quartz_pillar.json b/astraflow/core/workflow/impl/textcraft/recipes/quartz_pillar.json new file mode 100644 index 0000000..256a1be --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/quartz_pillar.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#", + "#" + ], + "key": { + "#": { + "item": "minecraft:quartz_block" + } + }, + "result": { + "item": "minecraft:quartz_pillar", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/quartz_pillar_from_quartz_block_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/quartz_pillar_from_quartz_block_stonecutting.json new file mode 100644 index 0000000..213b63f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/quartz_pillar_from_quartz_block_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:quartz_block" + }, + "result": "minecraft:quartz_pillar", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/quartz_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/quartz_slab.json new file mode 100644 index 0000000..eaa9664 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/quartz_slab.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": [ + { + "item": "minecraft:chiseled_quartz_block" + }, + { + "item": "minecraft:quartz_block" + }, + { + "item": "minecraft:quartz_pillar" + } + ] + }, + "result": { + "item": "minecraft:quartz_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/quartz_slab_from_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/quartz_slab_from_stonecutting.json new file mode 100644 index 0000000..5ca2c2e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/quartz_slab_from_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:quartz_block" + }, + "result": "minecraft:quartz_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/quartz_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/quartz_stairs.json new file mode 100644 index 0000000..b1578f1 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/quartz_stairs.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": [ + { + "item": "minecraft:chiseled_quartz_block" + }, + { + "item": "minecraft:quartz_block" + }, + { + "item": "minecraft:quartz_pillar" + } + ] + }, + "result": { + "item": "minecraft:quartz_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/quartz_stairs_from_quartz_block_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/quartz_stairs_from_quartz_block_stonecutting.json new file mode 100644 index 0000000..3c16d70 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/quartz_stairs_from_quartz_block_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:quartz_block" + }, + "result": "minecraft:quartz_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/rabbit_stew_from_brown_mushroom.json b/astraflow/core/workflow/impl/textcraft/recipes/rabbit_stew_from_brown_mushroom.json new file mode 100644 index 0000000..dd5d803 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/rabbit_stew_from_brown_mushroom.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "rabbit_stew", + "ingredients": [ + { + "item": "minecraft:baked_potato" + }, + { + "item": "minecraft:cooked_rabbit" + }, + { + "item": "minecraft:bowl" + }, + { + "item": "minecraft:carrot" + }, + { + "item": "minecraft:brown_mushroom" + } + ], + "result": { + "item": "minecraft:rabbit_stew" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/rabbit_stew_from_red_mushroom.json b/astraflow/core/workflow/impl/textcraft/recipes/rabbit_stew_from_red_mushroom.json new file mode 100644 index 0000000..cf7eec0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/rabbit_stew_from_red_mushroom.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "rabbit_stew", + "ingredients": [ + { + "item": "minecraft:baked_potato" + }, + { + "item": "minecraft:cooked_rabbit" + }, + { + "item": "minecraft:bowl" + }, + { + "item": "minecraft:carrot" + }, + { + "item": "minecraft:red_mushroom" + } + ], + "result": { + "item": "minecraft:rabbit_stew" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/rail.json b/astraflow/core/workflow/impl/textcraft/recipes/rail.json new file mode 100644 index 0000000..ee8fc02 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/rail.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X X", + "X#X", + "X X" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:rail", + "count": 16 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_banner.json b/astraflow/core/workflow/impl/textcraft/recipes/red_banner.json new file mode 100644 index 0000000..bcb9bf9 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_banner.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "banner", + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": { + "item": "minecraft:red_wool" + }, + "|": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:red_banner" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/red_bed.json new file mode 100644 index 0000000..ffb0e9e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_bed.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed", + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": { + "item": "minecraft:red_wool" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:red_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_bed_from_white_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/red_bed_from_white_bed.json new file mode 100644 index 0000000..36140a6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_bed_from_white_bed.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "dyed_bed", + "ingredients": [ + { + "item": "minecraft:white_bed" + }, + { + "item": "minecraft:red_dye" + } + ], + "result": { + "item": "minecraft:red_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/red_carpet.json new file mode 100644 index 0000000..00b18ce --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_carpet.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:red_wool" + } + }, + "result": { + "item": "minecraft:red_carpet", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_carpet_from_white_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/red_carpet_from_white_carpet.json new file mode 100644 index 0000000..7236d61 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_carpet_from_white_carpet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:white_carpet" + }, + "$": { + "item": "minecraft:red_dye" + } + }, + "result": { + "item": "minecraft:red_carpet", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_concrete_powder.json b/astraflow/core/workflow/impl/textcraft/recipes/red_concrete_powder.json new file mode 100644 index 0000000..a0d04bf --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_concrete_powder.json @@ -0,0 +1,37 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "concrete_powder", + "ingredients": [ + { + "item": "minecraft:red_dye" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + } + ], + "result": { + "item": "minecraft:red_concrete_powder", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_dye_from_beetroot.json b/astraflow/core/workflow/impl/textcraft/recipes/red_dye_from_beetroot.json new file mode 100644 index 0000000..23b85d8 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_dye_from_beetroot.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "red_dye", + "ingredients": [ + { + "item": "minecraft:beetroot" + } + ], + "result": { + "item": "minecraft:red_dye" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_dye_from_poppy.json b/astraflow/core/workflow/impl/textcraft/recipes/red_dye_from_poppy.json new file mode 100644 index 0000000..0b3c31b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_dye_from_poppy.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "red_dye", + "ingredients": [ + { + "item": "minecraft:poppy" + } + ], + "result": { + "item": "minecraft:red_dye" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_dye_from_rose_bush.json b/astraflow/core/workflow/impl/textcraft/recipes/red_dye_from_rose_bush.json new file mode 100644 index 0000000..2b46335 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_dye_from_rose_bush.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "red_dye", + "ingredients": [ + { + "item": "minecraft:rose_bush" + } + ], + "result": { + "item": "minecraft:red_dye", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_dye_from_tulip.json b/astraflow/core/workflow/impl/textcraft/recipes/red_dye_from_tulip.json new file mode 100644 index 0000000..8f061a2 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_dye_from_tulip.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "red_dye", + "ingredients": [ + { + "item": "minecraft:red_tulip" + } + ], + "result": { + "item": "minecraft:red_dye" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_glazed_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/red_glazed_terracotta.json new file mode 100644 index 0000000..1ac5a53 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_glazed_terracotta.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:red_terracotta" + }, + "result": "minecraft:red_glazed_terracotta", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_slab.json new file mode 100644 index 0000000..b4273ce --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:red_nether_bricks" + } + }, + "result": { + "item": "minecraft:red_nether_brick_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_slab_from_red_nether_bricks_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_slab_from_red_nether_bricks_stonecutting.json new file mode 100644 index 0000000..152c307 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_slab_from_red_nether_bricks_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:red_nether_bricks" + }, + "result": "minecraft:red_nether_brick_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_stairs.json new file mode 100644 index 0000000..a2adaf8 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:red_nether_bricks" + } + }, + "result": { + "item": "minecraft:red_nether_brick_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_stairs_from_red_nether_bricks_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_stairs_from_red_nether_bricks_stonecutting.json new file mode 100644 index 0000000..c7f346e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_stairs_from_red_nether_bricks_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:red_nether_bricks" + }, + "result": "minecraft:red_nether_brick_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_wall.json b/astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_wall.json new file mode 100644 index 0000000..ddff055 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:red_nether_bricks" + } + }, + "result": { + "item": "minecraft:red_nether_brick_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_wall_from_red_nether_bricks_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_wall_from_red_nether_bricks_stonecutting.json new file mode 100644 index 0000000..7e03052 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_nether_brick_wall_from_red_nether_bricks_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:red_nether_bricks" + }, + "result": "minecraft:red_nether_brick_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_nether_bricks.json b/astraflow/core/workflow/impl/textcraft/recipes/red_nether_bricks.json new file mode 100644 index 0000000..c43f8c8 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_nether_bricks.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "NW", + "WN" + ], + "key": { + "W": { + "item": "minecraft:nether_wart" + }, + "N": { + "item": "minecraft:nether_brick" + } + }, + "result": { + "item": "minecraft:red_nether_bricks" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone.json b/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone.json new file mode 100644 index 0000000..eca9a86 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:red_sand" + } + }, + "result": { + "item": "minecraft:red_sandstone" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_slab.json new file mode 100644 index 0000000..82d0577 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_slab.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": [ + { + "item": "minecraft:red_sandstone" + }, + { + "item": "minecraft:chiseled_red_sandstone" + } + ] + }, + "result": { + "item": "minecraft:red_sandstone_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_slab_from_red_sandstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_slab_from_red_sandstone_stonecutting.json new file mode 100644 index 0000000..a43c385 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_slab_from_red_sandstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:red_sandstone" + }, + "result": "minecraft:red_sandstone_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_stairs.json new file mode 100644 index 0000000..359ee43 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_stairs.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": [ + { + "item": "minecraft:red_sandstone" + }, + { + "item": "minecraft:chiseled_red_sandstone" + }, + { + "item": "minecraft:cut_red_sandstone" + } + ] + }, + "result": { + "item": "minecraft:red_sandstone_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_stairs_from_red_sandstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_stairs_from_red_sandstone_stonecutting.json new file mode 100644 index 0000000..2282ac2 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_stairs_from_red_sandstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:red_sandstone" + }, + "result": "minecraft:red_sandstone_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_wall.json b/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_wall.json new file mode 100644 index 0000000..3f512dc --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:red_sandstone" + } + }, + "result": { + "item": "minecraft:red_sandstone_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_wall_from_red_sandstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_wall_from_red_sandstone_stonecutting.json new file mode 100644 index 0000000..7520867 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_sandstone_wall_from_red_sandstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:red_sandstone" + }, + "result": "minecraft:red_sandstone_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_stained_glass.json b/astraflow/core/workflow/impl/textcraft/recipes/red_stained_glass.json new file mode 100644 index 0000000..8f686aa --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_stained_glass.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass" + }, + "X": { + "item": "minecraft:red_dye" + } + }, + "result": { + "item": "minecraft:red_stained_glass", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_stained_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/red_stained_glass_pane.json new file mode 100644 index 0000000..652a4ad --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_stained_glass_pane.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:red_stained_glass" + } + }, + "result": { + "item": "minecraft:red_stained_glass_pane", + "count": 16 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_stained_glass_pane_from_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/red_stained_glass_pane_from_glass_pane.json new file mode 100644 index 0000000..b238fc3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_stained_glass_pane_from_glass_pane.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass_pane" + }, + "$": { + "item": "minecraft:red_dye" + } + }, + "result": { + "item": "minecraft:red_stained_glass_pane", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/red_terracotta.json new file mode 100644 index 0000000..437be0d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_terracotta.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_terracotta", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:terracotta" + }, + "X": { + "item": "minecraft:red_dye" + } + }, + "result": { + "item": "minecraft:red_terracotta", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/red_wool.json b/astraflow/core/workflow/impl/textcraft/recipes/red_wool.json new file mode 100644 index 0000000..5777674 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/red_wool.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wool", + "ingredients": [ + { + "item": "minecraft:red_dye" + }, + { + "item": "minecraft:white_wool" + } + ], + "result": { + "item": "minecraft:red_wool" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/redstone.json b/astraflow/core/workflow/impl/textcraft/recipes/redstone.json new file mode 100644 index 0000000..9fea268 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/redstone.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:redstone_block" + } + ], + "result": { + "item": "minecraft:redstone", + "count": 9 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/redstone_block.json b/astraflow/core/workflow/impl/textcraft/recipes/redstone_block.json new file mode 100644 index 0000000..b5844c0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/redstone_block.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:redstone" + } + }, + "result": { + "item": "minecraft:redstone_block" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/redstone_from_blasting.json b/astraflow/core/workflow/impl/textcraft/recipes/redstone_from_blasting.json new file mode 100644 index 0000000..e001024 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/redstone_from_blasting.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:blasting", + "ingredient": { + "item": "minecraft:redstone_ore" + }, + "result": "minecraft:redstone", + "experience": 0.7, + "cookingtime": 100 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/redstone_from_smelting.json b/astraflow/core/workflow/impl/textcraft/recipes/redstone_from_smelting.json new file mode 100644 index 0000000..ae73cd2 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/redstone_from_smelting.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:redstone_ore" + }, + "result": "minecraft:redstone", + "experience": 0.7, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/redstone_lamp.json b/astraflow/core/workflow/impl/textcraft/recipes/redstone_lamp.json new file mode 100644 index 0000000..c0e0c13 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/redstone_lamp.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " R ", + "RGR", + " R " + ], + "key": { + "R": { + "item": "minecraft:redstone" + }, + "G": { + "item": "minecraft:glowstone" + } + }, + "result": { + "item": "minecraft:redstone_lamp" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/redstone_torch.json b/astraflow/core/workflow/impl/textcraft/recipes/redstone_torch.json new file mode 100644 index 0000000..68d88e6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/redstone_torch.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X", + "#" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "item": "minecraft:redstone" + } + }, + "result": { + "item": "minecraft:redstone_torch" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/repair_item.json b/astraflow/core/workflow/impl/textcraft/recipes/repair_item.json new file mode 100644 index 0000000..d3fbc16 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/repair_item.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:crafting_special_repairitem" +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/repeater.json b/astraflow/core/workflow/impl/textcraft/recipes/repeater.json new file mode 100644 index 0000000..e693e76 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/repeater.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#X#", + "III" + ], + "key": { + "#": { + "item": "minecraft:redstone_torch" + }, + "X": { + "item": "minecraft:redstone" + }, + "I": { + "item": "minecraft:stone" + } + }, + "result": { + "item": "minecraft:repeater" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/respawn_anchor.json b/astraflow/core/workflow/impl/textcraft/recipes/respawn_anchor.json new file mode 100644 index 0000000..6ba2caf --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/respawn_anchor.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "OOO", + "GGG", + "OOO" + ], + "key": { + "O": { + "item": "minecraft:crying_obsidian" + }, + "G": { + "item": "minecraft:glowstone" + } + }, + "result": { + "item": "minecraft:respawn_anchor" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/sandstone.json b/astraflow/core/workflow/impl/textcraft/recipes/sandstone.json new file mode 100644 index 0000000..da25845 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/sandstone.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:sand" + } + }, + "result": { + "item": "minecraft:sandstone" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/sandstone_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/sandstone_slab.json new file mode 100644 index 0000000..c92668c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/sandstone_slab.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": [ + { + "item": "minecraft:sandstone" + }, + { + "item": "minecraft:chiseled_sandstone" + } + ] + }, + "result": { + "item": "minecraft:sandstone_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/sandstone_slab_from_sandstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/sandstone_slab_from_sandstone_stonecutting.json new file mode 100644 index 0000000..cb338cb --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/sandstone_slab_from_sandstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:sandstone" + }, + "result": "minecraft:sandstone_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/sandstone_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/sandstone_stairs.json new file mode 100644 index 0000000..19f75a6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/sandstone_stairs.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": [ + { + "item": "minecraft:sandstone" + }, + { + "item": "minecraft:chiseled_sandstone" + }, + { + "item": "minecraft:cut_sandstone" + } + ] + }, + "result": { + "item": "minecraft:sandstone_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/sandstone_stairs_from_sandstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/sandstone_stairs_from_sandstone_stonecutting.json new file mode 100644 index 0000000..58b3c90 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/sandstone_stairs_from_sandstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:sandstone" + }, + "result": "minecraft:sandstone_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/sandstone_wall.json b/astraflow/core/workflow/impl/textcraft/recipes/sandstone_wall.json new file mode 100644 index 0000000..1746368 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/sandstone_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:sandstone" + } + }, + "result": { + "item": "minecraft:sandstone_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/sandstone_wall_from_sandstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/sandstone_wall_from_sandstone_stonecutting.json new file mode 100644 index 0000000..9fb5e3f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/sandstone_wall_from_sandstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:sandstone" + }, + "result": "minecraft:sandstone_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/scaffolding.json b/astraflow/core/workflow/impl/textcraft/recipes/scaffolding.json new file mode 100644 index 0000000..915fd07 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/scaffolding.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "I~I", + "I I", + "I I" + ], + "key": { + "~": { + "item": "minecraft:string" + }, + "I": { + "item": "minecraft:bamboo" + } + }, + "result": { + "item": "minecraft:scaffolding", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/sea_lantern.json b/astraflow/core/workflow/impl/textcraft/recipes/sea_lantern.json new file mode 100644 index 0000000..8a76702 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/sea_lantern.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SCS", + "CCC", + "SCS" + ], + "key": { + "S": { + "item": "minecraft:prismarine_shard" + }, + "C": { + "item": "minecraft:prismarine_crystals" + } + }, + "result": { + "item": "minecraft:sea_lantern" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/shears.json b/astraflow/core/workflow/impl/textcraft/recipes/shears.json new file mode 100644 index 0000000..c69c833 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/shears.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " #", + "# " + ], + "key": { + "#": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:shears" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/shield.json b/astraflow/core/workflow/impl/textcraft/recipes/shield.json new file mode 100644 index 0000000..35f0cee --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/shield.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "WoW", + "WWW", + " W " + ], + "key": { + "W": { + "tag": "minecraft:planks" + }, + "o": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:shield" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/shield_decoration.json b/astraflow/core/workflow/impl/textcraft/recipes/shield_decoration.json new file mode 100644 index 0000000..7672851 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/shield_decoration.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:crafting_special_shielddecoration" +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/shulker_box.json b/astraflow/core/workflow/impl/textcraft/recipes/shulker_box.json new file mode 100644 index 0000000..1a1a224 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/shulker_box.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "-", + "#", + "-" + ], + "key": { + "#": { + "item": "minecraft:chest" + }, + "-": { + "item": "minecraft:shulker_shell" + } + }, + "result": { + "item": "minecraft:shulker_box" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/shulker_box_coloring.json b/astraflow/core/workflow/impl/textcraft/recipes/shulker_box_coloring.json new file mode 100644 index 0000000..ef72382 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/shulker_box_coloring.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:crafting_special_shulkerboxcoloring" +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/skull_banner_pattern.json b/astraflow/core/workflow/impl/textcraft/recipes/skull_banner_pattern.json new file mode 100644 index 0000000..b0f63fe --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/skull_banner_pattern.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:wither_skeleton_skull" + } + ], + "result": { + "item": "minecraft:skull_banner_pattern" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/slime_ball.json b/astraflow/core/workflow/impl/textcraft/recipes/slime_ball.json new file mode 100644 index 0000000..e9a44de --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/slime_ball.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:slime_block" + } + ], + "result": { + "item": "minecraft:slime_ball", + "count": 9 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/slime_block.json b/astraflow/core/workflow/impl/textcraft/recipes/slime_block.json new file mode 100644 index 0000000..b432818 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/slime_block.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:slime_ball" + } + }, + "result": { + "item": "minecraft:slime_block" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/smithing_table.json b/astraflow/core/workflow/impl/textcraft/recipes/smithing_table.json new file mode 100644 index 0000000..28b693f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/smithing_table.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "@@", + "##", + "##" + ], + "key": { + "#": { + "tag": "minecraft:planks" + }, + "@": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:smithing_table" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/smoker.json b/astraflow/core/workflow/impl/textcraft/recipes/smoker.json new file mode 100644 index 0000000..fdd3337 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/smoker.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " # ", + "#X#", + " # " + ], + "key": { + "#": { + "tag": "minecraft:logs" + }, + "X": { + "item": "minecraft:furnace" + } + }, + "result": { + "item": "minecraft:smoker" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/smooth_quartz.json b/astraflow/core/workflow/impl/textcraft/recipes/smooth_quartz.json new file mode 100644 index 0000000..edcc3c8 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/smooth_quartz.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:quartz_block" + }, + "result": "minecraft:smooth_quartz", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/smooth_quartz_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/smooth_quartz_slab.json new file mode 100644 index 0000000..d4555cd --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/smooth_quartz_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:smooth_quartz" + } + }, + "result": { + "item": "minecraft:smooth_quartz_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/smooth_quartz_slab_from_smooth_quartz_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/smooth_quartz_slab_from_smooth_quartz_stonecutting.json new file mode 100644 index 0000000..dcdef33 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/smooth_quartz_slab_from_smooth_quartz_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:smooth_quartz" + }, + "result": "minecraft:smooth_quartz_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/smooth_quartz_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/smooth_quartz_stairs.json new file mode 100644 index 0000000..e6376cb --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/smooth_quartz_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:smooth_quartz" + } + }, + "result": { + "item": "minecraft:smooth_quartz_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/smooth_quartz_stairs_from_smooth_quartz_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/smooth_quartz_stairs_from_smooth_quartz_stonecutting.json new file mode 100644 index 0000000..46933de --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/smooth_quartz_stairs_from_smooth_quartz_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:smooth_quartz" + }, + "result": "minecraft:smooth_quartz_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/smooth_red_sandstone.json b/astraflow/core/workflow/impl/textcraft/recipes/smooth_red_sandstone.json new file mode 100644 index 0000000..a738995 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/smooth_red_sandstone.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:red_sandstone" + }, + "result": "minecraft:smooth_red_sandstone", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/smooth_red_sandstone_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/smooth_red_sandstone_slab.json new file mode 100644 index 0000000..46570ef --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/smooth_red_sandstone_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:smooth_red_sandstone" + } + }, + "result": { + "item": "minecraft:smooth_red_sandstone_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/smooth_red_sandstone_slab_from_smooth_red_sandstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/smooth_red_sandstone_slab_from_smooth_red_sandstone_stonecutting.json new file mode 100644 index 0000000..82e3d66 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/smooth_red_sandstone_slab_from_smooth_red_sandstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:smooth_red_sandstone" + }, + "result": "minecraft:smooth_red_sandstone_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/smooth_red_sandstone_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/smooth_red_sandstone_stairs.json new file mode 100644 index 0000000..27dc4ac --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/smooth_red_sandstone_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:smooth_red_sandstone" + } + }, + "result": { + "item": "minecraft:smooth_red_sandstone_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/smooth_red_sandstone_stairs_from_smooth_red_sandstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/smooth_red_sandstone_stairs_from_smooth_red_sandstone_stonecutting.json new file mode 100644 index 0000000..e83848c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/smooth_red_sandstone_stairs_from_smooth_red_sandstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:smooth_red_sandstone" + }, + "result": "minecraft:smooth_red_sandstone_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/smooth_sandstone.json b/astraflow/core/workflow/impl/textcraft/recipes/smooth_sandstone.json new file mode 100644 index 0000000..c6d07d8 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/smooth_sandstone.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:sandstone" + }, + "result": "minecraft:smooth_sandstone", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/smooth_sandstone_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/smooth_sandstone_slab.json new file mode 100644 index 0000000..f534019 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/smooth_sandstone_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:smooth_sandstone" + } + }, + "result": { + "item": "minecraft:smooth_sandstone_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/smooth_sandstone_slab_from_smooth_sandstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/smooth_sandstone_slab_from_smooth_sandstone_stonecutting.json new file mode 100644 index 0000000..d194f0c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/smooth_sandstone_slab_from_smooth_sandstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:smooth_sandstone" + }, + "result": "minecraft:smooth_sandstone_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/smooth_sandstone_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/smooth_sandstone_stairs.json new file mode 100644 index 0000000..ae0b6b9 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/smooth_sandstone_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:smooth_sandstone" + } + }, + "result": { + "item": "minecraft:smooth_sandstone_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/smooth_sandstone_stairs_from_smooth_sandstone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/smooth_sandstone_stairs_from_smooth_sandstone_stonecutting.json new file mode 100644 index 0000000..86ff37a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/smooth_sandstone_stairs_from_smooth_sandstone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:smooth_sandstone" + }, + "result": "minecraft:smooth_sandstone_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/smooth_stone.json b/astraflow/core/workflow/impl/textcraft/recipes/smooth_stone.json new file mode 100644 index 0000000..b8edf4b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/smooth_stone.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:stone" + }, + "result": "minecraft:smooth_stone", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/smooth_stone_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/smooth_stone_slab.json new file mode 100644 index 0000000..5b5ded6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/smooth_stone_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:smooth_stone" + } + }, + "result": { + "item": "minecraft:smooth_stone_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/smooth_stone_slab_from_smooth_stone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/smooth_stone_slab_from_smooth_stone_stonecutting.json new file mode 100644 index 0000000..622e5fd --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/smooth_stone_slab_from_smooth_stone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:smooth_stone" + }, + "result": "minecraft:smooth_stone_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/snow.json b/astraflow/core/workflow/impl/textcraft/recipes/snow.json new file mode 100644 index 0000000..fdbf886 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/snow.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:snow_block" + } + }, + "result": { + "item": "minecraft:snow", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/snow_block.json b/astraflow/core/workflow/impl/textcraft/recipes/snow_block.json new file mode 100644 index 0000000..78f0f13 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/snow_block.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:snowball" + } + }, + "result": { + "item": "minecraft:snow_block" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/soul_campfire.json b/astraflow/core/workflow/impl/textcraft/recipes/soul_campfire.json new file mode 100644 index 0000000..172dc48 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/soul_campfire.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " S ", + "S#S", + "LLL" + ], + "key": { + "L": { + "tag": "minecraft:logs" + }, + "S": { + "item": "minecraft:stick" + }, + "#": { + "tag": "minecraft:soul_fire_base_blocks" + } + }, + "result": { + "item": "minecraft:soul_campfire" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/soul_lantern.json b/astraflow/core/workflow/impl/textcraft/recipes/soul_lantern.json new file mode 100644 index 0000000..48c87ee --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/soul_lantern.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XXX", + "X#X", + "XXX" + ], + "key": { + "#": { + "item": "minecraft:soul_torch" + }, + "X": { + "item": "minecraft:iron_nugget" + } + }, + "result": { + "item": "minecraft:soul_lantern" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/soul_torch.json b/astraflow/core/workflow/impl/textcraft/recipes/soul_torch.json new file mode 100644 index 0000000..d7beb34 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/soul_torch.json @@ -0,0 +1,28 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X", + "#", + "S" + ], + "key": { + "X": [ + { + "item": "minecraft:coal" + }, + { + "item": "minecraft:charcoal" + } + ], + "#": { + "item": "minecraft:stick" + }, + "S": { + "tag": "minecraft:soul_fire_base_blocks" + } + }, + "result": { + "item": "minecraft:soul_torch", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/spectral_arrow.json b/astraflow/core/workflow/impl/textcraft/recipes/spectral_arrow.json new file mode 100644 index 0000000..9989657 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/spectral_arrow.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " # ", + "#X#", + " # " + ], + "key": { + "#": { + "item": "minecraft:glowstone_dust" + }, + "X": { + "item": "minecraft:arrow" + } + }, + "result": { + "item": "minecraft:spectral_arrow", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/sponge.json b/astraflow/core/workflow/impl/textcraft/recipes/sponge.json new file mode 100644 index 0000000..27fa250 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/sponge.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:wet_sponge" + }, + "result": "minecraft:sponge", + "experience": 0.15, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/spruce_boat.json b/astraflow/core/workflow/impl/textcraft/recipes/spruce_boat.json new file mode 100644 index 0000000..d60edad --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/spruce_boat.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "boat", + "pattern": [ + "# #", + "###" + ], + "key": { + "#": { + "item": "minecraft:spruce_planks" + } + }, + "result": { + "item": "minecraft:spruce_boat" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/spruce_button.json b/astraflow/core/workflow/impl/textcraft/recipes/spruce_button.json new file mode 100644 index 0000000..05a9217 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/spruce_button.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wooden_button", + "ingredients": [ + { + "item": "minecraft:spruce_planks" + } + ], + "result": { + "item": "minecraft:spruce_button" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/spruce_door.json b/astraflow/core/workflow/impl/textcraft/recipes/spruce_door.json new file mode 100644 index 0000000..478d8d3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/spruce_door.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_door", + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:spruce_planks" + } + }, + "result": { + "item": "minecraft:spruce_door", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/spruce_fence.json b/astraflow/core/workflow/impl/textcraft/recipes/spruce_fence.json new file mode 100644 index 0000000..980344e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/spruce_fence.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_fence", + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "W": { + "item": "minecraft:spruce_planks" + } + }, + "result": { + "item": "minecraft:spruce_fence", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/spruce_fence_gate.json b/astraflow/core/workflow/impl/textcraft/recipes/spruce_fence_gate.json new file mode 100644 index 0000000..ae5e5b6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/spruce_fence_gate.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_fence_gate", + "pattern": [ + "#W#", + "#W#" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "W": { + "item": "minecraft:spruce_planks" + } + }, + "result": { + "item": "minecraft:spruce_fence_gate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/spruce_planks.json b/astraflow/core/workflow/impl/textcraft/recipes/spruce_planks.json new file mode 100644 index 0000000..641608e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/spruce_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "planks", + "ingredients": [ + { + "tag": "minecraft:spruce_logs" + } + ], + "result": { + "item": "minecraft:spruce_planks", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/spruce_pressure_plate.json b/astraflow/core/workflow/impl/textcraft/recipes/spruce_pressure_plate.json new file mode 100644 index 0000000..9e8bd0d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/spruce_pressure_plate.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_pressure_plate", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:spruce_planks" + } + }, + "result": { + "item": "minecraft:spruce_pressure_plate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/spruce_sign.json b/astraflow/core/workflow/impl/textcraft/recipes/spruce_sign.json new file mode 100644 index 0000000..220548f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/spruce_sign.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "sign", + "pattern": [ + "###", + "###", + " X " + ], + "key": { + "#": { + "item": "minecraft:spruce_planks" + }, + "X": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:spruce_sign", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/spruce_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/spruce_slab.json new file mode 100644 index 0000000..ec16b94 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/spruce_slab.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_slab", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:spruce_planks" + } + }, + "result": { + "item": "minecraft:spruce_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/spruce_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/spruce_stairs.json new file mode 100644 index 0000000..d937ce0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/spruce_stairs.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_stairs", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:spruce_planks" + } + }, + "result": { + "item": "minecraft:spruce_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/spruce_trapdoor.json b/astraflow/core/workflow/impl/textcraft/recipes/spruce_trapdoor.json new file mode 100644 index 0000000..da6268d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/spruce_trapdoor.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_trapdoor", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:spruce_planks" + } + }, + "result": { + "item": "minecraft:spruce_trapdoor", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/spruce_wood.json b/astraflow/core/workflow/impl/textcraft/recipes/spruce_wood.json new file mode 100644 index 0000000..a47010b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/spruce_wood.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bark", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:spruce_log" + } + }, + "result": { + "item": "minecraft:spruce_wood", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stick.json b/astraflow/core/workflow/impl/textcraft/recipes/stick.json new file mode 100644 index 0000000..70d79d3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stick.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "sticks", + "pattern": [ + "#", + "#" + ], + "key": { + "#": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:stick", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stick_from_bamboo_item.json b/astraflow/core/workflow/impl/textcraft/recipes/stick_from_bamboo_item.json new file mode 100644 index 0000000..e25ceea --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stick_from_bamboo_item.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "sticks", + "pattern": [ + "#", + "#" + ], + "key": { + "#": { + "item": "minecraft:bamboo" + } + }, + "result": { + "item": "minecraft:stick" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/sticky_piston.json b/astraflow/core/workflow/impl/textcraft/recipes/sticky_piston.json new file mode 100644 index 0000000..b153e16 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/sticky_piston.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "S", + "P" + ], + "key": { + "P": { + "item": "minecraft:piston" + }, + "S": { + "item": "minecraft:slime_ball" + } + }, + "result": { + "item": "minecraft:sticky_piston" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone.json b/astraflow/core/workflow/impl/textcraft/recipes/stone.json new file mode 100644 index 0000000..8ed533f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:cobblestone" + }, + "result": "minecraft:stone", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_axe.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_axe.json new file mode 100644 index 0000000..c796920 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_axe.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XX", + "X#", + " #" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "tag": "minecraft:stone_tool_materials" + } + }, + "result": { + "item": "minecraft:stone_axe" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_slab.json new file mode 100644 index 0000000..7cd943c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:stone_bricks" + } + }, + "result": { + "item": "minecraft:stone_brick_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_slab_from_stone_bricks_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_slab_from_stone_bricks_stonecutting.json new file mode 100644 index 0000000..94f762f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_slab_from_stone_bricks_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:stone_bricks" + }, + "result": "minecraft:stone_brick_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_slab_from_stone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_slab_from_stone_stonecutting.json new file mode 100644 index 0000000..ab4aebf --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_slab_from_stone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:stone" + }, + "result": "minecraft:stone_brick_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_stairs.json new file mode 100644 index 0000000..f1394af --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:stone_bricks" + } + }, + "result": { + "item": "minecraft:stone_brick_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_stairs_from_stone_bricks_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_stairs_from_stone_bricks_stonecutting.json new file mode 100644 index 0000000..21ce9d8 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_stairs_from_stone_bricks_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:stone_bricks" + }, + "result": "minecraft:stone_brick_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_stairs_from_stone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_stairs_from_stone_stonecutting.json new file mode 100644 index 0000000..a48822a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_stairs_from_stone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:stone" + }, + "result": "minecraft:stone_brick_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_wall.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_wall.json new file mode 100644 index 0000000..d5e0e9e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:stone_bricks" + } + }, + "result": { + "item": "minecraft:stone_brick_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_wall_from_stone_bricks_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_wall_from_stone_bricks_stonecutting.json new file mode 100644 index 0000000..9a5800c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_wall_from_stone_bricks_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:stone_bricks" + }, + "result": "minecraft:stone_brick_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_walls_from_stone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_walls_from_stone_stonecutting.json new file mode 100644 index 0000000..bbf630c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_brick_walls_from_stone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:stone" + }, + "result": "minecraft:stone_brick_wall", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_bricks.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_bricks.json new file mode 100644 index 0000000..4595c26 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_bricks.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:stone" + } + }, + "result": { + "item": "minecraft:stone_bricks", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_bricks_from_stone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_bricks_from_stone_stonecutting.json new file mode 100644 index 0000000..bc1f971 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_bricks_from_stone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:stone" + }, + "result": "minecraft:stone_bricks", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_button.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_button.json new file mode 100644 index 0000000..ee596e0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_button.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:stone" + } + ], + "result": { + "item": "minecraft:stone_button" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_hoe.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_hoe.json new file mode 100644 index 0000000..b1612f6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_hoe.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XX", + " #", + " #" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "tag": "minecraft:stone_tool_materials" + } + }, + "result": { + "item": "minecraft:stone_hoe" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_pickaxe.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_pickaxe.json new file mode 100644 index 0000000..fadc41b --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_pickaxe.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XXX", + " # ", + " # " + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "tag": "minecraft:stone_tool_materials" + } + }, + "result": { + "item": "minecraft:stone_pickaxe" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_pressure_plate.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_pressure_plate.json new file mode 100644 index 0000000..ea714c3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_pressure_plate.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:stone" + } + }, + "result": { + "item": "minecraft:stone_pressure_plate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_shovel.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_shovel.json new file mode 100644 index 0000000..f1de430 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_shovel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X", + "#", + "#" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "tag": "minecraft:stone_tool_materials" + } + }, + "result": { + "item": "minecraft:stone_shovel" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_slab.json new file mode 100644 index 0000000..de66ee7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:stone" + } + }, + "result": { + "item": "minecraft:stone_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_slab_from_stone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_slab_from_stone_stonecutting.json new file mode 100644 index 0000000..c7394e7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_slab_from_stone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:stone" + }, + "result": "minecraft:stone_slab", + "count": 2 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_stairs.json new file mode 100644 index 0000000..7af7bbd --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:stone" + } + }, + "result": { + "item": "minecraft:stone_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_stairs_from_stone_stonecutting.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_stairs_from_stone_stonecutting.json new file mode 100644 index 0000000..d2b9b10 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_stairs_from_stone_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "minecraft:stone" + }, + "result": "minecraft:stone_stairs", + "count": 1 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stone_sword.json b/astraflow/core/workflow/impl/textcraft/recipes/stone_sword.json new file mode 100644 index 0000000..37a0dd6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stone_sword.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X", + "X", + "#" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "tag": "minecraft:stone_tool_materials" + } + }, + "result": { + "item": "minecraft:stone_sword" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stonecutter.json b/astraflow/core/workflow/impl/textcraft/recipes/stonecutter.json new file mode 100644 index 0000000..d6da249 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stonecutter.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " I ", + "###" + ], + "key": { + "I": { + "item": "minecraft:iron_ingot" + }, + "#": { + "item": "minecraft:stone" + } + }, + "result": { + "item": "minecraft:stonecutter" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stripped_acacia_wood.json b/astraflow/core/workflow/impl/textcraft/recipes/stripped_acacia_wood.json new file mode 100644 index 0000000..a40906c --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stripped_acacia_wood.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bark", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:stripped_acacia_log" + } + }, + "result": { + "item": "minecraft:stripped_acacia_wood", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stripped_birch_wood.json b/astraflow/core/workflow/impl/textcraft/recipes/stripped_birch_wood.json new file mode 100644 index 0000000..5e969cc --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stripped_birch_wood.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bark", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:stripped_birch_log" + } + }, + "result": { + "item": "minecraft:stripped_birch_wood", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stripped_crimson_hyphae.json b/astraflow/core/workflow/impl/textcraft/recipes/stripped_crimson_hyphae.json new file mode 100644 index 0000000..e9725af --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stripped_crimson_hyphae.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bark", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:stripped_crimson_stem" + } + }, + "result": { + "item": "minecraft:stripped_crimson_hyphae", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stripped_dark_oak_wood.json b/astraflow/core/workflow/impl/textcraft/recipes/stripped_dark_oak_wood.json new file mode 100644 index 0000000..e03e49e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stripped_dark_oak_wood.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bark", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:stripped_dark_oak_log" + } + }, + "result": { + "item": "minecraft:stripped_dark_oak_wood", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stripped_jungle_wood.json b/astraflow/core/workflow/impl/textcraft/recipes/stripped_jungle_wood.json new file mode 100644 index 0000000..dfff75f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stripped_jungle_wood.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bark", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:stripped_jungle_log" + } + }, + "result": { + "item": "minecraft:stripped_jungle_wood", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stripped_oak_wood.json b/astraflow/core/workflow/impl/textcraft/recipes/stripped_oak_wood.json new file mode 100644 index 0000000..de68d18 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stripped_oak_wood.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bark", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:stripped_oak_log" + } + }, + "result": { + "item": "minecraft:stripped_oak_wood", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stripped_spruce_wood.json b/astraflow/core/workflow/impl/textcraft/recipes/stripped_spruce_wood.json new file mode 100644 index 0000000..301a908 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stripped_spruce_wood.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bark", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:stripped_spruce_log" + } + }, + "result": { + "item": "minecraft:stripped_spruce_wood", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/stripped_warped_hyphae.json b/astraflow/core/workflow/impl/textcraft/recipes/stripped_warped_hyphae.json new file mode 100644 index 0000000..4cc7f88 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/stripped_warped_hyphae.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bark", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:stripped_warped_stem" + } + }, + "result": { + "item": "minecraft:stripped_warped_hyphae", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/sugar.json b/astraflow/core/workflow/impl/textcraft/recipes/sugar.json new file mode 100644 index 0000000..9e17052 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/sugar.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:sugar_cane" + } + ], + "result": { + "item": "minecraft:sugar" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/sugar_from_honey_bottle.json b/astraflow/core/workflow/impl/textcraft/recipes/sugar_from_honey_bottle.json new file mode 100644 index 0000000..23b30e8 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/sugar_from_honey_bottle.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "sugar", + "ingredients": [ + { + "item": "minecraft:honey_bottle" + } + ], + "result": { + "item": "minecraft:sugar", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/sugar_from_sugar_cane.json b/astraflow/core/workflow/impl/textcraft/recipes/sugar_from_sugar_cane.json new file mode 100644 index 0000000..68d44c0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/sugar_from_sugar_cane.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "sugar", + "ingredients": [ + { + "item": "minecraft:sugar_cane" + } + ], + "result": { + "item": "minecraft:sugar" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/suspicious_stew.json b/astraflow/core/workflow/impl/textcraft/recipes/suspicious_stew.json new file mode 100644 index 0000000..c737e8a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/suspicious_stew.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:crafting_special_suspiciousstew" +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/target.json b/astraflow/core/workflow/impl/textcraft/recipes/target.json new file mode 100644 index 0000000..6d57cc7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/target.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " R ", + "RHR", + " R " + ], + "key": { + "H": { + "item": "minecraft:hay_block" + }, + "R": { + "item": "minecraft:redstone" + } + }, + "result": { + "item": "minecraft:target" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/terracotta.json new file mode 100644 index 0000000..0938de6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/terracotta.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:clay" + }, + "result": "minecraft:terracotta", + "experience": 0.35, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/tipped_arrow.json b/astraflow/core/workflow/impl/textcraft/recipes/tipped_arrow.json new file mode 100644 index 0000000..71c7aa5 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/tipped_arrow.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:crafting_special_tippedarrow" +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/tnt.json b/astraflow/core/workflow/impl/textcraft/recipes/tnt.json new file mode 100644 index 0000000..02aa4cc --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/tnt.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X#X", + "#X#", + "X#X" + ], + "key": { + "#": [ + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:red_sand" + } + ], + "X": { + "item": "minecraft:gunpowder" + } + }, + "result": { + "item": "minecraft:tnt" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/tnt_minecart.json b/astraflow/core/workflow/impl/textcraft/recipes/tnt_minecart.json new file mode 100644 index 0000000..777df94 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/tnt_minecart.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "A", + "B" + ], + "key": { + "A": { + "item": "minecraft:tnt" + }, + "B": { + "item": "minecraft:minecart" + } + }, + "result": { + "item": "minecraft:tnt_minecart" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/torch.json b/astraflow/core/workflow/impl/textcraft/recipes/torch.json new file mode 100644 index 0000000..b7c74de --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/torch.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X", + "#" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": [ + { + "item": "minecraft:coal" + }, + { + "item": "minecraft:charcoal" + } + ] + }, + "result": { + "item": "minecraft:torch", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/trapped_chest.json b/astraflow/core/workflow/impl/textcraft/recipes/trapped_chest.json new file mode 100644 index 0000000..342a79e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/trapped_chest.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:chest" + }, + { + "item": "minecraft:tripwire_hook" + } + ], + "result": { + "item": "minecraft:trapped_chest" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/tripwire_hook.json b/astraflow/core/workflow/impl/textcraft/recipes/tripwire_hook.json new file mode 100644 index 0000000..5cc506f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/tripwire_hook.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "I", + "S", + "#" + ], + "key": { + "#": { + "tag": "minecraft:planks" + }, + "S": { + "item": "minecraft:stick" + }, + "I": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "minecraft:tripwire_hook", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/turtle_helmet.json b/astraflow/core/workflow/impl/textcraft/recipes/turtle_helmet.json new file mode 100644 index 0000000..9efb5d6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/turtle_helmet.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XXX", + "X X" + ], + "key": { + "X": { + "item": "minecraft:scute" + } + }, + "result": { + "item": "minecraft:turtle_helmet" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/warped_button.json b/astraflow/core/workflow/impl/textcraft/recipes/warped_button.json new file mode 100644 index 0000000..b7c3515 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/warped_button.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wooden_button", + "ingredients": [ + { + "item": "minecraft:warped_planks" + } + ], + "result": { + "item": "minecraft:warped_button" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/warped_door.json b/astraflow/core/workflow/impl/textcraft/recipes/warped_door.json new file mode 100644 index 0000000..7bccc97 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/warped_door.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_door", + "pattern": [ + "##", + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:warped_planks" + } + }, + "result": { + "item": "minecraft:warped_door", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/warped_fence.json b/astraflow/core/workflow/impl/textcraft/recipes/warped_fence.json new file mode 100644 index 0000000..8b73e8a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/warped_fence.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_fence", + "pattern": [ + "W#W", + "W#W" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "W": { + "item": "minecraft:warped_planks" + } + }, + "result": { + "item": "minecraft:warped_fence", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/warped_fence_gate.json b/astraflow/core/workflow/impl/textcraft/recipes/warped_fence_gate.json new file mode 100644 index 0000000..93f9cc0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/warped_fence_gate.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_fence_gate", + "pattern": [ + "#W#", + "#W#" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "W": { + "item": "minecraft:warped_planks" + } + }, + "result": { + "item": "minecraft:warped_fence_gate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/warped_fungus_on_a_stick.json b/astraflow/core/workflow/impl/textcraft/recipes/warped_fungus_on_a_stick.json new file mode 100644 index 0000000..fdb1ab4 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/warped_fungus_on_a_stick.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + " X" + ], + "key": { + "#": { + "item": "minecraft:fishing_rod" + }, + "X": { + "item": "minecraft:warped_fungus" + } + }, + "result": { + "item": "minecraft:warped_fungus_on_a_stick" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/warped_hyphae.json b/astraflow/core/workflow/impl/textcraft/recipes/warped_hyphae.json new file mode 100644 index 0000000..880f1c6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/warped_hyphae.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bark", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:warped_stem" + } + }, + "result": { + "item": "minecraft:warped_hyphae", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/warped_planks.json b/astraflow/core/workflow/impl/textcraft/recipes/warped_planks.json new file mode 100644 index 0000000..6acc401 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/warped_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "planks", + "ingredients": [ + { + "tag": "minecraft:warped_stems" + } + ], + "result": { + "item": "minecraft:warped_planks", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/warped_pressure_plate.json b/astraflow/core/workflow/impl/textcraft/recipes/warped_pressure_plate.json new file mode 100644 index 0000000..a6294ac --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/warped_pressure_plate.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_pressure_plate", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:warped_planks" + } + }, + "result": { + "item": "minecraft:warped_pressure_plate" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/warped_sign.json b/astraflow/core/workflow/impl/textcraft/recipes/warped_sign.json new file mode 100644 index 0000000..747d351 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/warped_sign.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "sign", + "pattern": [ + "###", + "###", + " X " + ], + "key": { + "#": { + "item": "minecraft:warped_planks" + }, + "X": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:warped_sign", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/warped_slab.json b/astraflow/core/workflow/impl/textcraft/recipes/warped_slab.json new file mode 100644 index 0000000..39497bb --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/warped_slab.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_slab", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "minecraft:warped_planks" + } + }, + "result": { + "item": "minecraft:warped_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/warped_stairs.json b/astraflow/core/workflow/impl/textcraft/recipes/warped_stairs.json new file mode 100644 index 0000000..e5dcfb7 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/warped_stairs.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_stairs", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "minecraft:warped_planks" + } + }, + "result": { + "item": "minecraft:warped_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/warped_trapdoor.json b/astraflow/core/workflow/impl/textcraft/recipes/warped_trapdoor.json new file mode 100644 index 0000000..472d486 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/warped_trapdoor.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "wooden_trapdoor", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:warped_planks" + } + }, + "result": { + "item": "minecraft:warped_trapdoor", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/wheat.json b/astraflow/core/workflow/impl/textcraft/recipes/wheat.json new file mode 100644 index 0000000..5701cad --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/wheat.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:hay_block" + } + ], + "result": { + "item": "minecraft:wheat", + "count": 9 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/white_banner.json b/astraflow/core/workflow/impl/textcraft/recipes/white_banner.json new file mode 100644 index 0000000..5485871 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/white_banner.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "banner", + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": { + "item": "minecraft:white_wool" + }, + "|": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:white_banner" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/white_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/white_bed.json new file mode 100644 index 0000000..44da677 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/white_bed.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed", + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": { + "item": "minecraft:white_wool" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:white_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/white_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/white_carpet.json new file mode 100644 index 0000000..059e09e --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/white_carpet.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:white_wool" + } + }, + "result": { + "item": "minecraft:white_carpet", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/white_concrete_powder.json b/astraflow/core/workflow/impl/textcraft/recipes/white_concrete_powder.json new file mode 100644 index 0000000..da54cf5 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/white_concrete_powder.json @@ -0,0 +1,37 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "concrete_powder", + "ingredients": [ + { + "item": "minecraft:white_dye" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + } + ], + "result": { + "item": "minecraft:white_concrete_powder", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/white_dye.json b/astraflow/core/workflow/impl/textcraft/recipes/white_dye.json new file mode 100644 index 0000000..54ef2a3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/white_dye.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "white_dye", + "ingredients": [ + { + "item": "minecraft:bone_meal" + } + ], + "result": { + "item": "minecraft:white_dye" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/white_dye_from_lily_of_the_valley.json b/astraflow/core/workflow/impl/textcraft/recipes/white_dye_from_lily_of_the_valley.json new file mode 100644 index 0000000..ee55ebb --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/white_dye_from_lily_of_the_valley.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "white_dye", + "ingredients": [ + { + "item": "minecraft:lily_of_the_valley" + } + ], + "result": { + "item": "minecraft:white_dye" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/white_glazed_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/white_glazed_terracotta.json new file mode 100644 index 0000000..c840038 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/white_glazed_terracotta.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:white_terracotta" + }, + "result": "minecraft:white_glazed_terracotta", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/white_stained_glass.json b/astraflow/core/workflow/impl/textcraft/recipes/white_stained_glass.json new file mode 100644 index 0000000..132571a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/white_stained_glass.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass" + }, + "X": { + "item": "minecraft:white_dye" + } + }, + "result": { + "item": "minecraft:white_stained_glass", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/white_stained_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/white_stained_glass_pane.json new file mode 100644 index 0000000..64ccc28 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/white_stained_glass_pane.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:white_stained_glass" + } + }, + "result": { + "item": "minecraft:white_stained_glass_pane", + "count": 16 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/white_stained_glass_pane_from_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/white_stained_glass_pane_from_glass_pane.json new file mode 100644 index 0000000..96fe7b6 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/white_stained_glass_pane_from_glass_pane.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass_pane" + }, + "$": { + "item": "minecraft:white_dye" + } + }, + "result": { + "item": "minecraft:white_stained_glass_pane", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/white_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/white_terracotta.json new file mode 100644 index 0000000..d6e28b0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/white_terracotta.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_terracotta", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:terracotta" + }, + "X": { + "item": "minecraft:white_dye" + } + }, + "result": { + "item": "minecraft:white_terracotta", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/white_wool_from_string.json b/astraflow/core/workflow/impl/textcraft/recipes/white_wool_from_string.json new file mode 100644 index 0000000..8736bcd --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/white_wool_from_string.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "minecraft:string" + } + }, + "result": { + "item": "minecraft:white_wool" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/wooden_axe.json b/astraflow/core/workflow/impl/textcraft/recipes/wooden_axe.json new file mode 100644 index 0000000..ee3a585 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/wooden_axe.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XX", + "X#", + " #" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:wooden_axe" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/wooden_hoe.json b/astraflow/core/workflow/impl/textcraft/recipes/wooden_hoe.json new file mode 100644 index 0000000..e4596c2 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/wooden_hoe.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XX", + " #", + " #" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:wooden_hoe" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/wooden_pickaxe.json b/astraflow/core/workflow/impl/textcraft/recipes/wooden_pickaxe.json new file mode 100644 index 0000000..28aee5a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/wooden_pickaxe.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XXX", + " # ", + " # " + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:wooden_pickaxe" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/wooden_shovel.json b/astraflow/core/workflow/impl/textcraft/recipes/wooden_shovel.json new file mode 100644 index 0000000..69f9594 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/wooden_shovel.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X", + "#", + "#" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:wooden_shovel" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/wooden_sword.json b/astraflow/core/workflow/impl/textcraft/recipes/wooden_sword.json new file mode 100644 index 0000000..e81f2cb --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/wooden_sword.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "X", + "X", + "#" + ], + "key": { + "#": { + "item": "minecraft:stick" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:wooden_sword" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/writable_book.json b/astraflow/core/workflow/impl/textcraft/recipes/writable_book.json new file mode 100644 index 0000000..babaf73 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/writable_book.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:book" + }, + { + "item": "minecraft:ink_sac" + }, + { + "item": "minecraft:feather" + } + ], + "result": { + "item": "minecraft:writable_book" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/yellow_banner.json b/astraflow/core/workflow/impl/textcraft/recipes/yellow_banner.json new file mode 100644 index 0000000..f8e805a --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/yellow_banner.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "banner", + "pattern": [ + "###", + "###", + " | " + ], + "key": { + "#": { + "item": "minecraft:yellow_wool" + }, + "|": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "minecraft:yellow_banner" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/yellow_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/yellow_bed.json new file mode 100644 index 0000000..4f3b498 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/yellow_bed.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "bed", + "pattern": [ + "###", + "XXX" + ], + "key": { + "#": { + "item": "minecraft:yellow_wool" + }, + "X": { + "tag": "minecraft:planks" + } + }, + "result": { + "item": "minecraft:yellow_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/yellow_bed_from_white_bed.json b/astraflow/core/workflow/impl/textcraft/recipes/yellow_bed_from_white_bed.json new file mode 100644 index 0000000..ca14e46 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/yellow_bed_from_white_bed.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "dyed_bed", + "ingredients": [ + { + "item": "minecraft:white_bed" + }, + { + "item": "minecraft:yellow_dye" + } + ], + "result": { + "item": "minecraft:yellow_bed" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/yellow_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/yellow_carpet.json new file mode 100644 index 0000000..7fdaa7d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/yellow_carpet.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "##" + ], + "key": { + "#": { + "item": "minecraft:yellow_wool" + } + }, + "result": { + "item": "minecraft:yellow_carpet", + "count": 3 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/yellow_carpet_from_white_carpet.json b/astraflow/core/workflow/impl/textcraft/recipes/yellow_carpet_from_white_carpet.json new file mode 100644 index 0000000..3bc19da --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/yellow_carpet_from_white_carpet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "carpet", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:white_carpet" + }, + "$": { + "item": "minecraft:yellow_dye" + } + }, + "result": { + "item": "minecraft:yellow_carpet", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/yellow_concrete_powder.json b/astraflow/core/workflow/impl/textcraft/recipes/yellow_concrete_powder.json new file mode 100644 index 0000000..6e51ad1 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/yellow_concrete_powder.json @@ -0,0 +1,37 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "concrete_powder", + "ingredients": [ + { + "item": "minecraft:yellow_dye" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:sand" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + }, + { + "item": "minecraft:gravel" + } + ], + "result": { + "item": "minecraft:yellow_concrete_powder", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/yellow_dye_from_dandelion.json b/astraflow/core/workflow/impl/textcraft/recipes/yellow_dye_from_dandelion.json new file mode 100644 index 0000000..b7d09c3 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/yellow_dye_from_dandelion.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "yellow_dye", + "ingredients": [ + { + "item": "minecraft:dandelion" + } + ], + "result": { + "item": "minecraft:yellow_dye" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/yellow_dye_from_sunflower.json b/astraflow/core/workflow/impl/textcraft/recipes/yellow_dye_from_sunflower.json new file mode 100644 index 0000000..df82367 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/yellow_dye_from_sunflower.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "yellow_dye", + "ingredients": [ + { + "item": "minecraft:sunflower" + } + ], + "result": { + "item": "minecraft:yellow_dye", + "count": 2 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/yellow_glazed_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/yellow_glazed_terracotta.json new file mode 100644 index 0000000..d65c6c4 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/yellow_glazed_terracotta.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "minecraft:yellow_terracotta" + }, + "result": "minecraft:yellow_glazed_terracotta", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/yellow_stained_glass.json b/astraflow/core/workflow/impl/textcraft/recipes/yellow_stained_glass.json new file mode 100644 index 0000000..3ce80d9 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/yellow_stained_glass.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass" + }, + "X": { + "item": "minecraft:yellow_dye" + } + }, + "result": { + "item": "minecraft:yellow_stained_glass", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/yellow_stained_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/yellow_stained_glass_pane.json new file mode 100644 index 0000000..13cc1f1 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/yellow_stained_glass_pane.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "minecraft:yellow_stained_glass" + } + }, + "result": { + "item": "minecraft:yellow_stained_glass_pane", + "count": 16 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/yellow_stained_glass_pane_from_glass_pane.json b/astraflow/core/workflow/impl/textcraft/recipes/yellow_stained_glass_pane_from_glass_pane.json new file mode 100644 index 0000000..b6d03ce --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/yellow_stained_glass_pane_from_glass_pane.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_glass_pane", + "pattern": [ + "###", + "#$#", + "###" + ], + "key": { + "#": { + "item": "minecraft:glass_pane" + }, + "$": { + "item": "minecraft:yellow_dye" + } + }, + "result": { + "item": "minecraft:yellow_stained_glass_pane", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/yellow_terracotta.json b/astraflow/core/workflow/impl/textcraft/recipes/yellow_terracotta.json new file mode 100644 index 0000000..538fd4f --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/yellow_terracotta.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "stained_terracotta", + "pattern": [ + "###", + "#X#", + "###" + ], + "key": { + "#": { + "item": "minecraft:terracotta" + }, + "X": { + "item": "minecraft:yellow_dye" + } + }, + "result": { + "item": "minecraft:yellow_terracotta", + "count": 8 + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/recipes/yellow_wool.json b/astraflow/core/workflow/impl/textcraft/recipes/yellow_wool.json new file mode 100644 index 0000000..bf0d73d --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/recipes/yellow_wool.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "wool", + "ingredients": [ + { + "item": "minecraft:yellow_dye" + }, + { + "item": "minecraft:white_wool" + } + ], + "result": { + "item": "minecraft:yellow_wool" + } +} \ No newline at end of file diff --git a/astraflow/core/workflow/impl/textcraft/task.py b/astraflow/core/workflow/impl/textcraft/task.py new file mode 100644 index 0000000..f3d70a0 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/task.py @@ -0,0 +1,53 @@ +"""Minimal Task dataclass for TextCraft. + +Adapted from ``platoon.envs.base.Task`` but stripped to the fields used by +our recursive workflow. We do not need ``fork_strategy`` or ``SubTask`` +because env.fork() takes a fresh Task directly. +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Any + + +@dataclass +class Task: + """A TextCraft crafting task. + + Attributes + ---------- + goal: + Natural-language goal string, e.g. ``"Craft the following items: 4x wooden_pickaxe"``. + id: + Stable identifier (e.g. ``"textcraft.train.42"``) — used as prompt_id. + max_steps: + Step budget for this task (root + all descendants share this pool). + misc: + Extra fields. We always populate: + - ``target_items: dict[str, int]`` — what the agent must craft + - ``initial_inventory: dict[str, int]`` — starting inventory + - ``gold_trajectory: list[dict]`` — reference solve trace (eval only) + """ + + goal: str | None = None + id: str | None = None + max_steps: int | None = None + misc: dict[str, Any] = field(default_factory=dict) + + @classmethod + def from_dict(cls, d: dict[str, Any]) -> "Task": + return cls( + goal=d.get("goal"), + id=d.get("id"), + max_steps=d.get("max_steps"), + misc=d.get("misc", {}), + ) + + def to_dict(self) -> dict[str, Any]: + return { + "goal": self.goal, + "id": self.id, + "max_steps": self.max_steps, + "misc": self.misc, + } diff --git a/astraflow/core/workflow/impl/textcraft/tasks.py b/astraflow/core/workflow/impl/textcraft/tasks.py new file mode 100644 index 0000000..50cf4f2 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/tasks.py @@ -0,0 +1,707 @@ +"""Task generation for TextCraft crafting tasks.""" + +import argparse +import json +import pathlib +import random +from dataclasses import asdict +from typing import Any, Dict, List, Literal, Optional, Set, Tuple + +from astraflow.core.workflow.impl.textcraft.task import Task + +from .recipe_loader import RecipeDatabase + + +def get_tag_satisfying_items(recipe_db: RecipeDatabase, tag: str) -> List[str]: + """ + Get items that satisfy a tag requirement. + Uses the recipe database to find items that satisfy the tag. + """ + # Remove "tag:" prefix if present + tag_name = tag.replace("tag:", "") + + # Get items from the recipe database's tag mapping + items = recipe_db.get_items_for_tag(tag_name) + + if items: + return items + + # Fallback: if no items found, try pattern matching + tag_lower = tag_name.lower() + + # Pattern matching for common cases + if "planks" in tag_lower: + # Find all planks items + planks_items = [item for item in recipe_db.all_items if item.endswith("_planks")] + if planks_items: + return planks_items + + if ("log" in tag_lower or "stem" in tag_lower) and "planks" not in tag_lower: + # Find all log/stem items + log_items = [ + item + for item in recipe_db.all_items + if "_log" in item or "_stem" in item or item.endswith("_log") or item.endswith("_stem") + ] + if log_items: + return log_items + + if "wood" in tag_lower and "planks" not in tag_lower: + # Find all wood items + wood_items = [item for item in recipe_db.all_items if "_wood" in item or item.endswith("_wood")] + if wood_items: + return wood_items + + # Return empty list if nothing found + return [] + + +def extract_base_materials_needed( + recipe_db: RecipeDatabase, + target_items: Dict[str, int], + initial_inventory: Dict[str, int], +) -> Dict[str, int]: + """ + Extract all base materials (non-craftable items) needed to craft target items. + Returns a dictionary mapping base item names to required counts. + """ + needed_base_items: Dict[str, int] = {} + inventory = initial_inventory.copy() + + def collect_base_materials(item: str, count: int, visited: Optional[Set[str]] = None): + """Recursively collect base materials needed.""" + if visited is None: + visited = set() + + if item in visited: + return + visited.add(item) + + # If we already have enough in inventory, no need to collect + if inventory.get(item, 0) >= count: + return + + # If it's a base item, add to needed + if recipe_db.is_base_item(item): + needed = count - inventory.get(item, 0) + if needed > 0: + needed_base_items[item] = needed_base_items.get(item, 0) + needed + return + + # If it's craftable, collect ingredients + if recipe_db.can_craft(item): + recipes = recipe_db.get_recipes_for_item(item) + if recipes: + recipe = recipes[0] + needed_crafts = (count - inventory.get(item, 0) + recipe.result_count - 1) // recipe.result_count + + for ing_item, ing_count in recipe.ingredients.items(): + if ing_item.startswith("tag:"): + # For tags, find items that satisfy the tag and collect their base materials + tag_name = ing_item.replace("tag:", "") + satisfying_items = get_tag_satisfying_items(recipe_db, tag_name) + if satisfying_items: + # Use the first satisfying item as representative + # Collect base materials for that item + collect_base_materials(satisfying_items[0], needed_crafts * ing_count, visited.copy()) + # If no satisfying items found, skip (will need manual handling) + continue + collect_base_materials(ing_item, needed_crafts * ing_count, visited.copy()) + + for item, count in target_items.items(): + collect_base_materials(item, count) + + return needed_base_items + + +def solve_crafting_task( + recipe_db: RecipeDatabase, + target_items: Dict[str, int], + initial_inventory: Dict[str, int], + max_depth: int = 20, +) -> Optional[Tuple[List[Dict[str, Any]], Dict[str, int]]]: + """ + Solve a crafting task by finding a valid sequence of crafting steps. + + Returns: + Tuple of (trajectory, required_base_materials) or None if no solution found. + - trajectory: List of crafting steps + - required_base_materials: Dict of base items needed + Each step is: {"action": "craft", "target": ("item", count), "ingredients": {...}} + """ + # Simulate inventory + inventory = initial_inventory.copy() + trajectory = [] + visited_steps: Set[Tuple[str, int]] = set() # Track (item, count) we've tried to craft + + def can_craft_item(item: str, count: int) -> bool: + """Check if we can craft an item with current inventory.""" + if inventory.get(item, 0) >= count: + return True + + recipes = recipe_db.get_recipes_for_item(item) + if not recipes: + return False + + # Try first recipe + recipe = recipes[0] + + # Check if we have all ingredients + for ing_item, ing_count in recipe.ingredients.items(): + if ing_item.startswith("tag:"): + # For tags, we'd need to check if any matching item exists + # For now, skip tag validation (could be improved) + continue + + # Calculate how many times we need to craft + needed = count + available = inventory.get(ing_item, 0) + + # If we need more than available, check if we can craft the ingredient + if available < needed * ing_count: + # Try to craft the ingredient recursively + ingredient_needed = (needed * ing_count) - available + # Calculate how many of the ingredient we need to craft + crafts_needed = (ingredient_needed + recipe.result_count - 1) // recipe.result_count + if not can_craft_item(ing_item, crafts_needed): + return False + + return True + + def craft_item(item: str, count: int) -> bool: + """Attempt to craft an item, recursively crafting ingredients if needed.""" + # Check if we already have enough + if inventory.get(item, 0) >= count: + return True + + # Check if we're currently crafting this (prevent infinite recursion) + step_key = (item, count) + if step_key in visited_steps: + return False + visited_steps.add(step_key) + + recipes = recipe_db.get_recipes_for_item(item) + if not recipes: + return False + + recipe = recipes[0] + + # Calculate how many times we need to craft + needed = count - inventory.get(item, 0) + crafts_needed = (needed + recipe.result_count - 1) // recipe.result_count + + # Calculate total crafts needed upfront + total_crafts_needed = crafts_needed + + # Calculate total ingredient needs including tag requirements + # We need to look ahead to see what tags will consume + ingredient_needs: Dict[str, int] = {} + for ing_item, ing_count_per_craft in recipe.ingredients.items(): + total_needed_for_this_ing = total_crafts_needed * ing_count_per_craft + + if ing_item.startswith("tag:"): + # For tags, find what items satisfy it and account for their consumption + tag_name = ing_item.replace("tag:", "") + satisfying_items = recipe_db.get_items_for_tag(tag_name) + + # We'll need to consume `total_needed_for_this_ing` of SOME satisfying item + # Add this to our needs (we'll resolve which specific item later) + # For now, mark that we need this tag satisfied + ingredient_needs[f"tag:{tag_name}"] = total_needed_for_this_ing + else: + # Concrete item + ingredient_needs[ing_item] = ingredient_needs.get(ing_item, 0) + total_needed_for_this_ing + + # First, ensure we have all concrete ingredients + # Track what we have as we craft to detect if recursive crafts consume things + inventory_snapshot = {} + + for ing_item, total_needed in ingredient_needs.items(): + if ing_item.startswith("tag:"): + # Handle tags separately after concrete items + continue + + available = inventory.get(ing_item, 0) + + if available < total_needed: + if recipe_db.can_craft(ing_item): + # Take snapshot of inventory BEFORE this craft + before_craft = inventory.copy() + + # Craft enough to have at least `total_needed` items total + if not craft_item(ing_item, total_needed): + return False + + # Update our snapshot for this ingredient + inventory_snapshot[ing_item] = inventory.get(ing_item, 0) + + # After crafting this ingredient, check if inventory of OTHER concrete ingredients decreased + # (meaning the recursive craft consumed them via tags) + for other_ing, other_needed in ingredient_needs.items(): + if other_ing.startswith("tag:") or other_ing == ing_item: + continue + + # Check if this ingredient was consumed relative to our snapshot + # Use the most recent snapshot value, or the value before this craft + before = inventory_snapshot.get(other_ing, before_craft.get(other_ing, 0)) + now = inventory.get(other_ing, 0) + if now < before: + # Some was consumed - need to craft more to restore it + if recipe_db.can_craft(other_ing): + if not craft_item(other_ing, other_needed): + return False + # Update the snapshot + inventory_snapshot[other_ing] = inventory.get(other_ing, 0) + else: + # Base item, can't craft it + return False + else: + # Already have enough, record in snapshot + inventory_snapshot[ing_item] = inventory.get(ing_item, 0) + + # Now handle tag requirements - craft fresh items specifically for tags + # to avoid conflicts with concrete ingredient needs + for ing_item, total_needed in ingredient_needs.items(): + if not ing_item.startswith("tag:"): + continue + + tag_name = ing_item.replace("tag:", "") + satisfying_items = recipe_db.get_items_for_tag(tag_name) + + # Check if we have enough of ANY satisfying item that's NOT also needed as a concrete ingredient + # Prefer using items that aren't explicitly required by this recipe + concrete_needs = set(k for k in ingredient_needs.keys() if not k.startswith("tag:")) + + # Available items that don't conflict with concrete needs + non_conflicting_available = { + item: inventory.get(item, 0) + for item in satisfying_items + if item not in concrete_needs and inventory.get(item, 0) > 0 + } + total_non_conflicting = sum(non_conflicting_available.values()) + + if total_non_conflicting >= total_needed: + # We have enough non-conflicting items, we're good + continue + + # Need to craft more satisfying items + # Choose one to craft (prefer craftable items that aren't in concrete_needs) + craftable_satisfying = [ + item for item in satisfying_items if recipe_db.can_craft(item) and item not in concrete_needs + ] + + if not craftable_satisfying: + # Fall back to any craftable satisfying item + craftable_satisfying = [item for item in satisfying_items if recipe_db.can_craft(item)] + + if craftable_satisfying: + # Try each craftable item until one succeeds + # (some may fail due to missing base materials) + crafted_successfully = False + for chosen in craftable_satisfying: + needed_more = total_needed - total_non_conflicting + if craft_item(chosen, needed_more): + crafted_successfully = True + break + + if not crafted_successfully: + # None of the craftable items worked - check if we have any satisfying items in inventory + total_available = sum(inventory.get(item, 0) for item in satisfying_items) + if total_available < total_needed: + return False + else: + # Check if we have ANY satisfying items (even if conflicting) + total_available = sum(inventory.get(item, 0) for item in satisfying_items) + if total_available < total_needed: + # No craftable satisfying items and not enough in inventory - unsolvable + return False + + # Now craft the item the required number of times + # Consume ingredients and track what we actually consume + step_ingredients = {} + for ing_item, ing_count_per_craft in recipe.ingredients.items(): + total_needed = total_crafts_needed * ing_count_per_craft + + if ing_item.startswith("tag:"): + # Resolve tag to a concrete item + tag_name = ing_item.replace("tag:", "") + satisfying_items = recipe_db.get_items_for_tag(tag_name) + + # Choose which item to consume: prefer items we have enough of and aren't craftable + # (to avoid consuming intermediate crafted items when possible) + available_items = [ + (sat_item, inventory.get(sat_item, 0)) + for sat_item in satisfying_items + if inventory.get(sat_item, 0) >= total_needed + ] + + if available_items: + # Sort by: not craftable first, then by quantity (more is better) + available_items.sort(key=lambda x: (recipe_db.can_craft(x[0]), -x[1])) + chosen_item = available_items[0][0] + + # Consume the chosen item + inventory[chosen_item] -= total_needed + if inventory[chosen_item] <= 0: + del inventory[chosen_item] + + # Record the concrete item in trajectory + step_ingredients[chosen_item] = total_needed + else: + # This shouldn't happen if we ensured ingredients are available + # But keep the tag as fallback + step_ingredients[f"tag:{tag_name}"] = total_needed + else: + # Concrete item - consume it + total_consumed = total_needed + inventory[ing_item] = inventory.get(ing_item, 0) - total_consumed + if inventory[ing_item] <= 0: + del inventory[ing_item] + step_ingredients[ing_item] = total_consumed + + # Add crafted items + crafted_count = total_crafts_needed * recipe.result_count + inventory[item] = inventory.get(item, 0) + crafted_count + + trajectory.append( + { + "action": "craft", + "target": (item, total_crafts_needed), + "ingredients": step_ingredients, + "result_count": crafted_count, + } + ) + + # Remove from visited_steps to allow re-crafting if this item gets consumed by tags + visited_steps.discard(step_key) + + return True + + # Calculate total needs accounting for dependencies between targets + # If target A is an ingredient for target B, we need extra of A + total_needs = target_items.copy() + for target_item, target_count in target_items.items(): + recipes = recipe_db.get_recipes_for_item(target_item) + if recipes: + recipe = recipes[0] + crafts_needed = (target_count + recipe.result_count - 1) // recipe.result_count + + for ing_item, ing_count_per_craft in recipe.ingredients.items(): + if ing_item.startswith("tag:"): + continue + + # If this ingredient is also a target, we need more of it + if ing_item in total_needs: + total_needs[ing_item] = total_needs.get(ing_item, 0) + (crafts_needed * ing_count_per_craft) + + # Try to craft each item according to total needs + for item, count in total_needs.items(): + if not craft_item(item, count): + return None # Failed to find solution + + # Extract required base materials + required_base_materials = extract_base_materials_needed(recipe_db, target_items, initial_inventory) + + return trajectory, required_base_materials + + +def create_textcraft_datasets( + seed: int = 42, + num_samples_train: int = 10000, + num_samples_val: int = 1000, + recipes_dir: Optional[pathlib.Path] = None, + min_depth: int = 2, + max_depth: int = 5, + min_target_items: int = 1, + max_target_items: int = 3, +) -> Tuple[List[Task], List[Task]]: + """ + Create train and validation datasets for TextCraft tasks. + + Args: + seed: Random seed + num_samples_train: Number of training samples + num_samples_val: Number of validation samples + recipes_dir: Path to recipes directory + min_depth: Minimum crafting depth for hierarchical tasks + max_depth: Maximum crafting depth + min_target_items: Minimum number of target items per task + max_target_items: Maximum number of target items per task + + Returns: + Tuple of (train_tasks, val_tasks) + """ + random.seed(seed) + + if recipes_dir is None: + recipes_dir = pathlib.Path(__file__).parent / "recipes" + + recipe_db = RecipeDatabase(recipes_dir) + + # Find hierarchical recipes + hierarchical_items = recipe_db.find_hierarchical_recipes(min_depth=min_depth, max_depth=max_depth) + + if not hierarchical_items: + raise ValueError(f"No hierarchical recipes found with depth {min_depth}-{max_depth}") + + train_tasks: List[Task] = [] + val_tasks: List[Task] = [] + + # Track seen tasks to prevent duplicates + # Use a tuple of (sorted target_items, sorted initial_inventory) as the key + seen_tasks: Set[Tuple[Tuple[Tuple[str, int], ...], Tuple[Tuple[str, int], ...]]] = set() + + # Generate tasks + total_needed = num_samples_train + num_samples_val + train_count = 0 + val_count = 0 + + attempts = 0 + max_attempts = total_needed * 100 # Increased attempts to account for deduplication + + while (train_count < num_samples_train or val_count < num_samples_val) and attempts < max_attempts: + attempts += 1 + + # Select target item(s) + num_targets = random.randint(min_target_items, max_target_items) + target_items_list = random.sample(hierarchical_items, min(num_targets, len(hierarchical_items))) + + # Create target dictionary with random counts (1-3) + target_items: Dict[str, int] = {} + for item in target_items_list: + target_items[item] = random.randint(1, 3) + + # First, extract what base materials are needed (without solving) + required_base_materials = extract_base_materials_needed(recipe_db, target_items, {}) + if not required_base_materials: + continue # No base materials found, skip this task + + # Now generate initial inventory that includes all required base materials + # plus some extra random base items + base_items = list(recipe_db.base_items) + if not base_items: + continue + + initial_inventory: Dict[str, int] = {} + + # Add required base materials (with some buffer) + for item, count in required_base_materials.items(): + # Add required amount plus some buffer (10-50% extra) + buffer = random.randint(0, max(1, count // 2)) + initial_inventory[item] = count + buffer + + # Solve with initial inventory to get trajectory and identify tag requirements + solve_result = solve_crafting_task(recipe_db, target_items, initial_inventory) + if solve_result is None: + continue # Task not solvable with these base materials + + gold_trajectory, _ = solve_result + + # Check gold trajectory for tag-based ingredients and ensure they're satisfied + tag_requirements: Dict[str, int] = {} + for step in gold_trajectory: + for ing_item, ing_count in step.get("ingredients", {}).items(): + if ing_item.startswith("tag:"): + tag_name = ing_item.replace("tag:", "") + tag_requirements[tag_name] = max(tag_requirements.get(tag_name, 0), ing_count) + + # Add items that satisfy tag requirements + for tag_name, ing_count in tag_requirements.items(): + satisfying_items = get_tag_satisfying_items(recipe_db, tag_name) + if satisfying_items: + # Pick a random satisfying item (or use first) + representative = random.choice(satisfying_items) + # Check if we already have a satisfying item in inventory + has_satisfying = any(item in initial_inventory for item in satisfying_items) + if not has_satisfying: + # Add enough to satisfy the tag requirement + initial_inventory[representative] = ing_count + random.randint(0, max(1, ing_count // 2)) + else: + # Ensure we have enough of the satisfying item + for item in satisfying_items: + if item in initial_inventory: + if initial_inventory[item] < ing_count: + initial_inventory[item] = ing_count + random.randint(0, max(1, ing_count // 2)) + break + + # Add some additional random base items + num_extra_items = random.randint(2, 5) + for _ in range(num_extra_items): + item = random.choice(base_items) + if item not in initial_inventory: # Don't duplicate required items + initial_inventory[item] = random.randint(1, 5) + + # Create a unique key for this task (sorted tuples for deterministic hashing) + target_key = tuple(sorted(target_items.items())) + inventory_key = tuple(sorted(initial_inventory.items())) + task_key = (target_key, inventory_key) + + # Skip if we've seen this exact task before + if task_key in seen_tasks: + continue + + # Mark as seen + seen_tasks.add(task_key) + + # Re-solve to get the final trajectory with complete inventory (including tag items) + final_solve_result = solve_crafting_task(recipe_db, target_items, initial_inventory) + if final_solve_result is None: + continue # Task not solvable with final inventory (shouldn't happen) + + # Use the trajectory from solving with the complete initial inventory + actual_trajectory, _ = final_solve_result + + # Create task + target_str = ", ".join([f"{count}x {item}" for item, count in target_items.items()]) + goal = f"Craft the following items: {target_str}" + + task = Task( + goal=goal, + max_steps=50, # Allow enough steps for hierarchical crafting + misc={ + "target_items": target_items, + "initial_inventory": initial_inventory, + "gold_trajectory": actual_trajectory, # Use trajectory from actual inventory + }, + id=f"textcraft.train.{train_count}" if train_count < num_samples_train else f"textcraft.val.{val_count}", + ) + + # Split deterministically based on task content (using target_items only for consistency) + task_hash = hash(str(target_key)) + is_val = (task_hash % 10) < (num_samples_val * 10 / total_needed) + + if is_val and val_count < num_samples_val: + val_tasks.append(task) + val_count += 1 + elif train_count < num_samples_train: + train_tasks.append(task) + train_count += 1 + + if train_count < num_samples_train or val_count < num_samples_val: + raise RuntimeError( + f"Failed to generate enough unique tasks. Generated {train_count}/{num_samples_train} train and " + f"{val_count}/{num_samples_val} val tasks after {attempts} attempts. " + f"Consider reducing the number of samples or increasing max_attempts." + ) + + return train_tasks, val_tasks + + +TRAIN_DATA: Optional[List[str]] = None +VAL_DATA: Optional[List[str]] = None +TASKS: Dict[str, Task] = {} + + +def get_task_ids( + split: Literal["train", "val"], + num_samples_train: int = 10000, + num_samples_val: int = 1000, +) -> List[str]: + """Get task IDs for a split.""" + if split == "train": + return [f"textcraft.train.{i}" for i in range(num_samples_train)] + elif split == "val": + return [f"textcraft.val.{i}" for i in range(num_samples_val)] + else: + raise ValueError(f"Invalid split: {split}") + + +def load_task_from_disk(id: str) -> Task: + """Load a task from disk.""" + parent = pathlib.Path(__file__).parent + + if id.startswith("textcraft.train."): + global TRAIN_DATA + if TRAIN_DATA is None: + file = parent / "textcraft_train.jsonl" + if file.exists(): + TRAIN_DATA = file.read_text().splitlines() + else: + raise FileNotFoundError(f"Training data file not found: {file}") + idx = int(id.split(".")[2]) + if idx >= len(TRAIN_DATA): + raise IndexError(f"Task index {idx} out of range for training data") + return Task.from_dict(json.loads(TRAIN_DATA[idx])) + + elif id.startswith("textcraft.val."): + global VAL_DATA + if VAL_DATA is None: + file = parent / "textcraft_val.jsonl" + if file.exists(): + VAL_DATA = file.read_text().splitlines() + else: + raise FileNotFoundError(f"Validation data file not found: {file}") + idx = int(id.split(".")[2]) + if idx >= len(VAL_DATA): + raise IndexError(f"Task index {idx} out of range for validation data") + return Task.from_dict(json.loads(VAL_DATA[idx])) + + else: + raise ValueError(f"Invalid task id: {id}") + + +def get_task(id: str) -> Task: + """Get a task by ID (with caching).""" + global TASKS + if id in TASKS: + return TASKS[id] + task = load_task_from_disk(id) + TASKS[id] = task + return task + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--num_samples", + type=int, + default=10000, + help="Number of training samples to generate", + ) + parser.add_argument( + "--eval_size", + type=int, + default=1000, + help="Number of validation/test samples to generate", + ) + parser.add_argument( + "--min_depth", + type=int, + default=2, + help="Minimum crafting depth for hierarchical tasks", + ) + parser.add_argument( + "--max_depth", + type=int, + default=5, + help="Maximum crafting depth", + ) + args = parser.parse_args() + + train_data, val_data = create_textcraft_datasets( + num_samples_train=args.num_samples, + num_samples_val=args.eval_size, + min_depth=args.min_depth, + max_depth=args.max_depth, + ) + + print(f"Generated {len(train_data)} training tasks and {len(val_data)} validation tasks") + + parent_dir = pathlib.Path(__file__).parent + + # Save training data + train_file = parent_dir / "textcraft_train.jsonl" + with open(train_file, "w") as f: + for task in train_data: + json.dump(asdict(task), f) + f.write("\n") + + # Save validation data + val_file = parent_dir / "textcraft_val.jsonl" + with open(val_file, "w") as f: + for task in val_data: + json.dump(asdict(task), f) + f.write("\n") + + print(f"Saved {len(train_data)} training samples to {train_file}") + print(f"Saved {len(val_data)} validation samples to {val_file}") diff --git a/astraflow/core/workflow/impl/textcraft/textcraft_train.jsonl b/astraflow/core/workflow/impl/textcraft/textcraft_train.jsonl new file mode 100644 index 0000000..6481624 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/textcraft_train.jsonl @@ -0,0 +1,1000 @@ +{"goal": "Craft the following items: 1x brick_stairs, 1x orange_carpet, 1x diorite_wall", "id": "textcraft.train.0", "max_steps": 50, "misc": {"target_items": {"brick_stairs": 1, "orange_carpet": 1, "diorite_wall": 1}, "initial_inventory": {"brick": 35, "string": 25, "orange_tulip": 1, "cobblestone": 9, "quartz": 6, "egg": 2}, "gold_trajectory": [{"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_stairs", 1], "ingredients": {"bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_carpet", 1], "ingredients": {"white_carpet": 8, "orange_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_wall", 1], "ingredients": {"diorite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x blue_wool", "id": "textcraft.train.1", "max_steps": 50, "misc": {"target_items": {"blue_wool": 2}, "initial_inventory": {"cornflower": 3, "string": 12, "vine": 1, "sunflower": 2, "beetroot": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["blue_wool", 2], "ingredients": {"blue_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x nether_brick_fence, 2x prismarine_slab", "id": "textcraft.train.2", "max_steps": 50, "misc": {"target_items": {"nether_brick_fence": 3, "prismarine_slab": 2}, "initial_inventory": {"nether_brick": 20, "prismarine_shard": 14, "melon_slice": 3, "pink_tulip": 1, "red_sand": 2, "stripped_dark_oak_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 4], "ingredients": {"nether_brick": 16}, "result_count": 4}, {"action": "craft", "target": ["nether_brick_fence", 1], "ingredients": {"nether_bricks": 4, "nether_brick": 2}, "result_count": 6}, {"action": "craft", "target": ["prismarine", 3], "ingredients": {"prismarine_shard": 12}, "result_count": 3}, {"action": "craft", "target": ["prismarine_slab", 1], "ingredients": {"prismarine": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x green_wool", "id": "textcraft.train.3", "max_steps": 50, "misc": {"target_items": {"green_wool": 2}, "initial_inventory": {"green_dye": 3, "string": 12, "pumpkin": 3, "beetroot": 1, "quartz": 1}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["green_wool", 2], "ingredients": {"green_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x nether_brick_slab, 1x magenta_dye", "id": "textcraft.train.4", "max_steps": 50, "misc": {"target_items": {"nether_brick_slab": 1, "magenta_dye": 1}, "initial_inventory": {"nether_brick": 16, "allium": 2, "feather": 4, "glass": 4, "flint": 3}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["magenta_dye", 1], "ingredients": {"allium": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x prismarine_brick_stairs", "id": "textcraft.train.5", "max_steps": 50, "misc": {"target_items": {"prismarine_brick_stairs": 3}, "initial_inventory": {"prismarine_shard": 71, "dark_oak_log": 5, "cocoa_beans": 5, "green_dye": 3, "cornflower": 2}, "gold_trajectory": [{"action": "craft", "target": ["prismarine_bricks", 6], "ingredients": {"prismarine_shard": 54}, "result_count": 6}, {"action": "craft", "target": ["prismarine_brick_stairs", 1], "ingredients": {"prismarine_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x jungle_fence_gate", "id": "textcraft.train.6", "max_steps": 50, "misc": {"target_items": {"jungle_fence_gate": 2}, "initial_inventory": {"acacia_log": 1, "jungle_log": 2, "apple": 3, "stripped_spruce_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["jungle_fence_gate", 2], "ingredients": {"stick": 8, "jungle_planks": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x bow, 1x lime_wool, 3x birch_fence_gate", "id": "textcraft.train.7", "max_steps": 50, "misc": {"target_items": {"bow": 1, "lime_wool": 1, "birch_fence_gate": 3}, "initial_inventory": {"acacia_log": 3, "string": 8, "green_dye": 1, "lily_of_the_valley": 1, "birch_log": 3, "enchanted_golden_apple": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["bow", 1], "ingredients": {"stick": 3, "string": 3}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["lime_wool", 1], "ingredients": {"lime_dye": 1, "white_wool": 1}, "result_count": 1}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["birch_planks", 2], "ingredients": {"birch_log": 2}, "result_count": 8}, {"action": "craft", "target": ["birch_fence_gate", 3], "ingredients": {"stick": 12, "birch_planks": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x mossy_cobblestone_slab, 3x cyan_concrete_powder", "id": "textcraft.train.8", "max_steps": 50, "misc": {"target_items": {"mossy_cobblestone_slab": 1, "cyan_concrete_powder": 3}, "initial_inventory": {"cobblestone": 4, "vine": 4, "cornflower": 2, "green_dye": 2, "sand": 5, "gravel": 6, "nether_wart": 1, "ghast_tear": 4}, "gold_trajectory": [{"action": "craft", "target": ["mossy_cobblestone", 3], "ingredients": {"cobblestone": 3, "vine": 3}, "result_count": 3}, {"action": "craft", "target": ["mossy_cobblestone_slab", 1], "ingredients": {"mossy_cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_concrete_powder", 1], "ingredients": {"cyan_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x white_banner, 1x cut_sandstone, 3x fire_charge", "id": "textcraft.train.9", "max_steps": 50, "misc": {"target_items": {"white_banner": 1, "cut_sandstone": 1, "fire_charge": 3}, "initial_inventory": {"string": 31, "acacia_log": 1, "sand": 22, "gunpowder": 1, "blaze_rod": 2, "honeycomb": 1, "jungle_log": 5, "end_stone": 1, "feather": 5, "oak_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["white_banner", 1], "ingredients": {"white_wool": 6, "stick": 1}, "result_count": 1}, {"action": "craft", "target": ["sandstone", 4], "ingredients": {"sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_sandstone", 1], "ingredients": {"sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["fire_charge", 1], "ingredients": {"gunpowder": 1, "blaze_powder": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x diorite_stairs, 1x nether_brick_slab", "id": "textcraft.train.10", "max_steps": 50, "misc": {"target_items": {"diorite_stairs": 1, "nether_brick_slab": 1}, "initial_inventory": {"cobblestone": 9, "quartz": 6, "nether_brick": 15, "smooth_stone": 3, "cocoa_beans": 5, "scute": 4, "basalt": 2}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_stairs", 1], "ingredients": {"diorite": 6}, "result_count": 4}, {"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x andesite_wall, 1x granite, 3x red_nether_brick_slab", "id": "textcraft.train.11", "max_steps": 50, "misc": {"target_items": {"andesite_wall": 1, "granite": 1, "red_nether_brick_slab": 3}, "initial_inventory": {"cobblestone": 9, "quartz": 8, "nether_brick": 6, "nether_wart": 6, "green_dye": 1, "white_tulip": 2, "shulker_shell": 5}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 3], "ingredients": {"diorite": 3, "cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["andesite_wall", 1], "ingredients": {"andesite": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 1], "ingredients": {"diorite": 1, "quartz": 1}, "result_count": 1}, {"action": "craft", "target": ["red_nether_bricks", 3], "ingredients": {"nether_brick": 6, "nether_wart": 6}, "result_count": 3}, {"action": "craft", "target": ["red_nether_brick_slab", 1], "ingredients": {"red_nether_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x sandstone_wall", "id": "textcraft.train.12", "max_steps": 50, "misc": {"target_items": {"sandstone_wall": 1}, "initial_inventory": {"sand": 30, "stripped_birch_log": 2, "poppy": 3, "enchanted_golden_apple": 3, "glass": 2}, "gold_trajectory": [{"action": "craft", "target": ["sandstone", 6], "ingredients": {"sand": 24}, "result_count": 6}, {"action": "craft", "target": ["sandstone_wall", 1], "ingredients": {"sandstone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x black_concrete_powder, 3x jungle_fence", "id": "textcraft.train.13", "max_steps": 50, "misc": {"target_items": {"black_concrete_powder": 1, "jungle_fence": 3}, "initial_inventory": {"wither_rose": 1, "sand": 6, "gravel": 4, "jungle_log": 2, "acacia_log": 2, "enchanted_golden_apple": 2, "stripped_acacia_log": 4, "snowball": 2}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_concrete_powder", 1], "ingredients": {"black_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"jungle_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["jungle_fence", 1], "ingredients": {"jungle_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x mossy_stone_brick_wall, 2x nether_brick_fence", "id": "textcraft.train.14", "max_steps": 50, "misc": {"target_items": {"mossy_stone_brick_wall": 1, "nether_brick_fence": 2}, "initial_inventory": {"stone": 10, "vine": 9, "nether_brick": 26, "snowball": 1, "stripped_birch_log": 2, "shulker_shell": 3, "crying_obsidian": 1}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["mossy_stone_bricks", 6], "ingredients": {"stone_bricks": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_stone_brick_wall", 1], "ingredients": {"mossy_stone_bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["nether_bricks", 4], "ingredients": {"nether_brick": 16}, "result_count": 4}, {"action": "craft", "target": ["nether_brick_fence", 1], "ingredients": {"nether_bricks": 4, "nether_brick": 2}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x flower_banner_pattern, 3x respawn_anchor", "id": "textcraft.train.15", "max_steps": 50, "misc": {"target_items": {"flower_banner_pattern": 2, "respawn_anchor": 3}, "initial_inventory": {"sugar_cane": 4, "oxeye_daisy": 3, "crying_obsidian": 25, "glowstone_dust": 50, "birch_log": 4, "nautilus_shell": 2, "scute": 1}, "gold_trajectory": [{"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["flower_banner_pattern", 2], "ingredients": {"paper": 2, "oxeye_daisy": 2}, "result_count": 2}, {"action": "craft", "target": ["glowstone", 9], "ingredients": {"glowstone_dust": 36}, "result_count": 9}, {"action": "craft", "target": ["respawn_anchor", 3], "ingredients": {"crying_obsidian": 18, "glowstone": 9}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x pink_dye", "id": "textcraft.train.16", "max_steps": 50, "misc": {"target_items": {"pink_dye": 2}, "initial_inventory": {"pink_tulip": 3, "peony": 4, "bone": 3, "enchanted_golden_apple": 3}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 2], "ingredients": {"pink_tulip": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x polished_diorite, 3x green_banner", "id": "textcraft.train.17", "max_steps": 50, "misc": {"target_items": {"polished_diorite": 2, "green_banner": 3}, "initial_inventory": {"cobblestone": 6, "quartz": 5, "green_dye": 20, "string": 101, "acacia_log": 1, "glass": 5, "white_tulip": 1}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["green_wool", 18], "ingredients": {"green_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["green_banner", 3], "ingredients": {"green_wool": 18, "stick": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x polished_blackstone_brick_wall", "id": "textcraft.train.18", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_brick_wall": 2}, "initial_inventory": {"blackstone": 9, "lilac": 1, "stripped_birch_log": 4, "smooth_quartz": 2, "smooth_stone": 3, "rose_bush": 4}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_bricks", 2], "ingredients": {"polished_blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_brick_wall", 1], "ingredients": {"polished_blackstone_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x white_dye, 1x gray_stained_glass, 1x leather_chestplate", "id": "textcraft.train.19", "max_steps": 50, "misc": {"target_items": {"white_dye": 3, "gray_stained_glass": 1, "leather_chestplate": 1}, "initial_inventory": {"lily_of_the_valley": 6, "glass": 9, "wither_rose": 1, "rabbit_hide": 41, "white_tulip": 1, "sugar_cane": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 3], "ingredients": {"lily_of_the_valley": 3}, "result_count": 3}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_stained_glass", 1], "ingredients": {"glass": 8, "gray_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["leather", 8], "ingredients": {"rabbit_hide": 32}, "result_count": 8}, {"action": "craft", "target": ["leather_chestplate", 1], "ingredients": {"leather": 8}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x polished_blackstone_wall, 3x cut_red_sandstone_slab, 3x stone_axe", "id": "textcraft.train.20", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_wall": 2, "cut_red_sandstone_slab": 3, "stone_axe": 3}, "initial_inventory": {"blackstone": 21, "red_sand": 21, "acacia_log": 1, "peony": 4, "honeycomb": 4}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_wall", 1], "ingredients": {"polished_blackstone": 6}, "result_count": 6}, {"action": "craft", "target": ["red_sandstone", 4], "ingredients": {"red_sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone", 1], "ingredients": {"red_sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone_slab", 1], "ingredients": {"cut_red_sandstone": 3}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["stone_axe", 3], "ingredients": {"blackstone": 9, "stick": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x black_bed", "id": "textcraft.train.21", "max_steps": 50, "misc": {"target_items": {"black_bed": 2}, "initial_inventory": {"wither_rose": 8, "string": 28, "acacia_log": 3, "dandelion": 2, "azure_bluet": 2}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 6], "ingredients": {"wither_rose": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["black_wool", 6], "ingredients": {"black_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["black_bed", 2], "ingredients": {"black_wool": 6, "acacia_planks": 6}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x stone_hoe, 1x black_carpet", "id": "textcraft.train.22", "max_steps": 50, "misc": {"target_items": {"stone_hoe": 3, "black_carpet": 1}, "initial_inventory": {"blackstone": 8, "acacia_log": 2, "wither_rose": 3, "string": 12, "cocoa_beans": 5, "heart_of_the_sea": 3, "pink_tulip": 4, "spruce_log": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["stone_hoe", 3], "ingredients": {"blackstone": 6, "stick": 6}, "result_count": 3}, {"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["black_wool", 2], "ingredients": {"black_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["black_carpet", 1], "ingredients": {"black_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x yellow_wool", "id": "textcraft.train.23", "max_steps": 50, "misc": {"target_items": {"yellow_wool": 3}, "initial_inventory": {"dandelion": 4, "string": 14, "end_stone": 2, "smooth_red_sandstone": 2, "stripped_jungle_log": 2, "netherite_scrap": 1}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 3], "ingredients": {"dandelion": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["yellow_wool", 3], "ingredients": {"yellow_dye": 3, "white_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x wooden_axe, 1x blue_ice, 3x diorite_wall", "id": "textcraft.train.24", "max_steps": 50, "misc": {"target_items": {"wooden_axe": 1, "blue_ice": 1, "diorite_wall": 3}, "initial_inventory": {"acacia_log": 3, "ice": 89, "cobblestone": 9, "quartz": 6, "acacia_planks": 4, "red_mushroom": 4, "rose_bush": 2, "carved_pumpkin": 3, "dirt": 1}, "gold_trajectory": [{"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["wooden_axe", 1], "ingredients": {"tag:planks": 3, "stick": 2}, "result_count": 1}, {"action": "craft", "target": ["packed_ice", 9], "ingredients": {"ice": 81}, "result_count": 9}, {"action": "craft", "target": ["blue_ice", 1], "ingredients": {"packed_ice": 9}, "result_count": 1}, {"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_wall", 1], "ingredients": {"diorite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x blue_concrete_powder, 3x dark_oak_fence", "id": "textcraft.train.25", "max_steps": 50, "misc": {"target_items": {"blue_concrete_powder": 3, "dark_oak_fence": 3}, "initial_inventory": {"cornflower": 1, "sand": 4, "gravel": 4, "dark_oak_log": 2, "acacia_log": 1, "wither_rose": 5, "ink_sac": 4, "red_sand": 5}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_concrete_powder", 1], "ingredients": {"blue_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["dark_oak_planks", 1], "ingredients": {"dark_oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"dark_oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_planks", 1], "ingredients": {"dark_oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_fence", 1], "ingredients": {"dark_oak_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x cyan_wool", "id": "textcraft.train.26", "max_steps": 50, "misc": {"target_items": {"cyan_wool": 3}, "initial_inventory": {"cornflower": 3, "green_dye": 3, "string": 14, "jungle_log": 1, "milk_bucket": 1, "blaze_rod": 3, "red_sand": 3, "snowball": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["cyan_dye", 2], "ingredients": {"blue_dye": 2, "green_dye": 2}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["cyan_wool", 3], "ingredients": {"cyan_dye": 3, "white_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x red_stained_glass", "id": "textcraft.train.27", "max_steps": 50, "misc": {"target_items": {"red_stained_glass": 3}, "initial_inventory": {"glass": 12, "rose_bush": 1, "string": 1, "ink_sac": 2, "bamboo": 5, "feather": 4}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_stained_glass", 1], "ingredients": {"glass": 8, "red_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x arrow, 1x granite_slab", "id": "textcraft.train.28", "max_steps": 50, "misc": {"target_items": {"arrow": 2, "granite_slab": 1}, "initial_inventory": {"flint": 2, "acacia_log": 2, "feather": 2, "cobblestone": 4, "quartz": 10, "scute": 5, "crimson_stem": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 3], "ingredients": {"diorite": 3, "quartz": 3}, "result_count": 3}, {"action": "craft", "target": ["granite_slab", 1], "ingredients": {"granite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x torch, 3x black_stained_glass_pane, 1x polished_diorite", "id": "textcraft.train.29", "max_steps": 50, "misc": {"target_items": {"torch": 3, "black_stained_glass_pane": 3, "polished_diorite": 1}, "initial_inventory": {"acacia_log": 1, "glass": 10, "wither_rose": 1, "cobblestone": 6, "quartz": 5, "cornflower": 1, "crimson_stem": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_stained_glass", 1], "ingredients": {"glass": 8, "black_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["black_stained_glass_pane", 1], "ingredients": {"black_stained_glass": 6}, "result_count": 16}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x acacia_fence_gate, 3x end_stone_brick_wall", "id": "textcraft.train.30", "max_steps": 50, "misc": {"target_items": {"acacia_fence_gate": 2, "end_stone_brick_wall": 3}, "initial_inventory": {"acacia_log": 2, "end_stone": 11, "stripped_crimson_stem": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["acacia_fence_gate", 2], "ingredients": {"stick": 8, "acacia_planks": 4}, "result_count": 2}, {"action": "craft", "target": ["end_stone_bricks", 2], "ingredients": {"end_stone": 8}, "result_count": 8}, {"action": "craft", "target": ["end_stone_brick_wall", 1], "ingredients": {"end_stone_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x granite_stairs, 3x red_stained_glass_pane", "id": "textcraft.train.31", "max_steps": 50, "misc": {"target_items": {"granite_stairs": 1, "red_stained_glass_pane": 3}, "initial_inventory": {"cobblestone": 9, "quartz": 12, "glass": 7, "rose_bush": 2, "bone": 4, "stripped_birch_log": 3, "clay_ball": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_stairs", 1], "ingredients": {"granite": 6}, "result_count": 4}, {"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "red_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x oak_fence", "id": "textcraft.train.32", "max_steps": 50, "misc": {"target_items": {"oak_fence": 3}, "initial_inventory": {"oak_log": 2, "acacia_log": 1, "blaze_rod": 1, "ink_sac": 1}, "gold_trajectory": [{"action": "craft", "target": ["oak_planks", 1], "ingredients": {"oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["oak_planks", 1], "ingredients": {"oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["oak_fence", 1], "ingredients": {"oak_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x wooden_pickaxe, 2x blue_dye", "id": "textcraft.train.33", "max_steps": 50, "misc": {"target_items": {"wooden_pickaxe": 2, "blue_dye": 2}, "initial_inventory": {"acacia_log": 3, "cornflower": 2, "string": 3, "smooth_red_sandstone": 3, "warped_stem": 4, "peony": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_pickaxe", 2], "ingredients": {"acacia_planks": 6, "stick": 4}, "result_count": 2}, {"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x brown_carpet", "id": "textcraft.train.34", "max_steps": 50, "misc": {"target_items": {"brown_carpet": 2}, "initial_inventory": {"cocoa_beans": 3, "string": 11, "popped_chorus_fruit": 2, "wither_skeleton_skull": 3, "rabbit_hide": 5}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 2], "ingredients": {"cocoa_beans": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["brown_wool", 2], "ingredients": {"brown_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["brown_carpet", 1], "ingredients": {"brown_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x white_dye", "id": "textcraft.train.35", "max_steps": 50, "misc": {"target_items": {"white_dye": 3}, "initial_inventory": {"lily_of_the_valley": 4, "egg": 4, "oak_log": 3, "stripped_dark_oak_log": 1, "smooth_stone": 3}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 3], "ingredients": {"lily_of_the_valley": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x sandstone_wall", "id": "textcraft.train.36", "max_steps": 50, "misc": {"target_items": {"sandstone_wall": 3}, "initial_inventory": {"sand": 29, "ice": 1, "stripped_oak_log": 4, "pink_tulip": 3}, "gold_trajectory": [{"action": "craft", "target": ["sandstone", 6], "ingredients": {"sand": 24}, "result_count": 6}, {"action": "craft", "target": ["sandstone_wall", 1], "ingredients": {"sandstone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x yellow_bed, 3x writable_book, 3x prismarine_slab", "id": "textcraft.train.37", "max_steps": 50, "misc": {"target_items": {"yellow_bed": 2, "writable_book": 3, "prismarine_slab": 3}, "initial_inventory": {"dandelion": 9, "string": 33, "acacia_log": 2, "sugar_cane": 12, "rabbit_hide": 17, "ink_sac": 3, "feather": 4, "prismarine_shard": 16, "peony": 1, "blue_orchid": 2, "jungle_log": 4, "enchanted_golden_apple": 3}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 6], "ingredients": {"dandelion": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["yellow_wool", 6], "ingredients": {"yellow_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["yellow_bed", 2], "ingredients": {"yellow_wool": 6, "acacia_planks": 6}, "result_count": 2}, {"action": "craft", "target": ["paper", 3], "ingredients": {"sugar_cane": 9}, "result_count": 9}, {"action": "craft", "target": ["leather", 3], "ingredients": {"rabbit_hide": 12}, "result_count": 3}, {"action": "craft", "target": ["book", 3], "ingredients": {"paper": 9, "leather": 3}, "result_count": 3}, {"action": "craft", "target": ["writable_book", 3], "ingredients": {"book": 3, "ink_sac": 3, "feather": 3}, "result_count": 3}, {"action": "craft", "target": ["prismarine", 3], "ingredients": {"prismarine_shard": 12}, "result_count": 3}, {"action": "craft", "target": ["prismarine_slab", 1], "ingredients": {"prismarine": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x blue_stained_glass_pane", "id": "textcraft.train.38", "max_steps": 50, "misc": {"target_items": {"blue_stained_glass_pane": 2}, "initial_inventory": {"glass": 12, "cornflower": 2, "peony": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_stained_glass", 1], "ingredients": {"glass": 8, "blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["blue_stained_glass_pane", 1], "ingredients": {"blue_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 1x prismarine_slab", "id": "textcraft.train.39", "max_steps": 50, "misc": {"target_items": {"prismarine_slab": 1}, "initial_inventory": {"prismarine_shard": 17, "ice": 5, "warped_stem": 1, "heart_of_the_sea": 2}, "gold_trajectory": [{"action": "craft", "target": ["prismarine", 3], "ingredients": {"prismarine_shard": 12}, "result_count": 3}, {"action": "craft", "target": ["prismarine_slab", 1], "ingredients": {"prismarine": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x mossy_cobblestone_wall", "id": "textcraft.train.40", "max_steps": 50, "misc": {"target_items": {"mossy_cobblestone_wall": 1}, "initial_inventory": {"cobblestone": 6, "vine": 7, "quartz": 3, "ender_pearl": 2, "milk_bucket": 1}, "gold_trajectory": [{"action": "craft", "target": ["mossy_cobblestone", 6], "ingredients": {"cobblestone": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_cobblestone_wall", 1], "ingredients": {"mossy_cobblestone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x jungle_fence", "id": "textcraft.train.41", "max_steps": 50, "misc": {"target_items": {"jungle_fence": 1}, "initial_inventory": {"jungle_log": 2, "acacia_log": 1, "stripped_birch_log": 1, "stripped_crimson_stem": 4, "rabbit_hide": 1}, "gold_trajectory": [{"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"jungle_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["jungle_fence", 1], "ingredients": {"jungle_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x gray_dye, 2x blue_bed, 3x blue_stained_glass", "id": "textcraft.train.42", "max_steps": 50, "misc": {"target_items": {"gray_dye": 2, "blue_bed": 2, "blue_stained_glass": 3}, "initial_inventory": {"wither_rose": 1, "lily_of_the_valley": 1, "string": 31, "acacia_log": 3, "cornflower": 4, "glass": 8, "stone": 4, "bone": 1, "smooth_quartz": 5, "flint": 1, "stripped_crimson_stem": 3}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["white_bed", 2], "ingredients": {"white_wool": 6, "acacia_planks": 6}, "result_count": 2}, {"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["blue_bed", 2], "ingredients": {"white_bed": 2, "blue_dye": 2}, "result_count": 2}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_stained_glass", 1], "ingredients": {"glass": 8, "blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x brown_carpet", "id": "textcraft.train.43", "max_steps": 50, "misc": {"target_items": {"brown_carpet": 1}, "initial_inventory": {"cocoa_beans": 2, "string": 11, "dark_oak_log": 3, "stripped_crimson_stem": 5}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 2], "ingredients": {"cocoa_beans": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["brown_wool", 2], "ingredients": {"brown_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["brown_carpet", 1], "ingredients": {"brown_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x nether_brick_stairs, 3x prismarine_stairs", "id": "textcraft.train.44", "max_steps": 50, "misc": {"target_items": {"nether_brick_stairs": 3, "prismarine_stairs": 3}, "initial_inventory": {"nether_brick": 34, "prismarine_shard": 32, "red_sand": 3, "snowball": 2}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 6], "ingredients": {"nether_brick": 24}, "result_count": 6}, {"action": "craft", "target": ["nether_brick_stairs", 1], "ingredients": {"nether_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["prismarine", 6], "ingredients": {"prismarine_shard": 24}, "result_count": 6}, {"action": "craft", "target": ["prismarine_stairs", 1], "ingredients": {"prismarine": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x light_blue_concrete_powder, 1x white_banner", "id": "textcraft.train.45", "max_steps": 50, "misc": {"target_items": {"light_blue_concrete_powder": 2, "white_banner": 1}, "initial_inventory": {"cornflower": 1, "lily_of_the_valley": 1, "sand": 6, "gravel": 6, "string": 30, "acacia_log": 1, "nautilus_shell": 1, "egg": 5, "spider_eye": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_concrete_powder", 1], "ingredients": {"light_blue_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["white_banner", 1], "ingredients": {"white_wool": 6, "stick": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x white_bed", "id": "textcraft.train.46", "max_steps": 50, "misc": {"target_items": {"white_bed": 3}, "initial_inventory": {"string": 54, "acacia_log": 4, "sunflower": 2, "glass": 5, "ghast_tear": 1, "melon_slice": 3}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 9], "ingredients": {"string": 36}, "result_count": 9}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["white_bed", 3], "ingredients": {"white_wool": 9, "acacia_planks": 9}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x bow, 2x black_wool, 1x blue_carpet", "id": "textcraft.train.47", "max_steps": 50, "misc": {"target_items": {"bow": 3, "black_wool": 2, "blue_carpet": 1}, "initial_inventory": {"acacia_log": 3, "string": 42, "wither_rose": 3, "cornflower": 1, "bone": 3, "cocoa_beans": 5, "green_dye": 4, "smooth_red_sandstone": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["bow", 3], "ingredients": {"stick": 9, "string": 9}, "result_count": 3}, {"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["black_wool", 2], "ingredients": {"black_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_carpet", 1], "ingredients": {"white_carpet": 8, "blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x dark_oak_fence_gate, 3x brown_bed", "id": "textcraft.train.48", "max_steps": 50, "misc": {"target_items": {"dark_oak_fence_gate": 1, "brown_bed": 3}, "initial_inventory": {"acacia_log": 5, "dark_oak_log": 2, "string": 38, "cocoa_beans": 4, "birch_planks": 10, "green_dye": 5, "azure_bluet": 4, "nether_star": 3, "cornflower": 3}, "gold_trajectory": [{"action": "craft", "target": ["stick", 1], "ingredients": {"birch_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_planks", 1], "ingredients": {"dark_oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_fence_gate", 1], "ingredients": {"stick": 4, "dark_oak_planks": 2}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 9], "ingredients": {"string": 36}, "result_count": 9}, {"action": "craft", "target": ["white_bed", 3], "ingredients": {"white_wool": 9, "tag:planks": 9}, "result_count": 3}, {"action": "craft", "target": ["brown_dye", 3], "ingredients": {"cocoa_beans": 3}, "result_count": 3}, {"action": "craft", "target": ["brown_bed", 3], "ingredients": {"white_bed": 3, "brown_dye": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x jack_o_lantern, 2x dark_prismarine_stairs, 2x red_stained_glass_pane", "id": "textcraft.train.49", "max_steps": 50, "misc": {"target_items": {"jack_o_lantern": 1, "dark_prismarine_stairs": 2, "red_stained_glass_pane": 2}, "initial_inventory": {"carved_pumpkin": 2, "acacia_log": 2, "prismarine_shard": 66, "wither_rose": 6, "glass": 8, "rose_bush": 1, "crimson_stem": 4, "crying_obsidian": 1, "blue_orchid": 3, "bone": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}, {"action": "craft", "target": ["jack_o_lantern", 1], "ingredients": {"carved_pumpkin": 1, "torch": 1}, "result_count": 1}, {"action": "craft", "target": ["black_dye", 6], "ingredients": {"wither_rose": 6}, "result_count": 6}, {"action": "craft", "target": ["dark_prismarine", 6], "ingredients": {"prismarine_shard": 48, "black_dye": 6}, "result_count": 6}, {"action": "craft", "target": ["dark_prismarine_stairs", 1], "ingredients": {"dark_prismarine": 6}, "result_count": 4}, {"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "red_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x end_stone_brick_stairs", "id": "textcraft.train.50", "max_steps": 50, "misc": {"target_items": {"end_stone_brick_stairs": 3}, "initial_inventory": {"end_stone": 11, "ghast_tear": 4, "sand": 3, "stone": 1}, "gold_trajectory": [{"action": "craft", "target": ["end_stone_bricks", 2], "ingredients": {"end_stone": 8}, "result_count": 8}, {"action": "craft", "target": ["end_stone_brick_stairs", 1], "ingredients": {"end_stone_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x writable_book, 3x black_banner", "id": "textcraft.train.51", "max_steps": 50, "misc": {"target_items": {"writable_book": 2, "black_banner": 3}, "initial_inventory": {"sugar_cane": 6, "rabbit_hide": 10, "ink_sac": 2, "feather": 3, "wither_rose": 19, "string": 107, "acacia_log": 2, "blackstone": 5, "basalt": 3, "azure_bluet": 5, "scute": 2}, "gold_trajectory": [{"action": "craft", "target": ["paper", 2], "ingredients": {"sugar_cane": 6}, "result_count": 6}, {"action": "craft", "target": ["leather", 2], "ingredients": {"rabbit_hide": 8}, "result_count": 2}, {"action": "craft", "target": ["book", 2], "ingredients": {"paper": 6, "leather": 2}, "result_count": 2}, {"action": "craft", "target": ["writable_book", 2], "ingredients": {"book": 2, "ink_sac": 2, "feather": 2}, "result_count": 2}, {"action": "craft", "target": ["black_dye", 18], "ingredients": {"wither_rose": 18}, "result_count": 18}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["black_wool", 18], "ingredients": {"black_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["black_banner", 3], "ingredients": {"black_wool": 18, "stick": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x light_blue_concrete_powder, 3x polished_granite_slab", "id": "textcraft.train.52", "max_steps": 50, "misc": {"target_items": {"light_blue_concrete_powder": 3, "polished_granite_slab": 3}, "initial_inventory": {"cornflower": 2, "lily_of_the_valley": 1, "sand": 6, "gravel": 6, "cobblestone": 4, "quartz": 10, "ice": 3, "stripped_crimson_stem": 5, "egg": 4, "birch_log": 3, "warped_stem": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_concrete_powder", 1], "ingredients": {"light_blue_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 4], "ingredients": {"diorite": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite", 1], "ingredients": {"granite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite_slab", 1], "ingredients": {"polished_granite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x polished_blackstone_pressure_plate", "id": "textcraft.train.53", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_pressure_plate": 3}, "initial_inventory": {"blackstone": 12, "scute": 3, "beetroot": 5}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_pressure_plate", 3], "ingredients": {"polished_blackstone": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x mossy_stone_brick_slab", "id": "textcraft.train.54", "max_steps": 50, "misc": {"target_items": {"mossy_stone_brick_slab": 2}, "initial_inventory": {"stone": 4, "vine": 3, "prismarine_shard": 5, "cooked_rabbit": 4, "sunflower": 4}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["mossy_stone_bricks", 3], "ingredients": {"stone_bricks": 3, "vine": 3}, "result_count": 3}, {"action": "craft", "target": ["mossy_stone_brick_slab", 1], "ingredients": {"mossy_stone_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x white_dye, 3x lime_dye", "id": "textcraft.train.55", "max_steps": 50, "misc": {"target_items": {"white_dye": 2, "lime_dye": 3}, "initial_inventory": {"lily_of_the_valley": 5, "green_dye": 3, "stripped_dark_oak_log": 2, "nether_star": 4, "allium": 3}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 4], "ingredients": {"lily_of_the_valley": 4}, "result_count": 4}, {"action": "craft", "target": ["lime_dye", 2], "ingredients": {"green_dye": 2, "white_dye": 2}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x brown_stained_glass_pane, 2x red_stained_glass_pane, 3x green_wool", "id": "textcraft.train.56", "max_steps": 50, "misc": {"target_items": {"brown_stained_glass_pane": 2, "red_stained_glass_pane": 2, "green_wool": 3}, "initial_inventory": {"glass": 20, "cocoa_beans": 1, "rose_bush": 1, "green_dye": 3, "string": 18, "carved_pumpkin": 4, "blue_orchid": 5, "sand": 5, "wither_rose": 3}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_stained_glass", 1], "ingredients": {"glass": 8, "brown_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["brown_stained_glass_pane", 1], "ingredients": {"brown_stained_glass": 6}, "result_count": 16}, {"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "red_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["green_wool", 3], "ingredients": {"green_dye": 3, "white_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x mossy_stone_brick_stairs", "id": "textcraft.train.57", "max_steps": 50, "misc": {"target_items": {"mossy_stone_brick_stairs": 2}, "initial_inventory": {"stone": 11, "vine": 7, "egg": 2, "glowstone_dust": 3, "snowball": 4, "carved_pumpkin": 4, "stripped_spruce_log": 3}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["mossy_stone_bricks", 6], "ingredients": {"stone_bricks": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_stone_brick_stairs", 1], "ingredients": {"mossy_stone_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x wooden_pickaxe", "id": "textcraft.train.58", "max_steps": 50, "misc": {"target_items": {"wooden_pickaxe": 1}, "initial_inventory": {"acacia_log": 2, "dark_oak_planks": 4, "terracotta": 1, "gunpowder": 5, "stripped_dark_oak_log": 1, "warped_fungus": 5, "string": 2}, "gold_trajectory": [{"action": "craft", "target": ["stick", 1], "ingredients": {"dark_oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_pickaxe", 1], "ingredients": {"acacia_planks": 3, "stick": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x gray_dye", "id": "textcraft.train.59", "max_steps": 50, "misc": {"target_items": {"gray_dye": 2}, "initial_inventory": {"wither_rose": 2, "lily_of_the_valley": 1, "pink_tulip": 4, "warped_fungus": 2, "baked_potato": 1, "stone": 4, "crying_obsidian": 3}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x gray_dye", "id": "textcraft.train.60", "max_steps": 50, "misc": {"target_items": {"gray_dye": 1}, "initial_inventory": {"wither_rose": 1, "lily_of_the_valley": 2, "birch_log": 4, "wither_skeleton_skull": 4, "blackstone": 1, "prismarine_crystals": 2}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x mossy_cobblestone_stairs", "id": "textcraft.train.61", "max_steps": 50, "misc": {"target_items": {"mossy_cobblestone_stairs": 1}, "initial_inventory": {"cobblestone": 9, "vine": 7, "smooth_quartz": 1, "azure_bluet": 3, "scute": 3, "nether_star": 4}, "gold_trajectory": [{"action": "craft", "target": ["mossy_cobblestone", 6], "ingredients": {"cobblestone": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_cobblestone_stairs", 1], "ingredients": {"mossy_cobblestone": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x blue_ice", "id": "textcraft.train.62", "max_steps": 50, "misc": {"target_items": {"blue_ice": 1}, "initial_inventory": {"ice": 96, "stripped_jungle_log": 4, "white_tulip": 1, "red_sand": 2, "nether_wart": 4}, "gold_trajectory": [{"action": "craft", "target": ["packed_ice", 9], "ingredients": {"ice": 81}, "result_count": 9}, {"action": "craft", "target": ["blue_ice", 1], "ingredients": {"packed_ice": 9}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x dark_prismarine", "id": "textcraft.train.63", "max_steps": 50, "misc": {"target_items": {"dark_prismarine": 2}, "initial_inventory": {"prismarine_shard": 24, "wither_rose": 3, "stripped_birch_log": 3, "vine": 4}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["dark_prismarine", 2], "ingredients": {"prismarine_shard": 16, "black_dye": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x quartz_pillar", "id": "textcraft.train.64", "max_steps": 50, "misc": {"target_items": {"quartz_pillar": 2}, "initial_inventory": {"quartz": 11, "wither_rose": 2, "bone": 4, "stripped_acacia_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["quartz_block", 2], "ingredients": {"quartz": 8}, "result_count": 2}, {"action": "craft", "target": ["quartz_pillar", 1], "ingredients": {"quartz_block": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x light_blue_wool", "id": "textcraft.train.65", "max_steps": 50, "misc": {"target_items": {"light_blue_wool": 1}, "initial_inventory": {"cornflower": 1, "lily_of_the_valley": 2, "string": 4, "stripped_warped_stem": 5, "blue_orchid": 4, "stripped_crimson_stem": 5}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["light_blue_wool", 1], "ingredients": {"light_blue_dye": 1, "white_wool": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x polished_granite_stairs, 2x orange_stained_glass", "id": "textcraft.train.66", "max_steps": 50, "misc": {"target_items": {"polished_granite_stairs": 3, "orange_stained_glass": 2}, "initial_inventory": {"cobblestone": 9, "quartz": 20, "glass": 12, "orange_tulip": 1, "acacia_log": 5, "basalt": 2, "scute": 5}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 4], "ingredients": {"cobblestone": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["granite", 8], "ingredients": {"diorite": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_granite", 2], "ingredients": {"granite": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_granite_stairs", 1], "ingredients": {"polished_granite": 6}, "result_count": 4}, {"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_stained_glass", 1], "ingredients": {"glass": 8, "orange_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x wooden_pickaxe, 2x cut_red_sandstone_slab, 2x light_blue_terracotta", "id": "textcraft.train.67", "max_steps": 50, "misc": {"target_items": {"wooden_pickaxe": 3, "cut_red_sandstone_slab": 2, "light_blue_terracotta": 2}, "initial_inventory": {"acacia_log": 5, "red_sand": 17, "terracotta": 8, "cornflower": 1, "lily_of_the_valley": 2, "red_mushroom": 4, "melon_slice": 3, "flint": 3, "stone": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["wooden_pickaxe", 3], "ingredients": {"acacia_planks": 9, "stick": 6}, "result_count": 3}, {"action": "craft", "target": ["red_sandstone", 4], "ingredients": {"red_sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone", 1], "ingredients": {"red_sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone_slab", 1], "ingredients": {"cut_red_sandstone": 3}, "result_count": 6}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_terracotta", 1], "ingredients": {"terracotta": 8, "light_blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x black_stained_glass_pane, 1x polished_granite", "id": "textcraft.train.68", "max_steps": 50, "misc": {"target_items": {"black_stained_glass_pane": 2, "polished_granite": 1}, "initial_inventory": {"glass": 9, "wither_rose": 1, "cobblestone": 4, "quartz": 10, "obsidian": 4, "honeycomb": 2, "smooth_quartz": 5, "apple": 3, "allium": 2}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_stained_glass", 1], "ingredients": {"glass": 8, "black_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["black_stained_glass_pane", 1], "ingredients": {"black_stained_glass": 6}, "result_count": 16}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 4], "ingredients": {"diorite": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite", 1], "ingredients": {"granite": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x oak_fence_gate, 2x cyan_wool", "id": "textcraft.train.69", "max_steps": 50, "misc": {"target_items": {"oak_fence_gate": 2, "cyan_wool": 2}, "initial_inventory": {"acacia_log": 2, "oak_log": 1, "cornflower": 1, "green_dye": 2, "string": 12, "enchanted_golden_apple": 2, "shulker_shell": 3, "carved_pumpkin": 1, "brick": 4, "milk_bucket": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["oak_planks", 1], "ingredients": {"oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["oak_fence_gate", 2], "ingredients": {"stick": 8, "oak_planks": 4}, "result_count": 2}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["cyan_wool", 2], "ingredients": {"cyan_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x red_nether_brick_stairs, 2x white_banner", "id": "textcraft.train.70", "max_steps": 50, "misc": {"target_items": {"red_nether_brick_stairs": 3, "white_banner": 2}, "initial_inventory": {"nether_brick": 18, "nether_wart": 13, "string": 54, "acacia_log": 2, "sunflower": 1, "baked_potato": 3}, "gold_trajectory": [{"action": "craft", "target": ["red_nether_bricks", 6], "ingredients": {"nether_brick": 12, "nether_wart": 12}, "result_count": 6}, {"action": "craft", "target": ["red_nether_brick_stairs", 1], "ingredients": {"red_nether_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["white_banner", 2], "ingredients": {"white_wool": 12, "stick": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x book", "id": "textcraft.train.71", "max_steps": 50, "misc": {"target_items": {"book": 3}, "initial_inventory": {"sugar_cane": 9, "rabbit_hide": 13, "jungle_log": 3, "nether_brick": 2}, "gold_trajectory": [{"action": "craft", "target": ["paper", 3], "ingredients": {"sugar_cane": 9}, "result_count": 9}, {"action": "craft", "target": ["leather", 3], "ingredients": {"rabbit_hide": 12}, "result_count": 3}, {"action": "craft", "target": ["book", 3], "ingredients": {"paper": 9, "leather": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x chiseled_polished_blackstone, 2x crimson_fence_gate", "id": "textcraft.train.72", "max_steps": 50, "misc": {"target_items": {"chiseled_polished_blackstone": 3, "crimson_fence_gate": 2}, "initial_inventory": {"blackstone": 6, "acacia_log": 2, "crimson_stem": 2, "allium": 2, "peony": 5, "netherite_scrap": 2, "beetroot": 3}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_slab", 1], "ingredients": {"polished_blackstone": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_polished_blackstone", 3], "ingredients": {"polished_blackstone_slab": 6}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["crimson_planks", 1], "ingredients": {"crimson_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["crimson_fence_gate", 2], "ingredients": {"stick": 8, "crimson_planks": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x yellow_terracotta, 2x diorite_stairs, 3x warped_fence_gate", "id": "textcraft.train.73", "max_steps": 50, "misc": {"target_items": {"yellow_terracotta": 3, "diorite_stairs": 2, "warped_fence_gate": 3}, "initial_inventory": {"terracotta": 10, "dandelion": 1, "cobblestone": 6, "quartz": 7, "acacia_log": 2, "warped_stem": 2, "stripped_oak_log": 2, "carved_pumpkin": 1, "orange_tulip": 3}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_terracotta", 1], "ingredients": {"terracotta": 8, "yellow_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_stairs", 1], "ingredients": {"diorite": 6}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["warped_planks", 2], "ingredients": {"warped_stem": 2}, "result_count": 8}, {"action": "craft", "target": ["warped_fence_gate", 3], "ingredients": {"stick": 12, "warped_planks": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x oak_sign", "id": "textcraft.train.74", "max_steps": 50, "misc": {"target_items": {"oak_sign": 2}, "initial_inventory": {"oak_log": 3, "acacia_log": 1, "feather": 5, "quartz": 5}, "gold_trajectory": [{"action": "craft", "target": ["oak_planks", 2], "ingredients": {"oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["oak_sign", 1], "ingredients": {"oak_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x yellow_carpet", "id": "textcraft.train.75", "max_steps": 50, "misc": {"target_items": {"yellow_carpet": 3}, "initial_inventory": {"dandelion": 2, "string": 10, "smooth_stone": 5, "rabbit_hide": 4, "baked_potato": 5, "crimson_stem": 3}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 2], "ingredients": {"dandelion": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["yellow_wool", 2], "ingredients": {"yellow_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["yellow_carpet", 1], "ingredients": {"yellow_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x black_terracotta", "id": "textcraft.train.76", "max_steps": 50, "misc": {"target_items": {"black_terracotta": 3}, "initial_inventory": {"terracotta": 11, "wither_rose": 2, "egg": 4, "poppy": 1, "lilac": 2, "red_mushroom": 3}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_terracotta", 1], "ingredients": {"terracotta": 8, "black_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x blue_banner, 2x blue_carpet, 3x green_wool", "id": "textcraft.train.77", "max_steps": 50, "misc": {"target_items": {"blue_banner": 3, "blue_carpet": 2, "green_wool": 3}, "initial_inventory": {"cornflower": 19, "string": 133, "acacia_log": 2, "green_dye": 3, "shulker_shell": 1, "sunflower": 4, "sugar_cane": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 18], "ingredients": {"cornflower": 18}, "result_count": 18}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["blue_wool", 18], "ingredients": {"blue_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["blue_banner", 3], "ingredients": {"blue_wool": 18, "stick": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_carpet", 1], "ingredients": {"white_carpet": 8, "blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["green_wool", 3], "ingredients": {"green_dye": 3, "white_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x lime_stained_glass, 3x gray_stained_glass", "id": "textcraft.train.78", "max_steps": 50, "misc": {"target_items": {"lime_stained_glass": 1, "gray_stained_glass": 3}, "initial_inventory": {"glass": 24, "green_dye": 1, "lily_of_the_valley": 3, "wither_rose": 1, "stripped_dark_oak_log": 4, "rabbit_hide": 2, "cobblestone": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_stained_glass", 1], "ingredients": {"glass": 8, "lime_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_stained_glass", 1], "ingredients": {"glass": 8, "gray_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x orange_wool", "id": "textcraft.train.79", "max_steps": 50, "misc": {"target_items": {"orange_wool": 2}, "initial_inventory": {"orange_tulip": 3, "string": 12, "stripped_dark_oak_log": 4, "quartz": 2, "smooth_stone": 3, "basalt": 3, "allium": 1}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 2], "ingredients": {"orange_tulip": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["orange_wool", 2], "ingredients": {"orange_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x wooden_pickaxe", "id": "textcraft.train.80", "max_steps": 50, "misc": {"target_items": {"wooden_pickaxe": 1}, "initial_inventory": {"acacia_log": 2, "spruce_planks": 4, "ghast_tear": 5, "nautilus_shell": 2, "warped_fungus": 4}, "gold_trajectory": [{"action": "craft", "target": ["stick", 1], "ingredients": {"spruce_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_pickaxe", 1], "ingredients": {"acacia_planks": 3, "stick": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x green_stained_glass_pane", "id": "textcraft.train.81", "max_steps": 50, "misc": {"target_items": {"green_stained_glass_pane": 2}, "initial_inventory": {"glass": 7, "green_dye": 2, "cornflower": 3, "vine": 2, "crimson_stem": 1}, "gold_trajectory": [{"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["green_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "green_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x purple_terracotta", "id": "textcraft.train.82", "max_steps": 50, "misc": {"target_items": {"purple_terracotta": 1}, "initial_inventory": {"terracotta": 8, "cornflower": 2, "rose_bush": 1, "glass": 2, "stripped_warped_stem": 3, "ender_pearl": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_terracotta", 1], "ingredients": {"terracotta": 8, "purple_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x stone_axe, 2x wooden_axe", "id": "textcraft.train.83", "max_steps": 50, "misc": {"target_items": {"stone_axe": 3, "wooden_axe": 2}, "initial_inventory": {"blackstone": 11, "acacia_log": 5, "birch_log": 4, "crimson_stem": 1, "apple": 4, "ink_sac": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["stone_axe", 3], "ingredients": {"blackstone": 9, "stick": 6}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_axe", 2], "ingredients": {"acacia_planks": 6, "stick": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x painting", "id": "textcraft.train.84", "max_steps": 50, "misc": {"target_items": {"painting": 2}, "initial_inventory": {"acacia_log": 3, "wither_rose": 2, "string": 12, "nautilus_shell": 2, "warped_stem": 3, "stripped_warped_stem": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 4], "ingredients": {"acacia_planks": 8}, "result_count": 16}, {"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["black_wool", 2], "ingredients": {"black_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["painting", 2], "ingredients": {"stick": 16, "black_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x polished_granite_slab, 2x white_carpet, 3x wooden_hoe", "id": "textcraft.train.85", "max_steps": 50, "misc": {"target_items": {"polished_granite_slab": 2, "white_carpet": 2, "wooden_hoe": 3}, "initial_inventory": {"cobblestone": 6, "quartz": 11, "string": 11, "acacia_log": 3, "cooked_rabbit": 2, "apple": 5, "carrot": 2, "wither_skeleton_skull": 1}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 4], "ingredients": {"diorite": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite", 1], "ingredients": {"granite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite_slab", 1], "ingredients": {"polished_granite": 3}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["white_carpet", 1], "ingredients": {"white_wool": 2}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["wooden_hoe", 3], "ingredients": {"acacia_planks": 6, "stick": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x granite", "id": "textcraft.train.86", "max_steps": 50, "misc": {"target_items": {"granite": 3}, "initial_inventory": {"cobblestone": 6, "quartz": 10, "sand": 1, "rabbit_hide": 2, "enchanted_golden_apple": 2}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 3], "ingredients": {"diorite": 3, "quartz": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x black_carpet", "id": "textcraft.train.87", "max_steps": 50, "misc": {"target_items": {"black_carpet": 2}, "initial_inventory": {"wither_rose": 3, "string": 12, "ghast_tear": 1, "pink_tulip": 2, "azure_bluet": 4, "blaze_rod": 3, "white_tulip": 1}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["black_wool", 2], "ingredients": {"black_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["black_carpet", 1], "ingredients": {"black_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x leather_boots, 3x bow, 2x purple_terracotta", "id": "textcraft.train.88", "max_steps": 50, "misc": {"target_items": {"leather_boots": 3, "bow": 3, "purple_terracotta": 2}, "initial_inventory": {"rabbit_hide": 56, "acacia_log": 2, "string": 9, "terracotta": 10, "cornflower": 1, "rose_bush": 1, "warped_stem": 2, "flint": 4, "bone": 3}, "gold_trajectory": [{"action": "craft", "target": ["leather", 12], "ingredients": {"rabbit_hide": 48}, "result_count": 12}, {"action": "craft", "target": ["leather_boots", 3], "ingredients": {"leather": 12}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["bow", 3], "ingredients": {"stick": 9, "string": 9}, "result_count": 3}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_terracotta", 1], "ingredients": {"terracotta": 8, "purple_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x stone_brick_wall", "id": "textcraft.train.89", "max_steps": 50, "misc": {"target_items": {"stone_brick_wall": 3}, "initial_inventory": {"stone": 11, "lilac": 5, "scute": 4, "azure_bluet": 5, "smooth_red_sandstone": 2}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["stone_brick_wall", 1], "ingredients": {"stone_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x cyan_stained_glass", "id": "textcraft.train.90", "max_steps": 50, "misc": {"target_items": {"cyan_stained_glass": 2}, "initial_inventory": {"glass": 9, "cornflower": 2, "green_dye": 1, "lily_of_the_valley": 3, "sand": 1, "smooth_sandstone": 3, "jungle_log": 3, "ink_sac": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_stained_glass", 1], "ingredients": {"glass": 8, "cyan_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x light_blue_stained_glass", "id": "textcraft.train.91", "max_steps": 50, "misc": {"target_items": {"light_blue_stained_glass": 1}, "initial_inventory": {"glass": 9, "cornflower": 2, "lily_of_the_valley": 2, "sand": 1, "egg": 3, "stripped_warped_stem": 1, "milk_bucket": 5, "smooth_quartz": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_stained_glass", 1], "ingredients": {"glass": 8, "light_blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x purple_concrete_powder, 3x blue_carpet", "id": "textcraft.train.92", "max_steps": 50, "misc": {"target_items": {"purple_concrete_powder": 1, "blue_carpet": 3}, "initial_inventory": {"cornflower": 2, "rose_bush": 2, "sand": 4, "gravel": 4, "string": 28, "spruce_log": 4, "flint": 1, "cooked_rabbit": 4, "peony": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_concrete_powder", 1], "ingredients": {"purple_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_carpet", 1], "ingredients": {"white_carpet": 8, "blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x lime_concrete_powder, 1x polished_granite_stairs, 2x sugar", "id": "textcraft.train.93", "max_steps": 50, "misc": {"target_items": {"lime_concrete_powder": 1, "polished_granite_stairs": 1, "sugar": 2}, "initial_inventory": {"green_dye": 1, "lily_of_the_valley": 2, "sand": 5, "gravel": 6, "cobblestone": 11, "quartz": 21, "sugar_cane": 3, "blaze_rod": 5, "baked_potato": 3, "smooth_quartz": 5, "prismarine_shard": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_concrete_powder", 1], "ingredients": {"lime_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["diorite", 4], "ingredients": {"cobblestone": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["granite", 8], "ingredients": {"diorite": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_granite", 2], "ingredients": {"granite": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_granite_stairs", 1], "ingredients": {"polished_granite": 6}, "result_count": 4}, {"action": "craft", "target": ["sugar", 2], "ingredients": {"sugar_cane": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x green_wool, 3x respawn_anchor, 1x stone_pickaxe", "id": "textcraft.train.94", "max_steps": 50, "misc": {"target_items": {"green_wool": 2, "respawn_anchor": 3, "stone_pickaxe": 1}, "initial_inventory": {"green_dye": 3, "string": 11, "crying_obsidian": 20, "glowstone_dust": 45, "blackstone": 3, "acacia_log": 2, "stone": 4, "oxeye_daisy": 1}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["green_wool", 2], "ingredients": {"green_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["glowstone", 9], "ingredients": {"glowstone_dust": 36}, "result_count": 9}, {"action": "craft", "target": ["respawn_anchor", 3], "ingredients": {"crying_obsidian": 18, "glowstone": 9}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_pickaxe", 1], "ingredients": {"stone": 3, "stick": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x lime_wool, 1x black_wool, 2x dark_prismarine_stairs", "id": "textcraft.train.95", "max_steps": 50, "misc": {"target_items": {"lime_wool": 2, "black_wool": 1, "dark_prismarine_stairs": 2}, "initial_inventory": {"green_dye": 1, "lily_of_the_valley": 2, "string": 15, "wither_rose": 7, "prismarine_shard": 51, "sugar_cane": 3, "rose_bush": 4, "melon_slice": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["lime_wool", 2], "ingredients": {"lime_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["black_wool", 1], "ingredients": {"black_dye": 1, "white_wool": 1}, "result_count": 1}, {"action": "craft", "target": ["black_dye", 6], "ingredients": {"wither_rose": 6}, "result_count": 6}, {"action": "craft", "target": ["dark_prismarine", 6], "ingredients": {"prismarine_shard": 48, "black_dye": 6}, "result_count": 6}, {"action": "craft", "target": ["dark_prismarine_stairs", 1], "ingredients": {"dark_prismarine": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x skull_banner_pattern, 2x dark_prismarine, 2x light_gray_dye", "id": "textcraft.train.96", "max_steps": 50, "misc": {"target_items": {"skull_banner_pattern": 3, "dark_prismarine": 2, "light_gray_dye": 2}, "initial_inventory": {"sugar_cane": 3, "wither_skeleton_skull": 3, "prismarine_shard": 23, "wither_rose": 3, "oxeye_daisy": 3, "vine": 2, "melon_slice": 3}, "gold_trajectory": [{"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["skull_banner_pattern", 3], "ingredients": {"paper": 3, "wither_skeleton_skull": 3}, "result_count": 3}, {"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["dark_prismarine", 2], "ingredients": {"prismarine_shard": 16, "black_dye": 2}, "result_count": 2}, {"action": "craft", "target": ["light_gray_dye", 2], "ingredients": {"oxeye_daisy": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x stone_sword, 1x spruce_fence, 2x carrot_on_a_stick", "id": "textcraft.train.97", "max_steps": 50, "misc": {"target_items": {"stone_sword": 3, "spruce_fence": 1, "carrot_on_a_stick": 2}, "initial_inventory": {"blackstone": 8, "acacia_log": 3, "spruce_log": 2, "string": 4, "carrot": 3, "rabbit_hide": 3, "milk_bucket": 4, "obsidian": 4, "dirt": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_sword", 3], "ingredients": {"blackstone": 6, "stick": 3}, "result_count": 3}, {"action": "craft", "target": ["spruce_planks", 1], "ingredients": {"spruce_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"spruce_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["spruce_planks", 1], "ingredients": {"spruce_log": 1}, "result_count": 4}, {"action": "craft", "target": ["spruce_fence", 1], "ingredients": {"spruce_planks": 4, "stick": 2}, "result_count": 3}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["fishing_rod", 2], "ingredients": {"stick": 6, "string": 4}, "result_count": 2}, {"action": "craft", "target": ["carrot_on_a_stick", 2], "ingredients": {"fishing_rod": 2, "carrot": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x sugar, 3x stone_brick_slab", "id": "textcraft.train.98", "max_steps": 50, "misc": {"target_items": {"sugar": 1, "stone_brick_slab": 3}, "initial_inventory": {"sugar_cane": 2, "stone": 6, "nether_wart": 2, "lily_of_the_valley": 1}, "gold_trajectory": [{"action": "craft", "target": ["sugar", 1], "ingredients": {"sugar_cane": 1}, "result_count": 1}, {"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["stone_brick_slab", 1], "ingredients": {"stone_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x white_stained_glass", "id": "textcraft.train.99", "max_steps": 50, "misc": {"target_items": {"white_stained_glass": 1}, "initial_inventory": {"glass": 9, "lily_of_the_valley": 2, "birch_log": 4, "nether_brick": 5, "baked_potato": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_stained_glass", 1], "ingredients": {"glass": 8, "white_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x mossy_cobblestone_wall, 3x grindstone", "id": "textcraft.train.100", "max_steps": 50, "misc": {"target_items": {"mossy_cobblestone_wall": 3, "grindstone": 3}, "initial_inventory": {"cobblestone": 6, "vine": 6, "acacia_log": 4, "stone": 4, "ink_sac": 4, "wither_skeleton_skull": 2}, "gold_trajectory": [{"action": "craft", "target": ["mossy_cobblestone", 6], "ingredients": {"cobblestone": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_cobblestone_wall", 1], "ingredients": {"mossy_cobblestone": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["stone_slab", 1], "ingredients": {"stone": 3}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["grindstone", 3], "ingredients": {"stick": 6, "stone_slab": 3, "acacia_planks": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x carrot_on_a_stick, 2x orange_banner", "id": "textcraft.train.101", "max_steps": 50, "misc": {"target_items": {"carrot_on_a_stick": 1, "orange_banner": 2}, "initial_inventory": {"acacia_log": 2, "string": 64, "carrot": 2, "orange_tulip": 14, "jungle_log": 1, "ender_pearl": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["fishing_rod", 1], "ingredients": {"stick": 3, "string": 2}, "result_count": 1}, {"action": "craft", "target": ["carrot_on_a_stick", 1], "ingredients": {"fishing_rod": 1, "carrot": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_dye", 12], "ingredients": {"orange_tulip": 12}, "result_count": 12}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["orange_wool", 12], "ingredients": {"orange_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["orange_banner", 2], "ingredients": {"orange_wool": 12, "stick": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x lime_wool", "id": "textcraft.train.102", "max_steps": 50, "misc": {"target_items": {"lime_wool": 3}, "initial_inventory": {"green_dye": 3, "lily_of_the_valley": 3, "string": 13, "melon_slice": 2, "ghast_tear": 5, "sugar_cane": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 2], "ingredients": {"lily_of_the_valley": 2}, "result_count": 2}, {"action": "craft", "target": ["lime_dye", 2], "ingredients": {"green_dye": 2, "white_dye": 2}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["lime_wool", 3], "ingredients": {"lime_dye": 3, "white_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x mossy_stone_brick_slab, 2x polished_blackstone_wall", "id": "textcraft.train.103", "max_steps": 50, "misc": {"target_items": {"mossy_stone_brick_slab": 1, "polished_blackstone_wall": 2}, "initial_inventory": {"stone": 6, "vine": 4, "blackstone": 10, "birch_log": 1, "baked_potato": 4, "ghast_tear": 3, "feather": 2}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["mossy_stone_bricks", 3], "ingredients": {"stone_bricks": 3, "vine": 3}, "result_count": 3}, {"action": "craft", "target": ["mossy_stone_brick_slab", 1], "ingredients": {"mossy_stone_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_wall", 1], "ingredients": {"polished_blackstone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x lever, 1x brown_concrete_powder", "id": "textcraft.train.104", "max_steps": 50, "misc": {"target_items": {"lever": 3, "brown_concrete_powder": 1}, "initial_inventory": {"acacia_log": 2, "cobblestone": 4, "cocoa_beans": 1, "sand": 6, "gravel": 5, "spider_eye": 4, "spruce_log": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["lever", 3], "ingredients": {"stick": 3, "cobblestone": 3}, "result_count": 3}, {"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_concrete_powder", 1], "ingredients": {"brown_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x wooden_hoe, 1x red_nether_brick_wall", "id": "textcraft.train.105", "max_steps": 50, "misc": {"target_items": {"wooden_hoe": 3, "red_nether_brick_wall": 1}, "initial_inventory": {"acacia_log": 4, "nether_brick": 18, "nether_wart": 14, "sunflower": 1, "warped_fungus": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["wooden_hoe", 3], "ingredients": {"acacia_planks": 6, "stick": 6}, "result_count": 3}, {"action": "craft", "target": ["red_nether_bricks", 6], "ingredients": {"nether_brick": 12, "nether_wart": 12}, "result_count": 6}, {"action": "craft", "target": ["red_nether_brick_wall", 1], "ingredients": {"red_nether_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x pumpkin_pie", "id": "textcraft.train.106", "max_steps": 50, "misc": {"target_items": {"pumpkin_pie": 1}, "initial_inventory": {"pumpkin": 2, "sugar_cane": 2, "egg": 1, "popped_chorus_fruit": 2, "feather": 3, "creeper_head": 3}, "gold_trajectory": [{"action": "craft", "target": ["sugar", 1], "ingredients": {"sugar_cane": 1}, "result_count": 1}, {"action": "craft", "target": ["pumpkin_pie", 1], "ingredients": {"pumpkin": 1, "sugar": 1, "egg": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x light_blue_stained_glass", "id": "textcraft.train.107", "max_steps": 50, "misc": {"target_items": {"light_blue_stained_glass": 3}, "initial_inventory": {"glass": 9, "cornflower": 2, "lily_of_the_valley": 1, "pink_tulip": 3, "wither_rose": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_stained_glass", 1], "ingredients": {"glass": 8, "light_blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x light_blue_stained_glass, 2x andesite_wall, 1x ender_chest", "id": "textcraft.train.108", "max_steps": 50, "misc": {"target_items": {"light_blue_stained_glass": 1, "andesite_wall": 2, "ender_chest": 1}, "initial_inventory": {"glass": 8, "cornflower": 1, "lily_of_the_valley": 2, "cobblestone": 9, "quartz": 5, "obsidian": 9, "ender_pearl": 2, "blaze_rod": 1, "terracotta": 5, "white_tulip": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_stained_glass", 1], "ingredients": {"glass": 8, "light_blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 3], "ingredients": {"diorite": 3, "cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["andesite_wall", 1], "ingredients": {"andesite": 6}, "result_count": 6}, {"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["ender_eye", 1], "ingredients": {"ender_pearl": 1, "blaze_powder": 1}, "result_count": 1}, {"action": "craft", "target": ["ender_chest", 1], "ingredients": {"obsidian": 8, "ender_eye": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x granite_stairs", "id": "textcraft.train.109", "max_steps": 50, "misc": {"target_items": {"granite_stairs": 1}, "initial_inventory": {"cobblestone": 6, "quartz": 16, "sugar_cane": 4, "lily_of_the_valley": 2, "honeycomb": 3, "ice": 1}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_stairs", 1], "ingredients": {"granite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x dark_prismarine_slab, 1x armor_stand, 3x white_bed", "id": "textcraft.train.110", "max_steps": 50, "misc": {"target_items": {"dark_prismarine_slab": 3, "armor_stand": 1, "white_bed": 3}, "initial_inventory": {"prismarine_shard": 28, "wither_rose": 3, "acacia_log": 6, "smooth_stone": 3, "string": 48, "ice": 1, "enchanted_golden_apple": 4, "red_tulip": 1}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 3], "ingredients": {"wither_rose": 3}, "result_count": 3}, {"action": "craft", "target": ["dark_prismarine", 3], "ingredients": {"prismarine_shard": 24, "black_dye": 3}, "result_count": 3}, {"action": "craft", "target": ["dark_prismarine_slab", 1], "ingredients": {"dark_prismarine": 3}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["smooth_stone_slab", 1], "ingredients": {"smooth_stone": 3}, "result_count": 6}, {"action": "craft", "target": ["armor_stand", 1], "ingredients": {"stick": 6, "smooth_stone_slab": 1}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 9], "ingredients": {"string": 36}, "result_count": 9}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["white_bed", 3], "ingredients": {"white_wool": 9, "acacia_planks": 9}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x writable_book", "id": "textcraft.train.111", "max_steps": 50, "misc": {"target_items": {"writable_book": 3}, "initial_inventory": {"sugar_cane": 12, "rabbit_hide": 14, "ink_sac": 3, "feather": 4, "warped_stem": 5, "terracotta": 1}, "gold_trajectory": [{"action": "craft", "target": ["paper", 3], "ingredients": {"sugar_cane": 9}, "result_count": 9}, {"action": "craft", "target": ["leather", 3], "ingredients": {"rabbit_hide": 12}, "result_count": 3}, {"action": "craft", "target": ["book", 3], "ingredients": {"paper": 9, "leather": 3}, "result_count": 3}, {"action": "craft", "target": ["writable_book", 3], "ingredients": {"book": 3, "ink_sac": 3, "feather": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x yellow_wool, 2x black_concrete_powder", "id": "textcraft.train.112", "max_steps": 50, "misc": {"target_items": {"yellow_wool": 1, "black_concrete_powder": 2}, "initial_inventory": {"dandelion": 2, "string": 6, "wither_rose": 2, "sand": 5, "gravel": 6, "azure_bluet": 5, "stripped_dark_oak_log": 5, "basalt": 3, "nether_star": 1}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["yellow_wool", 1], "ingredients": {"yellow_dye": 1, "white_wool": 1}, "result_count": 1}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_concrete_powder", 1], "ingredients": {"black_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x granite", "id": "textcraft.train.113", "max_steps": 50, "misc": {"target_items": {"granite": 3}, "initial_inventory": {"cobblestone": 4, "quartz": 8, "dandelion": 1, "green_dye": 1, "crimson_stem": 3}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 3], "ingredients": {"diorite": 3, "quartz": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x chiseled_stone_bricks, 1x polished_granite_stairs, 1x andesite", "id": "textcraft.train.114", "max_steps": 50, "misc": {"target_items": {"chiseled_stone_bricks": 1, "polished_granite_stairs": 1, "andesite": 1}, "initial_inventory": {"stone": 5, "cobblestone": 11, "quartz": 21, "stripped_oak_log": 1, "heart_of_the_sea": 1, "ink_sac": 4, "nautilus_shell": 3}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["stone_brick_slab", 1], "ingredients": {"stone_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_stone_bricks", 1], "ingredients": {"stone_brick_slab": 2}, "result_count": 1}, {"action": "craft", "target": ["diorite", 4], "ingredients": {"cobblestone": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["granite", 8], "ingredients": {"diorite": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_granite", 2], "ingredients": {"granite": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_granite_stairs", 1], "ingredients": {"polished_granite": 6}, "result_count": 4}, {"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["andesite", 1], "ingredients": {"diorite": 1, "cobblestone": 1}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x diorite_slab", "id": "textcraft.train.115", "max_steps": 50, "misc": {"target_items": {"diorite_slab": 3}, "initial_inventory": {"cobblestone": 4, "quartz": 5, "ghast_tear": 2, "stone": 3, "egg": 1, "dandelion": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["diorite_slab", 1], "ingredients": {"diorite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x lime_dye", "id": "textcraft.train.116", "max_steps": 50, "misc": {"target_items": {"lime_dye": 2}, "initial_inventory": {"green_dye": 2, "lily_of_the_valley": 2, "pink_tulip": 3, "glowstone_dust": 3, "quartz": 1, "popped_chorus_fruit": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x orange_dye", "id": "textcraft.train.117", "max_steps": 50, "misc": {"target_items": {"orange_dye": 1}, "initial_inventory": {"orange_tulip": 1, "gravel": 4, "birch_log": 1, "nether_wart": 3}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x leather_boots", "id": "textcraft.train.118", "max_steps": 50, "misc": {"target_items": {"leather_boots": 2}, "initial_inventory": {"rabbit_hide": 33, "string": 4, "apple": 4, "gunpowder": 1}, "gold_trajectory": [{"action": "craft", "target": ["leather", 8], "ingredients": {"rabbit_hide": 32}, "result_count": 8}, {"action": "craft", "target": ["leather_boots", 2], "ingredients": {"leather": 8}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x chiseled_polished_blackstone, 3x red_concrete_powder", "id": "textcraft.train.119", "max_steps": 50, "misc": {"target_items": {"chiseled_polished_blackstone": 1, "red_concrete_powder": 3}, "initial_inventory": {"blackstone": 5, "rose_bush": 2, "sand": 6, "gravel": 4, "white_tulip": 5, "flint": 5, "allium": 4, "wither_skeleton_skull": 3}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_slab", 1], "ingredients": {"polished_blackstone": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_polished_blackstone", 1], "ingredients": {"polished_blackstone_slab": 2}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_concrete_powder", 1], "ingredients": {"red_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x blue_concrete_powder", "id": "textcraft.train.120", "max_steps": 50, "misc": {"target_items": {"blue_concrete_powder": 1}, "initial_inventory": {"cornflower": 1, "sand": 4, "gravel": 4, "warped_stem": 5, "red_mushroom": 1, "heart_of_the_sea": 5}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_concrete_powder", 1], "ingredients": {"blue_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x light_gray_dye, 2x granite_wall", "id": "textcraft.train.121", "max_steps": 50, "misc": {"target_items": {"light_gray_dye": 3, "granite_wall": 2}, "initial_inventory": {"oxeye_daisy": 3, "cobblestone": 8, "quartz": 13, "nether_star": 3, "stripped_crimson_stem": 2}, "gold_trajectory": [{"action": "craft", "target": ["light_gray_dye", 3], "ingredients": {"oxeye_daisy": 3}, "result_count": 3}, {"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_wall", 1], "ingredients": {"granite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x bookshelf, 1x polished_andesite_stairs", "id": "textcraft.train.122", "max_steps": 50, "misc": {"target_items": {"bookshelf": 3, "polished_andesite_stairs": 1}, "initial_inventory": {"acacia_log": 5, "sugar_cane": 32, "rabbit_hide": 46, "cobblestone": 9, "quartz": 6, "vine": 3, "glowstone_dust": 1}, "gold_trajectory": [{"action": "craft", "target": ["paper", 9], "ingredients": {"sugar_cane": 27}, "result_count": 27}, {"action": "craft", "target": ["leather", 9], "ingredients": {"rabbit_hide": 36}, "result_count": 9}, {"action": "craft", "target": ["book", 9], "ingredients": {"paper": 27, "leather": 9}, "result_count": 9}, {"action": "craft", "target": ["acacia_planks", 5], "ingredients": {"acacia_log": 5}, "result_count": 20}, {"action": "craft", "target": ["bookshelf", 3], "ingredients": {"acacia_planks": 18, "book": 9}, "result_count": 3}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 4], "ingredients": {"diorite": 4, "cobblestone": 4}, "result_count": 8}, {"action": "craft", "target": ["polished_andesite", 2], "ingredients": {"andesite": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_andesite_stairs", 1], "ingredients": {"polished_andesite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x respawn_anchor, 1x fire_charge", "id": "textcraft.train.123", "max_steps": 50, "misc": {"target_items": {"respawn_anchor": 3, "fire_charge": 1}, "initial_inventory": {"crying_obsidian": 23, "glowstone_dust": 44, "gunpowder": 1, "blaze_rod": 1, "red_tulip": 4, "cobblestone": 4}, "gold_trajectory": [{"action": "craft", "target": ["glowstone", 9], "ingredients": {"glowstone_dust": 36}, "result_count": 9}, {"action": "craft", "target": ["respawn_anchor", 3], "ingredients": {"crying_obsidian": 18, "glowstone": 9}, "result_count": 3}, {"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["fire_charge", 1], "ingredients": {"gunpowder": 1, "blaze_powder": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x jungle_fence_gate", "id": "textcraft.train.124", "max_steps": 50, "misc": {"target_items": {"jungle_fence_gate": 1}, "initial_inventory": {"acacia_log": 2, "jungle_log": 2, "bone": 3, "cooked_rabbit": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["jungle_fence_gate", 1], "ingredients": {"stick": 4, "jungle_planks": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x polished_blackstone_button", "id": "textcraft.train.125", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_button": 3}, "initial_inventory": {"blackstone": 4, "milk_bucket": 5, "red_mushroom": 1, "blaze_rod": 2, "red_sand": 4}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_button", 3], "ingredients": {"polished_blackstone": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x pink_stained_glass", "id": "textcraft.train.126", "max_steps": 50, "misc": {"target_items": {"pink_stained_glass": 1}, "initial_inventory": {"glass": 10, "pink_tulip": 1, "orange_tulip": 5, "apple": 5, "stripped_birch_log": 3}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_stained_glass", 1], "ingredients": {"glass": 8, "pink_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x lime_dye, 2x ladder", "id": "textcraft.train.127", "max_steps": 50, "misc": {"target_items": {"lime_dye": 1, "ladder": 2}, "initial_inventory": {"green_dye": 2, "lily_of_the_valley": 1, "acacia_log": 1, "smooth_sandstone": 4, "egg": 3, "scute": 5, "red_mushroom": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["ladder", 1], "ingredients": {"stick": 7}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x spectral_arrow", "id": "textcraft.train.128", "max_steps": 50, "misc": {"target_items": {"spectral_arrow": 1}, "initial_inventory": {"glowstone_dust": 4, "flint": 2, "acacia_log": 1, "feather": 2, "nether_star": 4, "bamboo": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}, {"action": "craft", "target": ["spectral_arrow", 1], "ingredients": {"glowstone_dust": 4, "arrow": 1}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x yellow_banner", "id": "textcraft.train.129", "max_steps": 50, "misc": {"target_items": {"yellow_banner": 2}, "initial_inventory": {"dandelion": 15, "string": 56, "acacia_log": 1, "white_tulip": 1, "basalt": 1, "azure_bluet": 3, "wither_skeleton_skull": 4}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 12], "ingredients": {"dandelion": 12}, "result_count": 12}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["yellow_wool", 12], "ingredients": {"yellow_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["yellow_banner", 2], "ingredients": {"yellow_wool": 12, "stick": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x red_terracotta", "id": "textcraft.train.130", "max_steps": 50, "misc": {"target_items": {"red_terracotta": 1}, "initial_inventory": {"terracotta": 9, "rose_bush": 1, "stripped_crimson_stem": 1, "cocoa_beans": 1, "pumpkin": 4}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_terracotta", 1], "ingredients": {"terracotta": 8, "red_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x cyan_terracotta, 1x brick_stairs, 3x andesite_slab", "id": "textcraft.train.131", "max_steps": 50, "misc": {"target_items": {"cyan_terracotta": 1, "brick_stairs": 1, "andesite_slab": 3}, "initial_inventory": {"terracotta": 12, "cornflower": 1, "green_dye": 1, "brick": 33, "cobblestone": 4, "quartz": 3, "orange_tulip": 3, "red_tulip": 4, "string": 5, "bamboo": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_terracotta", 1], "ingredients": {"terracotta": 8, "cyan_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_stairs", 1], "ingredients": {"bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["andesite", 2], "ingredients": {"diorite": 2, "cobblestone": 2}, "result_count": 4}, {"action": "craft", "target": ["andesite_slab", 1], "ingredients": {"andesite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x orange_bed", "id": "textcraft.train.132", "max_steps": 50, "misc": {"target_items": {"orange_bed": 2}, "initial_inventory": {"orange_tulip": 7, "string": 33, "acacia_log": 3, "glass": 3, "prismarine_shard": 2}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 6], "ingredients": {"orange_tulip": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["orange_wool", 6], "ingredients": {"orange_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["orange_bed", 2], "ingredients": {"orange_wool": 6, "acacia_planks": 6}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x wooden_hoe", "id": "textcraft.train.133", "max_steps": 50, "misc": {"target_items": {"wooden_hoe": 2}, "initial_inventory": {"acacia_log": 3, "jungle_planks": 5, "quartz": 2, "netherite_scrap": 4}, "gold_trajectory": [{"action": "craft", "target": ["stick", 1], "ingredients": {"jungle_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_hoe", 2], "ingredients": {"acacia_planks": 4, "stick": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x white_concrete_powder", "id": "textcraft.train.134", "max_steps": 50, "misc": {"target_items": {"white_concrete_powder": 1}, "initial_inventory": {"lily_of_the_valley": 1, "sand": 4, "gravel": 4, "carved_pumpkin": 3, "vine": 2, "peony": 3, "crimson_stem": 5, "glass": 1}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_concrete_powder", 1], "ingredients": {"white_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x acacia_fence_gate", "id": "textcraft.train.135", "max_steps": 50, "misc": {"target_items": {"acacia_fence_gate": 3}, "initial_inventory": {"acacia_log": 6, "sugar_cane": 2, "stripped_birch_log": 1, "brick": 1, "red_tulip": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["acacia_fence_gate", 3], "ingredients": {"stick": 12, "acacia_planks": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x brown_stained_glass_pane", "id": "textcraft.train.136", "max_steps": 50, "misc": {"target_items": {"brown_stained_glass_pane": 1}, "initial_inventory": {"glass": 9, "cocoa_beans": 1, "spruce_log": 4, "birch_log": 1, "ender_pearl": 1}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_stained_glass", 1], "ingredients": {"glass": 8, "brown_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["brown_stained_glass_pane", 1], "ingredients": {"brown_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 2x white_stained_glass, 2x polished_blackstone_brick_wall, 2x diorite_wall", "id": "textcraft.train.137", "max_steps": 50, "misc": {"target_items": {"white_stained_glass": 2, "polished_blackstone_brick_wall": 2, "diorite_wall": 2}, "initial_inventory": {"glass": 11, "lily_of_the_valley": 2, "blackstone": 9, "cobblestone": 9, "quartz": 8, "shulker_shell": 1, "smooth_sandstone": 5, "scute": 3, "brown_mushroom": 5, "red_sand": 3}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_stained_glass", 1], "ingredients": {"glass": 8, "white_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_bricks", 2], "ingredients": {"polished_blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_brick_wall", 1], "ingredients": {"polished_blackstone_bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_wall", 1], "ingredients": {"diorite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x white_carpet, 1x cut_sandstone", "id": "textcraft.train.138", "max_steps": 50, "misc": {"target_items": {"white_carpet": 2, "cut_sandstone": 1}, "initial_inventory": {"string": 10, "sand": 20, "peony": 3, "feather": 3, "allium": 2, "dandelion": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["white_carpet", 1], "ingredients": {"white_wool": 2}, "result_count": 3}, {"action": "craft", "target": ["sandstone", 4], "ingredients": {"sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_sandstone", 1], "ingredients": {"sandstone": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x dark_prismarine_slab", "id": "textcraft.train.139", "max_steps": 50, "misc": {"target_items": {"dark_prismarine_slab": 2}, "initial_inventory": {"prismarine_shard": 34, "wither_rose": 4, "apple": 1, "feather": 4, "smooth_red_sandstone": 3}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 3], "ingredients": {"wither_rose": 3}, "result_count": 3}, {"action": "craft", "target": ["dark_prismarine", 3], "ingredients": {"prismarine_shard": 24, "black_dye": 3}, "result_count": 3}, {"action": "craft", "target": ["dark_prismarine_slab", 1], "ingredients": {"dark_prismarine": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x black_carpet, 1x writable_book", "id": "textcraft.train.140", "max_steps": 50, "misc": {"target_items": {"black_carpet": 3, "writable_book": 1}, "initial_inventory": {"wither_rose": 2, "string": 10, "sugar_cane": 3, "rabbit_hide": 6, "ink_sac": 2, "feather": 2, "cooked_rabbit": 5, "lilac": 3, "end_stone": 4, "stripped_crimson_stem": 3}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["black_wool", 2], "ingredients": {"black_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["black_carpet", 1], "ingredients": {"black_wool": 2}, "result_count": 3}, {"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["leather", 1], "ingredients": {"rabbit_hide": 4}, "result_count": 1}, {"action": "craft", "target": ["book", 1], "ingredients": {"paper": 3, "leather": 1}, "result_count": 1}, {"action": "craft", "target": ["writable_book", 1], "ingredients": {"book": 1, "ink_sac": 1, "feather": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x spruce_fence", "id": "textcraft.train.141", "max_steps": 50, "misc": {"target_items": {"spruce_fence": 1}, "initial_inventory": {"spruce_log": 2, "acacia_log": 1, "obsidian": 4, "stripped_oak_log": 4, "green_dye": 4}, "gold_trajectory": [{"action": "craft", "target": ["spruce_planks", 1], "ingredients": {"spruce_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"spruce_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["spruce_planks", 1], "ingredients": {"spruce_log": 1}, "result_count": 4}, {"action": "craft", "target": ["spruce_fence", 1], "ingredients": {"spruce_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x brick_slab, 3x pink_terracotta", "id": "textcraft.train.142", "max_steps": 50, "misc": {"target_items": {"brick_slab": 1, "pink_terracotta": 3}, "initial_inventory": {"brick": 13, "terracotta": 10, "pink_tulip": 1, "prismarine_crystals": 5, "allium": 1, "nether_wart": 1, "warped_fungus": 2}, "gold_trajectory": [{"action": "craft", "target": ["bricks", 3], "ingredients": {"brick": 12}, "result_count": 3}, {"action": "craft", "target": ["brick_slab", 1], "ingredients": {"bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_terracotta", 1], "ingredients": {"terracotta": 8, "pink_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x brick_slab", "id": "textcraft.train.143", "max_steps": 50, "misc": {"target_items": {"brick_slab": 3}, "initial_inventory": {"brick": 16, "cooked_rabbit": 1, "sunflower": 3, "smooth_red_sandstone": 4, "cobblestone": 5}, "gold_trajectory": [{"action": "craft", "target": ["bricks", 3], "ingredients": {"brick": 12}, "result_count": 3}, {"action": "craft", "target": ["brick_slab", 1], "ingredients": {"bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x orange_wool", "id": "textcraft.train.144", "max_steps": 50, "misc": {"target_items": {"orange_wool": 3}, "initial_inventory": {"orange_tulip": 3, "string": 12, "stone": 1, "oxeye_daisy": 3, "beetroot": 5, "clay_ball": 1}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 3], "ingredients": {"orange_tulip": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["orange_wool", 3], "ingredients": {"orange_dye": 3, "white_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x armor_stand", "id": "textcraft.train.145", "max_steps": 50, "misc": {"target_items": {"armor_stand": 1}, "initial_inventory": {"acacia_log": 2, "smooth_stone": 3, "vine": 4, "smooth_red_sandstone": 2, "sunflower": 5, "gunpowder": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["smooth_stone_slab", 1], "ingredients": {"smooth_stone": 3}, "result_count": 6}, {"action": "craft", "target": ["armor_stand", 1], "ingredients": {"stick": 6, "smooth_stone_slab": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x yellow_concrete_powder", "id": "textcraft.train.146", "max_steps": 50, "misc": {"target_items": {"yellow_concrete_powder": 1}, "initial_inventory": {"dandelion": 1, "sand": 5, "gravel": 6, "smooth_stone": 3, "stripped_birch_log": 4, "carved_pumpkin": 1}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_concrete_powder", 1], "ingredients": {"yellow_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x black_concrete_powder", "id": "textcraft.train.147", "max_steps": 50, "misc": {"target_items": {"black_concrete_powder": 2}, "initial_inventory": {"wither_rose": 2, "sand": 6, "gravel": 5, "nautilus_shell": 1, "end_stone": 1, "oak_log": 2, "scute": 2, "heart_of_the_sea": 3}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_concrete_powder", 1], "ingredients": {"black_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x prismarine_stairs, 1x magenta_dye", "id": "textcraft.train.148", "max_steps": 50, "misc": {"target_items": {"prismarine_stairs": 3, "magenta_dye": 1}, "initial_inventory": {"prismarine_shard": 29, "allium": 2, "dirt": 4, "green_dye": 4, "spruce_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["prismarine", 6], "ingredients": {"prismarine_shard": 24}, "result_count": 6}, {"action": "craft", "target": ["prismarine_stairs", 1], "ingredients": {"prismarine": 6}, "result_count": 4}, {"action": "craft", "target": ["magenta_dye", 1], "ingredients": {"allium": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x granite_wall, 2x brick_stairs", "id": "textcraft.train.149", "max_steps": 50, "misc": {"target_items": {"granite_wall": 2, "brick_stairs": 2}, "initial_inventory": {"cobblestone": 6, "quartz": 12, "brick": 28, "oak_log": 5, "beetroot": 5, "apple": 5, "cornflower": 3}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_wall", 1], "ingredients": {"granite": 6}, "result_count": 6}, {"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_stairs", 1], "ingredients": {"bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x polished_blackstone_button", "id": "textcraft.train.150", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_button": 2}, "initial_inventory": {"blackstone": 5, "heart_of_the_sea": 3, "carved_pumpkin": 5, "cornflower": 5}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_button", 2], "ingredients": {"polished_blackstone": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x lime_stained_glass, 2x polished_blackstone_bricks, 2x yellow_stained_glass_pane", "id": "textcraft.train.151", "max_steps": 50, "misc": {"target_items": {"lime_stained_glass": 1, "polished_blackstone_bricks": 2, "yellow_stained_glass_pane": 2}, "initial_inventory": {"glass": 21, "green_dye": 1, "lily_of_the_valley": 2, "blackstone": 5, "dandelion": 2, "gunpowder": 1, "sand": 4}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_stained_glass", 1], "ingredients": {"glass": 8, "lime_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_bricks", 1], "ingredients": {"polished_blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "yellow_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x granite_slab, 1x brown_wool", "id": "textcraft.train.152", "max_steps": 50, "misc": {"target_items": {"granite_slab": 3, "brown_wool": 1}, "initial_inventory": {"cobblestone": 4, "quartz": 9, "cocoa_beans": 1, "string": 6, "rose_bush": 3, "carved_pumpkin": 2, "smooth_stone": 3, "brown_mushroom": 5, "milk_bucket": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 3], "ingredients": {"diorite": 3, "quartz": 3}, "result_count": 3}, {"action": "craft", "target": ["granite_slab", 1], "ingredients": {"granite": 3}, "result_count": 6}, {"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["brown_wool", 1], "ingredients": {"brown_dye": 1, "white_wool": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x mossy_cobblestone_slab, 2x white_banner", "id": "textcraft.train.153", "max_steps": 50, "misc": {"target_items": {"mossy_cobblestone_slab": 1, "white_banner": 2}, "initial_inventory": {"cobblestone": 3, "vine": 3, "string": 72, "acacia_log": 2, "scute": 5, "stripped_spruce_log": 2, "gunpowder": 1, "rabbit_hide": 1, "stripped_warped_stem": 4}, "gold_trajectory": [{"action": "craft", "target": ["mossy_cobblestone", 3], "ingredients": {"cobblestone": 3, "vine": 3}, "result_count": 3}, {"action": "craft", "target": ["mossy_cobblestone_slab", 1], "ingredients": {"mossy_cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["white_banner", 2], "ingredients": {"white_wool": 12, "stick": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x cut_red_sandstone_slab, 3x polished_blackstone_slab, 1x red_concrete_powder", "id": "textcraft.train.154", "max_steps": 50, "misc": {"target_items": {"cut_red_sandstone_slab": 3, "polished_blackstone_slab": 3, "red_concrete_powder": 1}, "initial_inventory": {"red_sand": 18, "blackstone": 4, "rose_bush": 2, "sand": 6, "gravel": 6, "stripped_spruce_log": 4, "nether_brick": 5, "prismarine_shard": 2, "peony": 4}, "gold_trajectory": [{"action": "craft", "target": ["red_sandstone", 4], "ingredients": {"red_sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone", 1], "ingredients": {"red_sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone_slab", 1], "ingredients": {"cut_red_sandstone": 3}, "result_count": 6}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_slab", 1], "ingredients": {"polished_blackstone": 3}, "result_count": 6}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_concrete_powder", 1], "ingredients": {"red_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x wooden_shovel, 3x light_blue_stained_glass", "id": "textcraft.train.155", "max_steps": 50, "misc": {"target_items": {"wooden_shovel": 3, "light_blue_stained_glass": 3}, "initial_inventory": {"acacia_log": 2, "glass": 12, "cornflower": 2, "lily_of_the_valley": 1, "brown_mushroom": 4, "shulker_shell": 5, "poppy": 4, "nether_wart": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_shovel", 3], "ingredients": {"acacia_planks": 3, "stick": 6}, "result_count": 3}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_stained_glass", 1], "ingredients": {"glass": 8, "light_blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x quartz_bricks", "id": "textcraft.train.156", "max_steps": 50, "misc": {"target_items": {"quartz_bricks": 3}, "initial_inventory": {"quartz": 20, "prismarine_crystals": 5, "crying_obsidian": 3, "glowstone_dust": 1}, "gold_trajectory": [{"action": "craft", "target": ["quartz_block", 4], "ingredients": {"quartz": 16}, "result_count": 4}, {"action": "craft", "target": ["quartz_bricks", 1], "ingredients": {"quartz_block": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x wooden_pickaxe, 2x blue_concrete_powder, 1x book", "id": "textcraft.train.157", "max_steps": 50, "misc": {"target_items": {"wooden_pickaxe": 3, "blue_concrete_powder": 2, "book": 1}, "initial_inventory": {"acacia_log": 6, "cornflower": 2, "sand": 6, "gravel": 4, "sugar_cane": 3, "rabbit_hide": 6, "stripped_spruce_log": 2, "nether_brick": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["wooden_pickaxe", 3], "ingredients": {"acacia_planks": 9, "stick": 6}, "result_count": 3}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_concrete_powder", 1], "ingredients": {"blue_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["leather", 1], "ingredients": {"rabbit_hide": 4}, "result_count": 1}, {"action": "craft", "target": ["book", 1], "ingredients": {"paper": 3, "leather": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x oak_fence_gate, 1x cyan_stained_glass", "id": "textcraft.train.158", "max_steps": 50, "misc": {"target_items": {"oak_fence_gate": 1, "cyan_stained_glass": 1}, "initial_inventory": {"acacia_log": 1, "oak_log": 1, "glass": 9, "cornflower": 1, "green_dye": 2, "melon_slice": 5, "pink_tulip": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["oak_planks", 1], "ingredients": {"oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["oak_fence_gate", 1], "ingredients": {"stick": 4, "oak_planks": 2}, "result_count": 1}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_stained_glass", 1], "ingredients": {"glass": 8, "cyan_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x brown_wool, 1x ender_chest", "id": "textcraft.train.159", "max_steps": 50, "misc": {"target_items": {"brown_wool": 3, "ender_chest": 1}, "initial_inventory": {"cocoa_beans": 4, "string": 15, "obsidian": 11, "ender_pearl": 2, "blaze_rod": 2, "lily_of_the_valley": 1, "red_tulip": 1, "stripped_dark_oak_log": 1, "ice": 5, "terracotta": 5}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 3], "ingredients": {"cocoa_beans": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["brown_wool", 3], "ingredients": {"brown_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["ender_eye", 1], "ingredients": {"ender_pearl": 1, "blaze_powder": 1}, "result_count": 1}, {"action": "craft", "target": ["ender_chest", 1], "ingredients": {"obsidian": 8, "ender_eye": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x purple_concrete_powder, 3x white_stained_glass, 3x respawn_anchor", "id": "textcraft.train.160", "max_steps": 50, "misc": {"target_items": {"purple_concrete_powder": 3, "white_stained_glass": 3, "respawn_anchor": 3}, "initial_inventory": {"cornflower": 2, "rose_bush": 1, "sand": 5, "gravel": 6, "glass": 12, "lily_of_the_valley": 1, "crying_obsidian": 20, "glowstone_dust": 41, "obsidian": 3, "allium": 1, "lilac": 5}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_concrete_powder", 1], "ingredients": {"purple_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_stained_glass", 1], "ingredients": {"glass": 8, "white_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["glowstone", 9], "ingredients": {"glowstone_dust": 36}, "result_count": 9}, {"action": "craft", "target": ["respawn_anchor", 3], "ingredients": {"crying_obsidian": 18, "glowstone": 9}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x arrow", "id": "textcraft.train.161", "max_steps": 50, "misc": {"target_items": {"arrow": 2}, "initial_inventory": {"flint": 1, "acacia_log": 2, "feather": 1, "end_stone": 2, "apple": 5, "carrot": 3, "gravel": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x polished_granite_slab, 3x yellow_stained_glass_pane, 1x granite_stairs", "id": "textcraft.train.162", "max_steps": 50, "misc": {"target_items": {"polished_granite_slab": 2, "yellow_stained_glass_pane": 3, "granite_stairs": 1}, "initial_inventory": {"cobblestone": 11, "quartz": 25, "glass": 9, "dandelion": 2, "obsidian": 3, "prismarine_shard": 5, "basalt": 5, "white_tulip": 3}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 4], "ingredients": {"diorite": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite", 1], "ingredients": {"granite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite_slab", 1], "ingredients": {"polished_granite": 3}, "result_count": 6}, {"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "yellow_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_stairs", 1], "ingredients": {"granite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x blue_wool", "id": "textcraft.train.163", "max_steps": 50, "misc": {"target_items": {"blue_wool": 2}, "initial_inventory": {"cornflower": 3, "string": 9, "glass": 2, "beetroot": 5, "cobblestone": 3, "baked_potato": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["blue_wool", 2], "ingredients": {"blue_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x yellow_concrete_powder, 3x brown_carpet, 1x leather_chestplate", "id": "textcraft.train.164", "max_steps": 50, "misc": {"target_items": {"yellow_concrete_powder": 2, "brown_carpet": 3, "leather_chestplate": 1}, "initial_inventory": {"dandelion": 1, "sand": 6, "gravel": 6, "cocoa_beans": 2, "string": 12, "rabbit_hide": 36, "creeper_head": 2, "white_tulip": 5, "scute": 2, "nautilus_shell": 4}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_concrete_powder", 1], "ingredients": {"yellow_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["brown_dye", 2], "ingredients": {"cocoa_beans": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["brown_wool", 2], "ingredients": {"brown_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["brown_carpet", 1], "ingredients": {"brown_wool": 2}, "result_count": 3}, {"action": "craft", "target": ["leather", 8], "ingredients": {"rabbit_hide": 32}, "result_count": 8}, {"action": "craft", "target": ["leather_chestplate", 1], "ingredients": {"leather": 8}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x birch_fence_gate", "id": "textcraft.train.165", "max_steps": 50, "misc": {"target_items": {"birch_fence_gate": 2}, "initial_inventory": {"acacia_log": 1, "birch_log": 1, "blue_orchid": 2, "sunflower": 2, "dandelion": 3, "red_tulip": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["birch_planks", 1], "ingredients": {"birch_log": 1}, "result_count": 4}, {"action": "craft", "target": ["birch_fence_gate", 2], "ingredients": {"stick": 8, "birch_planks": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x gray_dye", "id": "textcraft.train.166", "max_steps": 50, "misc": {"target_items": {"gray_dye": 1}, "initial_inventory": {"wither_rose": 1, "lily_of_the_valley": 1, "string": 2, "ghast_tear": 2}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x blue_stained_glass_pane", "id": "textcraft.train.167", "max_steps": 50, "misc": {"target_items": {"blue_stained_glass_pane": 2}, "initial_inventory": {"glass": 11, "cornflower": 1, "oxeye_daisy": 4, "stripped_crimson_stem": 1, "warped_stem": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_stained_glass", 1], "ingredients": {"glass": 8, "blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["blue_stained_glass_pane", 1], "ingredients": {"blue_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 3x pink_terracotta", "id": "textcraft.train.168", "max_steps": 50, "misc": {"target_items": {"pink_terracotta": 3}, "initial_inventory": {"terracotta": 8, "pink_tulip": 1, "oxeye_daisy": 2, "prismarine_shard": 3}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_terracotta", 1], "ingredients": {"terracotta": 8, "pink_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x painting", "id": "textcraft.train.169", "max_steps": 50, "misc": {"target_items": {"painting": 3}, "initial_inventory": {"acacia_log": 4, "wither_rose": 4, "string": 14, "ender_pearl": 4, "nautilus_shell": 2, "scute": 1, "dark_oak_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["stick", 6], "ingredients": {"acacia_planks": 12}, "result_count": 24}, {"action": "craft", "target": ["black_dye", 3], "ingredients": {"wither_rose": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["black_wool", 3], "ingredients": {"black_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["painting", 3], "ingredients": {"stick": 24, "black_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x mossy_stone_brick_stairs, 3x granite_stairs", "id": "textcraft.train.170", "max_steps": 50, "misc": {"target_items": {"mossy_stone_brick_stairs": 1, "granite_stairs": 3}, "initial_inventory": {"stone": 11, "vine": 8, "cobblestone": 6, "quartz": 13, "stripped_oak_log": 1, "egg": 2, "bamboo": 5, "blaze_rod": 1, "terracotta": 3}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["mossy_stone_bricks", 6], "ingredients": {"stone_bricks": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_stone_brick_stairs", 1], "ingredients": {"mossy_stone_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_stairs", 1], "ingredients": {"granite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x painting", "id": "textcraft.train.171", "max_steps": 50, "misc": {"target_items": {"painting": 1}, "initial_inventory": {"acacia_log": 1, "wither_rose": 2, "string": 5, "stone": 5, "ghast_tear": 2, "stripped_oak_log": 4, "jungle_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["black_wool", 1], "ingredients": {"black_dye": 1, "white_wool": 1}, "result_count": 1}, {"action": "craft", "target": ["painting", 1], "ingredients": {"stick": 8, "black_wool": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x yellow_stained_glass", "id": "textcraft.train.172", "max_steps": 50, "misc": {"target_items": {"yellow_stained_glass": 3}, "initial_inventory": {"glass": 10, "dandelion": 1, "milk_bucket": 5}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_stained_glass", 1], "ingredients": {"glass": 8, "yellow_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x prismarine_slab", "id": "textcraft.train.173", "max_steps": 50, "misc": {"target_items": {"prismarine_slab": 2}, "initial_inventory": {"prismarine_shard": 16, "stripped_birch_log": 2, "orange_tulip": 5}, "gold_trajectory": [{"action": "craft", "target": ["prismarine", 3], "ingredients": {"prismarine_shard": 12}, "result_count": 3}, {"action": "craft", "target": ["prismarine_slab", 1], "ingredients": {"prismarine": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x blue_carpet", "id": "textcraft.train.174", "max_steps": 50, "misc": {"target_items": {"blue_carpet": 1}, "initial_inventory": {"string": 32, "cornflower": 2, "dirt": 5, "blackstone": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_carpet", 1], "ingredients": {"white_carpet": 8, "blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x end_stone_brick_wall", "id": "textcraft.train.175", "max_steps": 50, "misc": {"target_items": {"end_stone_brick_wall": 3}, "initial_inventory": {"end_stone": 9, "lily_of_the_valley": 4, "gravel": 5, "stripped_dark_oak_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["end_stone_bricks", 2], "ingredients": {"end_stone": 8}, "result_count": 8}, {"action": "craft", "target": ["end_stone_brick_wall", 1], "ingredients": {"end_stone_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x yellow_banner, 2x fire_charge, 3x oak_sign", "id": "textcraft.train.176", "max_steps": 50, "misc": {"target_items": {"yellow_banner": 1, "fire_charge": 2, "oak_sign": 3}, "initial_inventory": {"dandelion": 8, "string": 25, "acacia_log": 2, "gunpowder": 2, "blaze_rod": 2, "oak_log": 3, "spruce_log": 2, "dark_oak_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 6], "ingredients": {"dandelion": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["yellow_wool", 6], "ingredients": {"yellow_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["yellow_banner", 1], "ingredients": {"yellow_wool": 6, "stick": 1}, "result_count": 1}, {"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["fire_charge", 1], "ingredients": {"gunpowder": 1, "blaze_powder": 1}, "result_count": 3}, {"action": "craft", "target": ["oak_planks", 2], "ingredients": {"oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["oak_sign", 1], "ingredients": {"oak_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x dark_oak_sign, 2x yellow_concrete_powder", "id": "textcraft.train.177", "max_steps": 50, "misc": {"target_items": {"dark_oak_sign": 2, "yellow_concrete_powder": 2}, "initial_inventory": {"dark_oak_log": 2, "acacia_log": 1, "dandelion": 1, "sand": 6, "gravel": 5, "wither_skeleton_skull": 1, "stripped_spruce_log": 3, "glass": 2, "smooth_stone": 1, "pink_tulip": 5}, "gold_trajectory": [{"action": "craft", "target": ["dark_oak_planks", 2], "ingredients": {"dark_oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"dark_oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_sign", 1], "ingredients": {"dark_oak_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_concrete_powder", 1], "ingredients": {"yellow_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x skull_banner_pattern, 1x leather_horse_armor", "id": "textcraft.train.178", "max_steps": 50, "misc": {"target_items": {"skull_banner_pattern": 2, "leather_horse_armor": 1}, "initial_inventory": {"sugar_cane": 4, "wither_skeleton_skull": 3, "rabbit_hide": 33, "peony": 4, "lilac": 5, "stripped_crimson_stem": 5, "pumpkin": 2, "end_stone": 3}, "gold_trajectory": [{"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["skull_banner_pattern", 2], "ingredients": {"paper": 2, "wither_skeleton_skull": 2}, "result_count": 2}, {"action": "craft", "target": ["leather", 7], "ingredients": {"rabbit_hide": 28}, "result_count": 7}, {"action": "craft", "target": ["leather_horse_armor", 1], "ingredients": {"leather": 7}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x polished_diorite_slab", "id": "textcraft.train.179", "max_steps": 50, "misc": {"target_items": {"polished_diorite_slab": 2}, "initial_inventory": {"cobblestone": 5, "quartz": 4, "nautilus_shell": 2, "bamboo": 1, "stripped_acacia_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite_slab", 1], "ingredients": {"polished_diorite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x jungle_sign, 3x purple_dye", "id": "textcraft.train.180", "max_steps": 50, "misc": {"target_items": {"jungle_sign": 3, "purple_dye": 3}, "initial_inventory": {"jungle_log": 3, "acacia_log": 2, "cornflower": 3, "rose_bush": 2, "glass": 1, "prismarine_shard": 2}, "gold_trajectory": [{"action": "craft", "target": ["jungle_planks", 2], "ingredients": {"jungle_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"jungle_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_sign", 1], "ingredients": {"jungle_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 2], "ingredients": {"blue_dye": 2, "red_dye": 2}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x black_bed, 3x brown_bed", "id": "textcraft.train.181", "max_steps": 50, "misc": {"target_items": {"black_bed": 3, "brown_bed": 3}, "initial_inventory": {"wither_rose": 12, "string": 100, "acacia_log": 6, "cocoa_beans": 4, "jungle_planks": 12, "cooked_rabbit": 3, "nether_brick": 5}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 9], "ingredients": {"wither_rose": 9}, "result_count": 9}, {"action": "craft", "target": ["white_wool", 9], "ingredients": {"string": 36}, "result_count": 9}, {"action": "craft", "target": ["black_wool", 9], "ingredients": {"black_dye": 9, "white_wool": 9}, "result_count": 9}, {"action": "craft", "target": ["black_bed", 3], "ingredients": {"black_wool": 9, "jungle_planks": 9}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 9], "ingredients": {"string": 36}, "result_count": 9}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["white_bed", 3], "ingredients": {"white_wool": 9, "tag:planks": 9}, "result_count": 3}, {"action": "craft", "target": ["brown_dye", 3], "ingredients": {"cocoa_beans": 3}, "result_count": 3}, {"action": "craft", "target": ["brown_bed", 3], "ingredients": {"white_bed": 3, "brown_dye": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x skull_banner_pattern", "id": "textcraft.train.182", "max_steps": 50, "misc": {"target_items": {"skull_banner_pattern": 1}, "initial_inventory": {"sugar_cane": 3, "wither_skeleton_skull": 1, "dark_oak_log": 1, "melon_slice": 2, "glass": 1, "end_stone": 1}, "gold_trajectory": [{"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["skull_banner_pattern", 1], "ingredients": {"paper": 1, "wither_skeleton_skull": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x red_nether_brick_wall, 2x pink_stained_glass", "id": "textcraft.train.183", "max_steps": 50, "misc": {"target_items": {"red_nether_brick_wall": 1, "pink_stained_glass": 2}, "initial_inventory": {"nether_brick": 16, "nether_wart": 18, "glass": 8, "pink_tulip": 1, "clay_ball": 2, "azure_bluet": 4, "nether_star": 2, "honeycomb": 3}, "gold_trajectory": [{"action": "craft", "target": ["red_nether_bricks", 6], "ingredients": {"nether_brick": 12, "nether_wart": 12}, "result_count": 6}, {"action": "craft", "target": ["red_nether_brick_wall", 1], "ingredients": {"red_nether_bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_stained_glass", 1], "ingredients": {"glass": 8, "pink_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x polished_diorite", "id": "textcraft.train.184", "max_steps": 50, "misc": {"target_items": {"polished_diorite": 1}, "initial_inventory": {"cobblestone": 6, "quartz": 5, "bamboo": 4, "wither_skeleton_skull": 3, "stripped_warped_stem": 4, "baked_potato": 5}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x blue_terracotta", "id": "textcraft.train.185", "max_steps": 50, "misc": {"target_items": {"blue_terracotta": 3}, "initial_inventory": {"terracotta": 11, "cornflower": 2, "sugar_cane": 4, "wither_skeleton_skull": 2, "egg": 4, "nether_star": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_terracotta", 1], "ingredients": {"terracotta": 8, "blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x cyan_dye", "id": "textcraft.train.186", "max_steps": 50, "misc": {"target_items": {"cyan_dye": 3}, "initial_inventory": {"cornflower": 2, "green_dye": 2, "brick": 3, "stripped_crimson_stem": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["cyan_dye", 2], "ingredients": {"blue_dye": 2, "green_dye": 2}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x mojang_banner_pattern, 2x leather_horse_armor", "id": "textcraft.train.187", "max_steps": 50, "misc": {"target_items": {"mojang_banner_pattern": 2, "leather_horse_armor": 2}, "initial_inventory": {"sugar_cane": 3, "enchanted_golden_apple": 3, "rabbit_hide": 58, "ghast_tear": 3, "ender_pearl": 4, "bone": 5}, "gold_trajectory": [{"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["mojang_banner_pattern", 2], "ingredients": {"paper": 2, "enchanted_golden_apple": 2}, "result_count": 2}, {"action": "craft", "target": ["leather", 14], "ingredients": {"rabbit_hide": 56}, "result_count": 14}, {"action": "craft", "target": ["leather_horse_armor", 2], "ingredients": {"leather": 14}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x brown_banner", "id": "textcraft.train.188", "max_steps": 50, "misc": {"target_items": {"brown_banner": 1}, "initial_inventory": {"cocoa_beans": 9, "string": 35, "acacia_log": 1, "bamboo": 4, "pumpkin": 3, "smooth_quartz": 2}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 6], "ingredients": {"cocoa_beans": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["brown_wool", 6], "ingredients": {"brown_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["brown_banner", 1], "ingredients": {"brown_wool": 6, "stick": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x leather_boots, 2x arrow, 2x blue_stained_glass", "id": "textcraft.train.189", "max_steps": 50, "misc": {"target_items": {"leather_boots": 1, "arrow": 2, "blue_stained_glass": 2}, "initial_inventory": {"rabbit_hide": 20, "flint": 1, "acacia_log": 2, "feather": 1, "glass": 9, "cornflower": 1, "stripped_oak_log": 4, "smooth_quartz": 1, "cooked_rabbit": 3}, "gold_trajectory": [{"action": "craft", "target": ["leather", 4], "ingredients": {"rabbit_hide": 16}, "result_count": 4}, {"action": "craft", "target": ["leather_boots", 1], "ingredients": {"leather": 4}, "result_count": 1}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_stained_glass", 1], "ingredients": {"glass": 8, "blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x fire_charge", "id": "textcraft.train.190", "max_steps": 50, "misc": {"target_items": {"fire_charge": 1}, "initial_inventory": {"gunpowder": 2, "blaze_rod": 1, "ink_sac": 1, "ghast_tear": 3, "ice": 2, "pink_tulip": 5}, "gold_trajectory": [{"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["fire_charge", 1], "ingredients": {"gunpowder": 1, "blaze_powder": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x blue_ice", "id": "textcraft.train.191", "max_steps": 50, "misc": {"target_items": {"blue_ice": 2}, "initial_inventory": {"ice": 191, "brown_mushroom": 3, "jungle_log": 2, "warped_stem": 4, "gravel": 2}, "gold_trajectory": [{"action": "craft", "target": ["packed_ice", 18], "ingredients": {"ice": 162}, "result_count": 18}, {"action": "craft", "target": ["blue_ice", 2], "ingredients": {"packed_ice": 18}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x black_concrete_powder, 2x torch", "id": "textcraft.train.192", "max_steps": 50, "misc": {"target_items": {"black_concrete_powder": 3, "torch": 2}, "initial_inventory": {"wither_rose": 2, "sand": 6, "gravel": 6, "acacia_log": 2, "white_tulip": 2, "wither_skeleton_skull": 3, "smooth_quartz": 4}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_concrete_powder", 1], "ingredients": {"black_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x ladder", "id": "textcraft.train.193", "max_steps": 50, "misc": {"target_items": {"ladder": 3}, "initial_inventory": {"acacia_log": 1, "stripped_crimson_stem": 2, "crying_obsidian": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["ladder", 1], "ingredients": {"stick": 7}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x cyan_wool", "id": "textcraft.train.194", "max_steps": 50, "misc": {"target_items": {"cyan_wool": 3}, "initial_inventory": {"cornflower": 2, "green_dye": 3, "string": 16, "blue_orchid": 1, "obsidian": 3, "rabbit_hide": 1, "cobblestone": 1, "netherite_scrap": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["cyan_dye", 2], "ingredients": {"blue_dye": 2, "green_dye": 2}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["cyan_wool", 3], "ingredients": {"cyan_dye": 3, "white_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x arrow", "id": "textcraft.train.195", "max_steps": 50, "misc": {"target_items": {"arrow": 2}, "initial_inventory": {"flint": 2, "acacia_log": 1, "feather": 2, "lily_of_the_valley": 5, "smooth_quartz": 3, "orange_tulip": 4, "apple": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x orange_banner", "id": "textcraft.train.196", "max_steps": 50, "misc": {"target_items": {"orange_banner": 3}, "initial_inventory": {"orange_tulip": 18, "string": 96, "acacia_log": 1, "rabbit_hide": 1, "lily_of_the_valley": 5, "white_tulip": 2, "smooth_quartz": 5}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 18], "ingredients": {"orange_tulip": 18}, "result_count": 18}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["orange_wool", 18], "ingredients": {"orange_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["orange_banner", 3], "ingredients": {"orange_wool": 18, "stick": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x purple_wool, 2x brown_stained_glass", "id": "textcraft.train.197", "max_steps": 50, "misc": {"target_items": {"purple_wool": 1, "brown_stained_glass": 2}, "initial_inventory": {"cornflower": 1, "rose_bush": 2, "string": 6, "glass": 8, "cocoa_beans": 2, "azure_bluet": 4, "stripped_spruce_log": 4, "ender_pearl": 2, "ink_sac": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["purple_wool", 1], "ingredients": {"purple_dye": 1, "white_wool": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_stained_glass", 1], "ingredients": {"glass": 8, "brown_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x purple_concrete_powder", "id": "textcraft.train.198", "max_steps": 50, "misc": {"target_items": {"purple_concrete_powder": 1}, "initial_inventory": {"cornflower": 1, "rose_bush": 1, "sand": 6, "gravel": 4, "oak_log": 3, "prismarine_shard": 1, "nether_star": 4, "bamboo": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_concrete_powder", 1], "ingredients": {"purple_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x respawn_anchor, 1x polished_blackstone_wall", "id": "textcraft.train.199", "max_steps": 50, "misc": {"target_items": {"respawn_anchor": 1, "polished_blackstone_wall": 1}, "initial_inventory": {"crying_obsidian": 8, "glowstone_dust": 16, "blackstone": 11, "prismarine_shard": 1, "oxeye_daisy": 5, "scute": 5}, "gold_trajectory": [{"action": "craft", "target": ["glowstone", 3], "ingredients": {"glowstone_dust": 12}, "result_count": 3}, {"action": "craft", "target": ["respawn_anchor", 1], "ingredients": {"crying_obsidian": 6, "glowstone": 3}, "result_count": 1}, {"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_wall", 1], "ingredients": {"polished_blackstone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x white_bed", "id": "textcraft.train.200", "max_steps": 50, "misc": {"target_items": {"white_bed": 1}, "initial_inventory": {"string": 18, "acacia_log": 2, "crimson_stem": 1, "terracotta": 4}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["white_bed", 1], "ingredients": {"white_wool": 3, "acacia_planks": 3}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x polished_blackstone_brick_slab, 1x warped_fence, 1x blue_bed", "id": "textcraft.train.201", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_brick_slab": 2, "warped_fence": 1, "blue_bed": 1}, "initial_inventory": {"blackstone": 5, "warped_stem": 2, "acacia_log": 2, "string": 15, "cornflower": 1, "carrot": 5, "stripped_dark_oak_log": 1, "lilac": 2, "stripped_spruce_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_bricks", 1], "ingredients": {"polished_blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_brick_slab", 1], "ingredients": {"polished_blackstone_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["warped_planks", 1], "ingredients": {"warped_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"warped_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["warped_planks", 1], "ingredients": {"warped_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["warped_fence", 1], "ingredients": {"warped_planks": 4, "stick": 2}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["white_bed", 1], "ingredients": {"white_wool": 3, "acacia_planks": 3}, "result_count": 1}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_bed", 1], "ingredients": {"white_bed": 1, "blue_dye": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x orange_wool, 2x black_concrete_powder, 2x prismarine_brick_stairs", "id": "textcraft.train.202", "max_steps": 50, "misc": {"target_items": {"orange_wool": 3, "black_concrete_powder": 2, "prismarine_brick_stairs": 2}, "initial_inventory": {"orange_tulip": 4, "string": 15, "wither_rose": 1, "sand": 4, "gravel": 5, "prismarine_shard": 75, "warped_fungus": 3, "enchanted_golden_apple": 5, "peony": 1}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 3], "ingredients": {"orange_tulip": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["orange_wool", 3], "ingredients": {"orange_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_concrete_powder", 1], "ingredients": {"black_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["prismarine_bricks", 6], "ingredients": {"prismarine_shard": 54}, "result_count": 6}, {"action": "craft", "target": ["prismarine_brick_stairs", 1], "ingredients": {"prismarine_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x end_stone_brick_wall, 3x blue_stained_glass, 3x leather_leggings", "id": "textcraft.train.203", "max_steps": 50, "misc": {"target_items": {"end_stone_brick_wall": 3, "blue_stained_glass": 3, "leather_leggings": 3}, "initial_inventory": {"end_stone": 9, "glass": 11, "cornflower": 1, "rabbit_hide": 120, "cocoa_beans": 3, "red_sand": 3, "glowstone_dust": 5}, "gold_trajectory": [{"action": "craft", "target": ["end_stone_bricks", 2], "ingredients": {"end_stone": 8}, "result_count": 8}, {"action": "craft", "target": ["end_stone_brick_wall", 1], "ingredients": {"end_stone_bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_stained_glass", 1], "ingredients": {"glass": 8, "blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["leather", 21], "ingredients": {"rabbit_hide": 84}, "result_count": 21}, {"action": "craft", "target": ["leather_leggings", 3], "ingredients": {"leather": 21}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x diorite_slab", "id": "textcraft.train.204", "max_steps": 50, "misc": {"target_items": {"diorite_slab": 3}, "initial_inventory": {"cobblestone": 4, "quartz": 6, "baked_potato": 3, "prismarine_shard": 5}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["diorite_slab", 1], "ingredients": {"diorite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x spectral_arrow", "id": "textcraft.train.205", "max_steps": 50, "misc": {"target_items": {"spectral_arrow": 3}, "initial_inventory": {"glowstone_dust": 12, "flint": 2, "acacia_log": 1, "feather": 1, "pumpkin": 1, "gravel": 1, "prismarine_shard": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}, {"action": "craft", "target": ["spectral_arrow", 2], "ingredients": {"glowstone_dust": 8, "arrow": 2}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x granite", "id": "textcraft.train.206", "max_steps": 50, "misc": {"target_items": {"granite": 3}, "initial_inventory": {"cobblestone": 5, "quartz": 9, "red_tulip": 4, "bamboo": 2, "creeper_head": 2}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 3], "ingredients": {"diorite": 3, "quartz": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x polished_andesite", "id": "textcraft.train.207", "max_steps": 50, "misc": {"target_items": {"polished_andesite": 2}, "initial_inventory": {"cobblestone": 4, "quartz": 3, "cornflower": 2, "prismarine_crystals": 2, "terracotta": 2, "jungle_log": 5, "carrot": 3}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["andesite", 2], "ingredients": {"diorite": 2, "cobblestone": 2}, "result_count": 4}, {"action": "craft", "target": ["polished_andesite", 1], "ingredients": {"andesite": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x prismarine_brick_stairs, 1x red_bed", "id": "textcraft.train.208", "max_steps": 50, "misc": {"target_items": {"prismarine_brick_stairs": 2, "red_bed": 1}, "initial_inventory": {"prismarine_shard": 73, "rose_bush": 3, "string": 17, "acacia_log": 2, "obsidian": 5, "milk_bucket": 5, "rabbit_hide": 1, "dandelion": 1, "glowstone_dust": 4}, "gold_trajectory": [{"action": "craft", "target": ["prismarine_bricks", 6], "ingredients": {"prismarine_shard": 54}, "result_count": 6}, {"action": "craft", "target": ["prismarine_brick_stairs", 1], "ingredients": {"prismarine_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["red_dye", 2], "ingredients": {"rose_bush": 2}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["red_wool", 3], "ingredients": {"red_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["red_bed", 1], "ingredients": {"red_wool": 3, "acacia_planks": 3}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x light_blue_terracotta", "id": "textcraft.train.209", "max_steps": 50, "misc": {"target_items": {"light_blue_terracotta": 3}, "initial_inventory": {"terracotta": 12, "cornflower": 2, "lily_of_the_valley": 1, "dandelion": 1, "allium": 3, "jungle_log": 4, "netherite_scrap": 3, "crimson_stem": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_terracotta", 1], "ingredients": {"terracotta": 8, "light_blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x jungle_fence_gate, 3x quartz_pillar", "id": "textcraft.train.210", "max_steps": 50, "misc": {"target_items": {"jungle_fence_gate": 1, "quartz_pillar": 3}, "initial_inventory": {"acacia_log": 1, "jungle_log": 2, "quartz": 23, "apple": 5, "dirt": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["jungle_fence_gate", 1], "ingredients": {"stick": 4, "jungle_planks": 2}, "result_count": 1}, {"action": "craft", "target": ["quartz_block", 4], "ingredients": {"quartz": 16}, "result_count": 4}, {"action": "craft", "target": ["quartz_pillar", 2], "ingredients": {"quartz_block": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x andesite, 2x yellow_bed, 2x purple_wool", "id": "textcraft.train.211", "max_steps": 50, "misc": {"target_items": {"andesite": 2, "yellow_bed": 2, "purple_wool": 2}, "initial_inventory": {"cobblestone": 3, "quartz": 2, "dandelion": 9, "string": 38, "acacia_log": 3, "cornflower": 1, "rose_bush": 2, "prismarine_shard": 2, "stone": 1, "egg": 1, "vine": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["andesite", 1], "ingredients": {"diorite": 1, "cobblestone": 1}, "result_count": 2}, {"action": "craft", "target": ["yellow_dye", 6], "ingredients": {"dandelion": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["yellow_wool", 6], "ingredients": {"yellow_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["yellow_bed", 2], "ingredients": {"yellow_wool": 6, "acacia_planks": 6}, "result_count": 2}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["purple_wool", 2], "ingredients": {"purple_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x brown_concrete_powder", "id": "textcraft.train.212", "max_steps": 50, "misc": {"target_items": {"brown_concrete_powder": 3}, "initial_inventory": {"cocoa_beans": 2, "sand": 4, "gravel": 5, "gunpowder": 5, "smooth_sandstone": 5, "enchanted_golden_apple": 2, "acacia_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_concrete_powder", 1], "ingredients": {"brown_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x brown_wool, 1x pink_concrete_powder, 1x cyan_dye", "id": "textcraft.train.213", "max_steps": 50, "misc": {"target_items": {"brown_wool": 1, "pink_concrete_powder": 1, "cyan_dye": 1}, "initial_inventory": {"cocoa_beans": 2, "string": 4, "pink_tulip": 1, "sand": 4, "gravel": 6, "cornflower": 2, "green_dye": 2, "carved_pumpkin": 1, "nether_brick": 2}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["brown_wool", 1], "ingredients": {"brown_dye": 1, "white_wool": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_concrete_powder", 1], "ingredients": {"pink_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x wooden_shovel", "id": "textcraft.train.214", "max_steps": 50, "misc": {"target_items": {"wooden_shovel": 2}, "initial_inventory": {"acacia_log": 2, "dark_oak_log": 5, "stripped_jungle_log": 1, "egg": 3, "smooth_quartz": 3, "oxeye_daisy": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["wooden_shovel", 2], "ingredients": {"acacia_planks": 2, "stick": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x brown_stained_glass_pane", "id": "textcraft.train.215", "max_steps": 50, "misc": {"target_items": {"brown_stained_glass_pane": 3}, "initial_inventory": {"glass": 12, "cocoa_beans": 1, "apple": 5, "vine": 3, "red_sand": 3, "stripped_birch_log": 5}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_stained_glass", 1], "ingredients": {"glass": 8, "brown_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["brown_stained_glass_pane", 1], "ingredients": {"brown_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 2x blue_stained_glass_pane", "id": "textcraft.train.216", "max_steps": 50, "misc": {"target_items": {"blue_stained_glass_pane": 2}, "initial_inventory": {"glass": 10, "cornflower": 2, "stripped_acacia_log": 2, "heart_of_the_sea": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_stained_glass", 1], "ingredients": {"glass": 8, "blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["blue_stained_glass_pane", 1], "ingredients": {"blue_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 3x yellow_terracotta, 1x acacia_fence_gate, 2x granite_slab", "id": "textcraft.train.217", "max_steps": 50, "misc": {"target_items": {"yellow_terracotta": 3, "acacia_fence_gate": 1, "granite_slab": 2}, "initial_inventory": {"terracotta": 9, "dandelion": 2, "acacia_log": 3, "cobblestone": 5, "quartz": 10, "netherite_scrap": 5}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_terracotta", 1], "ingredients": {"terracotta": 8, "yellow_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_fence_gate", 1], "ingredients": {"stick": 4, "acacia_planks": 2}, "result_count": 1}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 3], "ingredients": {"diorite": 3, "quartz": 3}, "result_count": 3}, {"action": "craft", "target": ["granite_slab", 1], "ingredients": {"granite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x leather_leggings, 1x jack_o_lantern, 1x polished_diorite_slab", "id": "textcraft.train.218", "max_steps": 50, "misc": {"target_items": {"leather_leggings": 3, "jack_o_lantern": 1, "polished_diorite_slab": 1}, "initial_inventory": {"rabbit_hide": 120, "carved_pumpkin": 2, "acacia_log": 2, "cobblestone": 4, "quartz": 4, "snowball": 3, "oxeye_daisy": 5, "cooked_rabbit": 5, "red_sand": 4}, "gold_trajectory": [{"action": "craft", "target": ["leather", 21], "ingredients": {"rabbit_hide": 84}, "result_count": 21}, {"action": "craft", "target": ["leather_leggings", 3], "ingredients": {"leather": 21}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}, {"action": "craft", "target": ["jack_o_lantern", 1], "ingredients": {"carved_pumpkin": 1, "torch": 1}, "result_count": 1}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite_slab", 1], "ingredients": {"polished_diorite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x orange_carpet, 1x cut_red_sandstone_slab, 2x black_wool", "id": "textcraft.train.219", "max_steps": 50, "misc": {"target_items": {"orange_carpet": 1, "cut_red_sandstone_slab": 1, "black_wool": 2}, "initial_inventory": {"string": 47, "orange_tulip": 2, "red_sand": 21, "wither_rose": 2, "dandelion": 2, "melon_slice": 1}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_carpet", 1], "ingredients": {"white_carpet": 8, "orange_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["red_sandstone", 4], "ingredients": {"red_sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone", 1], "ingredients": {"red_sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone_slab", 1], "ingredients": {"cut_red_sandstone": 3}, "result_count": 6}, {"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["black_wool", 2], "ingredients": {"black_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x respawn_anchor, 2x end_stone_brick_stairs, 2x light_blue_wool", "id": "textcraft.train.220", "max_steps": 50, "misc": {"target_items": {"respawn_anchor": 1, "end_stone_brick_stairs": 2, "light_blue_wool": 2}, "initial_inventory": {"crying_obsidian": 8, "glowstone_dust": 18, "end_stone": 11, "cornflower": 1, "lily_of_the_valley": 2, "string": 9, "peony": 1, "oak_log": 5, "brown_mushroom": 5}, "gold_trajectory": [{"action": "craft", "target": ["glowstone", 3], "ingredients": {"glowstone_dust": 12}, "result_count": 3}, {"action": "craft", "target": ["respawn_anchor", 1], "ingredients": {"crying_obsidian": 6, "glowstone": 3}, "result_count": 1}, {"action": "craft", "target": ["end_stone_bricks", 2], "ingredients": {"end_stone": 8}, "result_count": 8}, {"action": "craft", "target": ["end_stone_brick_stairs", 1], "ingredients": {"end_stone_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["light_blue_wool", 2], "ingredients": {"light_blue_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x diorite_slab", "id": "textcraft.train.221", "max_steps": 50, "misc": {"target_items": {"diorite_slab": 3}, "initial_inventory": {"cobblestone": 5, "quartz": 6, "spruce_log": 2, "vine": 3, "string": 2, "cooked_rabbit": 1}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["diorite_slab", 1], "ingredients": {"diorite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x quartz_pillar, 2x white_banner", "id": "textcraft.train.222", "max_steps": 50, "misc": {"target_items": {"quartz_pillar": 3, "white_banner": 2}, "initial_inventory": {"quartz": 16, "string": 52, "acacia_log": 1, "nether_wart": 1, "sand": 4, "carved_pumpkin": 1, "cocoa_beans": 4, "stripped_acacia_log": 5}, "gold_trajectory": [{"action": "craft", "target": ["quartz_block", 4], "ingredients": {"quartz": 16}, "result_count": 4}, {"action": "craft", "target": ["quartz_pillar", 2], "ingredients": {"quartz_block": 4}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["white_banner", 2], "ingredients": {"white_wool": 12, "stick": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x dark_oak_sign, 2x stone_shovel", "id": "textcraft.train.223", "max_steps": 50, "misc": {"target_items": {"dark_oak_sign": 2, "stone_shovel": 2}, "initial_inventory": {"dark_oak_log": 3, "acacia_log": 3, "blackstone": 2, "bamboo": 1, "sugar_cane": 4}, "gold_trajectory": [{"action": "craft", "target": ["dark_oak_planks", 2], "ingredients": {"dark_oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"dark_oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_sign", 1], "ingredients": {"dark_oak_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_shovel", 2], "ingredients": {"blackstone": 2, "stick": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x white_terracotta", "id": "textcraft.train.224", "max_steps": 50, "misc": {"target_items": {"white_terracotta": 1}, "initial_inventory": {"terracotta": 10, "lily_of_the_valley": 2, "milk_bucket": 1, "pumpkin": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_terracotta", 1], "ingredients": {"terracotta": 8, "white_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x orange_dye, 3x grindstone", "id": "textcraft.train.225", "max_steps": 50, "misc": {"target_items": {"orange_dye": 3, "grindstone": 3}, "initial_inventory": {"orange_tulip": 3, "acacia_log": 3, "stone": 3, "shulker_shell": 1, "prismarine_crystals": 2, "scute": 2}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 3], "ingredients": {"orange_tulip": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["stone_slab", 1], "ingredients": {"stone": 3}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["grindstone", 3], "ingredients": {"stick": 6, "stone_slab": 3, "acacia_planks": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x diorite_slab", "id": "textcraft.train.226", "max_steps": 50, "misc": {"target_items": {"diorite_slab": 3}, "initial_inventory": {"cobblestone": 5, "quartz": 5, "blaze_rod": 3, "egg": 5, "oak_log": 5, "birch_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["diorite_slab", 1], "ingredients": {"diorite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x jungle_fence_gate", "id": "textcraft.train.227", "max_steps": 50, "misc": {"target_items": {"jungle_fence_gate": 1}, "initial_inventory": {"acacia_log": 2, "jungle_log": 1, "vine": 5, "gravel": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["jungle_fence_gate", 1], "ingredients": {"stick": 4, "jungle_planks": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x polished_diorite_slab", "id": "textcraft.train.228", "max_steps": 50, "misc": {"target_items": {"polished_diorite_slab": 2}, "initial_inventory": {"cobblestone": 5, "quartz": 5, "brick": 2, "baked_potato": 1, "bone": 1}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite_slab", 1], "ingredients": {"polished_diorite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x granite_wall", "id": "textcraft.train.229", "max_steps": 50, "misc": {"target_items": {"granite_wall": 3}, "initial_inventory": {"cobblestone": 9, "quartz": 13, "baked_potato": 4, "smooth_stone": 5}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_wall", 1], "ingredients": {"granite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x blue_wool, 2x end_stone_brick_slab", "id": "textcraft.train.230", "max_steps": 50, "misc": {"target_items": {"blue_wool": 2, "end_stone_brick_slab": 2}, "initial_inventory": {"cornflower": 2, "string": 9, "end_stone": 5, "gunpowder": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["blue_wool", 2], "ingredients": {"blue_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["end_stone_bricks", 1], "ingredients": {"end_stone": 4}, "result_count": 4}, {"action": "craft", "target": ["end_stone_brick_slab", 1], "ingredients": {"end_stone_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x lever", "id": "textcraft.train.231", "max_steps": 50, "misc": {"target_items": {"lever": 2}, "initial_inventory": {"acacia_log": 1, "cobblestone": 2, "crimson_stem": 5, "azure_bluet": 5, "obsidian": 1, "honeycomb": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["lever", 2], "ingredients": {"stick": 2, "cobblestone": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x polished_andesite_stairs, 2x lime_terracotta, 1x nether_brick_wall", "id": "textcraft.train.232", "max_steps": 50, "misc": {"target_items": {"polished_andesite_stairs": 2, "lime_terracotta": 2, "nether_brick_wall": 1}, "initial_inventory": {"cobblestone": 8, "quartz": 6, "terracotta": 12, "green_dye": 2, "lily_of_the_valley": 2, "nether_brick": 24, "shulker_shell": 2, "string": 1, "scute": 3, "nautilus_shell": 5, "snowball": 3}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 4], "ingredients": {"diorite": 4, "cobblestone": 4}, "result_count": 8}, {"action": "craft", "target": ["polished_andesite", 2], "ingredients": {"andesite": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_andesite_stairs", 1], "ingredients": {"polished_andesite": 6}, "result_count": 4}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_terracotta", 1], "ingredients": {"terracotta": 8, "lime_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["nether_bricks", 6], "ingredients": {"nether_brick": 24}, "result_count": 6}, {"action": "craft", "target": ["nether_brick_wall", 1], "ingredients": {"nether_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x cyan_stained_glass, 1x blue_ice", "id": "textcraft.train.233", "max_steps": 50, "misc": {"target_items": {"cyan_stained_glass": 3, "blue_ice": 1}, "initial_inventory": {"glass": 10, "cornflower": 2, "green_dye": 1, "ice": 120, "peony": 3, "oak_log": 1, "red_sand": 2, "acacia_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_stained_glass", 1], "ingredients": {"glass": 8, "cyan_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["packed_ice", 9], "ingredients": {"ice": 81}, "result_count": 9}, {"action": "craft", "target": ["blue_ice", 1], "ingredients": {"packed_ice": 9}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x respawn_anchor", "id": "textcraft.train.234", "max_steps": 50, "misc": {"target_items": {"respawn_anchor": 3}, "initial_inventory": {"crying_obsidian": 23, "glowstone_dust": 37, "prismarine_crystals": 1, "carved_pumpkin": 2, "crimson_stem": 4, "bamboo": 3}, "gold_trajectory": [{"action": "craft", "target": ["glowstone", 9], "ingredients": {"glowstone_dust": 36}, "result_count": 9}, {"action": "craft", "target": ["respawn_anchor", 3], "ingredients": {"crying_obsidian": 18, "glowstone": 9}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x sandstone_wall", "id": "textcraft.train.235", "max_steps": 50, "misc": {"target_items": {"sandstone_wall": 1}, "initial_inventory": {"sand": 24, "milk_bucket": 1, "vine": 1, "egg": 5}, "gold_trajectory": [{"action": "craft", "target": ["sandstone", 6], "ingredients": {"sand": 24}, "result_count": 6}, {"action": "craft", "target": ["sandstone_wall", 1], "ingredients": {"sandstone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x gray_stained_glass", "id": "textcraft.train.236", "max_steps": 50, "misc": {"target_items": {"gray_stained_glass": 3}, "initial_inventory": {"glass": 12, "wither_rose": 1, "lily_of_the_valley": 1, "blackstone": 3, "crimson_stem": 1, "stripped_oak_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_stained_glass", 1], "ingredients": {"glass": 8, "gray_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x red_bed, 2x mossy_stone_bricks", "id": "textcraft.train.237", "max_steps": 50, "misc": {"target_items": {"red_bed": 2, "mossy_stone_bricks": 2}, "initial_inventory": {"rose_bush": 3, "string": 36, "acacia_log": 2, "stone": 5, "vine": 2, "red_tulip": 3, "ghast_tear": 3, "stripped_birch_log": 2, "jungle_log": 1, "carrot": 2}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 3], "ingredients": {"rose_bush": 3}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["red_wool", 6], "ingredients": {"red_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["red_bed", 2], "ingredients": {"red_wool": 6, "acacia_planks": 6}, "result_count": 2}, {"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["mossy_stone_bricks", 2], "ingredients": {"stone_bricks": 2, "vine": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x polished_diorite_stairs, 1x carrot_on_a_stick", "id": "textcraft.train.238", "max_steps": 50, "misc": {"target_items": {"polished_diorite_stairs": 1, "carrot_on_a_stick": 1}, "initial_inventory": {"cobblestone": 8, "quartz": 12, "acacia_log": 2, "string": 3, "carrot": 1, "basalt": 1, "crying_obsidian": 4, "spruce_log": 2, "pink_tulip": 3, "glass": 5}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 4], "ingredients": {"cobblestone": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_diorite", 2], "ingredients": {"diorite": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_diorite_stairs", 1], "ingredients": {"polished_diorite": 6}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["fishing_rod", 1], "ingredients": {"stick": 3, "string": 2}, "result_count": 1}, {"action": "craft", "target": ["carrot_on_a_stick", 1], "ingredients": {"fishing_rod": 1, "carrot": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x oak_fence_gate", "id": "textcraft.train.239", "max_steps": 50, "misc": {"target_items": {"oak_fence_gate": 3}, "initial_inventory": {"acacia_log": 3, "oak_log": 3, "green_dye": 1, "wither_skeleton_skull": 2, "smooth_sandstone": 4, "prismarine_shard": 4, "wither_rose": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["oak_planks", 2], "ingredients": {"oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["oak_fence_gate", 3], "ingredients": {"stick": 12, "oak_planks": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x mossy_cobblestone_slab, 3x green_stained_glass_pane, 3x green_banner", "id": "textcraft.train.240", "max_steps": 50, "misc": {"target_items": {"mossy_cobblestone_slab": 1, "green_stained_glass_pane": 3, "green_banner": 3}, "initial_inventory": {"cobblestone": 4, "vine": 4, "glass": 6, "green_dye": 26, "string": 84, "acacia_log": 1, "allium": 1, "apple": 5}, "gold_trajectory": [{"action": "craft", "target": ["mossy_cobblestone", 3], "ingredients": {"cobblestone": 3, "vine": 3}, "result_count": 3}, {"action": "craft", "target": ["mossy_cobblestone_slab", 1], "ingredients": {"mossy_cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["green_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "green_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["green_wool", 18], "ingredients": {"green_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["green_banner", 3], "ingredients": {"green_wool": 18, "stick": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x polished_blackstone_brick_wall, 2x chiseled_nether_bricks, 1x leather_horse_armor", "id": "textcraft.train.241", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_brick_wall": 3, "chiseled_nether_bricks": 2, "leather_horse_armor": 1}, "initial_inventory": {"blackstone": 8, "nether_brick": 14, "rabbit_hide": 28, "apple": 1, "green_dye": 1, "spider_eye": 5, "smooth_stone": 5}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_bricks", 2], "ingredients": {"polished_blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_brick_wall", 1], "ingredients": {"polished_blackstone_bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_nether_bricks", 2], "ingredients": {"nether_brick_slab": 4}, "result_count": 2}, {"action": "craft", "target": ["leather", 7], "ingredients": {"rabbit_hide": 28}, "result_count": 7}, {"action": "craft", "target": ["leather_horse_armor", 1], "ingredients": {"leather": 7}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x bookshelf", "id": "textcraft.train.242", "max_steps": 50, "misc": {"target_items": {"bookshelf": 2}, "initial_inventory": {"acacia_log": 3, "sugar_cane": 25, "rabbit_hide": 33, "honeycomb": 2, "oak_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["paper", 6], "ingredients": {"sugar_cane": 18}, "result_count": 18}, {"action": "craft", "target": ["leather", 6], "ingredients": {"rabbit_hide": 24}, "result_count": 6}, {"action": "craft", "target": ["book", 6], "ingredients": {"paper": 18, "leather": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["bookshelf", 2], "ingredients": {"acacia_planks": 12, "book": 6}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x cyan_dye, 3x chiseled_nether_bricks, 1x ladder", "id": "textcraft.train.243", "max_steps": 50, "misc": {"target_items": {"cyan_dye": 2, "chiseled_nether_bricks": 3, "ladder": 1}, "initial_inventory": {"cornflower": 1, "green_dye": 1, "nether_brick": 12, "acacia_log": 2, "terracotta": 2, "cocoa_beans": 3, "nautilus_shell": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_nether_bricks", 3], "ingredients": {"nether_brick_slab": 6}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["ladder", 1], "ingredients": {"stick": 7}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x granite_wall", "id": "textcraft.train.244", "max_steps": 50, "misc": {"target_items": {"granite_wall": 1}, "initial_inventory": {"cobblestone": 6, "quartz": 12, "egg": 5, "brick": 4, "prismarine_shard": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_wall", 1], "ingredients": {"granite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x blue_ice, 2x diorite_slab, 3x birch_sign", "id": "textcraft.train.245", "max_steps": 50, "misc": {"target_items": {"blue_ice": 3, "diorite_slab": 2, "birch_sign": 3}, "initial_inventory": {"ice": 300, "cobblestone": 5, "quartz": 4, "birch_log": 2, "acacia_log": 1, "stone": 4, "obsidian": 1, "warped_fungus": 3}, "gold_trajectory": [{"action": "craft", "target": ["packed_ice", 27], "ingredients": {"ice": 243}, "result_count": 27}, {"action": "craft", "target": ["blue_ice", 3], "ingredients": {"packed_ice": 27}, "result_count": 3}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["diorite_slab", 1], "ingredients": {"diorite": 3}, "result_count": 6}, {"action": "craft", "target": ["birch_planks", 2], "ingredients": {"birch_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"birch_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["birch_sign", 1], "ingredients": {"birch_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x white_carpet", "id": "textcraft.train.246", "max_steps": 50, "misc": {"target_items": {"white_carpet": 2}, "initial_inventory": {"string": 11, "creeper_head": 1, "carved_pumpkin": 3, "brick": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["white_carpet", 1], "ingredients": {"white_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x polished_blackstone_wall", "id": "textcraft.train.247", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_wall": 1}, "initial_inventory": {"blackstone": 9, "carrot": 5, "dirt": 1}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_wall", 1], "ingredients": {"polished_blackstone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x white_terracotta", "id": "textcraft.train.248", "max_steps": 50, "misc": {"target_items": {"white_terracotta": 3}, "initial_inventory": {"terracotta": 12, "lily_of_the_valley": 2, "popped_chorus_fruit": 3, "quartz": 1, "smooth_quartz": 2, "end_stone": 2, "nautilus_shell": 4}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_terracotta", 1], "ingredients": {"terracotta": 8, "white_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x pink_wool, 1x writable_book", "id": "textcraft.train.249", "max_steps": 50, "misc": {"target_items": {"pink_wool": 2, "writable_book": 1}, "initial_inventory": {"pink_tulip": 3, "string": 9, "sugar_cane": 4, "rabbit_hide": 5, "ink_sac": 1, "feather": 2, "crying_obsidian": 5, "ghast_tear": 3, "baked_potato": 1}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 2], "ingredients": {"pink_tulip": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["pink_wool", 2], "ingredients": {"pink_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["leather", 1], "ingredients": {"rabbit_hide": 4}, "result_count": 1}, {"action": "craft", "target": ["book", 1], "ingredients": {"paper": 3, "leather": 1}, "result_count": 1}, {"action": "craft", "target": ["writable_book", 1], "ingredients": {"book": 1, "ink_sac": 1, "feather": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x green_wool, 3x nether_brick_fence", "id": "textcraft.train.250", "max_steps": 50, "misc": {"target_items": {"green_wool": 1, "nether_brick_fence": 3}, "initial_inventory": {"green_dye": 2, "string": 6, "nether_brick": 21, "smooth_quartz": 4, "shulker_shell": 2, "acacia_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["green_wool", 1], "ingredients": {"green_dye": 1, "white_wool": 1}, "result_count": 1}, {"action": "craft", "target": ["nether_bricks", 4], "ingredients": {"nether_brick": 16}, "result_count": 4}, {"action": "craft", "target": ["nether_brick_fence", 1], "ingredients": {"nether_bricks": 4, "nether_brick": 2}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x pink_terracotta, 2x orange_terracotta, 3x gray_dye", "id": "textcraft.train.251", "max_steps": 50, "misc": {"target_items": {"pink_terracotta": 1, "orange_terracotta": 2, "gray_dye": 3}, "initial_inventory": {"terracotta": 24, "pink_tulip": 1, "orange_tulip": 2, "wither_rose": 3, "lily_of_the_valley": 3, "glowstone_dust": 4, "enchanted_golden_apple": 1}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_terracotta", 1], "ingredients": {"terracotta": 8, "pink_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_terracotta", 1], "ingredients": {"terracotta": 8, "orange_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_dye", 2], "ingredients": {"lily_of_the_valley": 2}, "result_count": 2}, {"action": "craft", "target": ["gray_dye", 2], "ingredients": {"black_dye": 2, "white_dye": 2}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x lever, 2x respawn_anchor, 2x spruce_fence_gate", "id": "textcraft.train.252", "max_steps": 50, "misc": {"target_items": {"lever": 2, "respawn_anchor": 2, "spruce_fence_gate": 2}, "initial_inventory": {"acacia_log": 3, "cobblestone": 3, "crying_obsidian": 12, "glowstone_dust": 25, "spruce_log": 2, "oak_planks": 5, "stripped_spruce_log": 5, "wither_rose": 4, "vine": 5, "nether_wart": 5, "smooth_red_sandstone": 4}, "gold_trajectory": [{"action": "craft", "target": ["stick", 1], "ingredients": {"oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["lever", 2], "ingredients": {"stick": 2, "cobblestone": 2}, "result_count": 2}, {"action": "craft", "target": ["glowstone", 6], "ingredients": {"glowstone_dust": 24}, "result_count": 6}, {"action": "craft", "target": ["respawn_anchor", 2], "ingredients": {"crying_obsidian": 12, "glowstone": 6}, "result_count": 2}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["spruce_planks", 1], "ingredients": {"spruce_log": 1}, "result_count": 4}, {"action": "craft", "target": ["spruce_fence_gate", 2], "ingredients": {"stick": 8, "spruce_planks": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x creeper_banner_pattern", "id": "textcraft.train.253", "max_steps": 50, "misc": {"target_items": {"creeper_banner_pattern": 3}, "initial_inventory": {"sugar_cane": 4, "creeper_head": 4, "feather": 3, "carrot": 5, "poppy": 5, "stripped_warped_stem": 4}, "gold_trajectory": [{"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["creeper_banner_pattern", 3], "ingredients": {"paper": 3, "creeper_head": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x leather_helmet, 2x brick_wall", "id": "textcraft.train.254", "max_steps": 50, "misc": {"target_items": {"leather_helmet": 1, "brick_wall": 2}, "initial_inventory": {"rabbit_hide": 22, "brick": 36, "quartz": 4, "blue_orchid": 3, "beetroot": 1, "flint": 3}, "gold_trajectory": [{"action": "craft", "target": ["leather", 5], "ingredients": {"rabbit_hide": 20}, "result_count": 5}, {"action": "craft", "target": ["leather_helmet", 1], "ingredients": {"leather": 5}, "result_count": 1}, {"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_wall", 1], "ingredients": {"bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x mossy_stone_bricks", "id": "textcraft.train.255", "max_steps": 50, "misc": {"target_items": {"mossy_stone_bricks": 1}, "initial_inventory": {"stone": 4, "vine": 1, "sunflower": 3, "string": 2}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["mossy_stone_bricks", 1], "ingredients": {"stone_bricks": 1, "vine": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x acacia_fence, 1x wooden_axe, 2x wooden_pickaxe", "id": "textcraft.train.256", "max_steps": 50, "misc": {"target_items": {"acacia_fence": 1, "wooden_axe": 1, "wooden_pickaxe": 2}, "initial_inventory": {"acacia_log": 10, "crimson_planks": 4, "basalt": 1, "nautilus_shell": 5, "stripped_spruce_log": 3, "ice": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["acacia_fence", 1], "ingredients": {"acacia_planks": 4, "stick": 2}, "result_count": 3}, {"action": "craft", "target": ["wooden_axe", 1], "ingredients": {"crimson_planks": 3, "stick": 2}, "result_count": 1}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["wooden_pickaxe", 2], "ingredients": {"acacia_planks": 6, "stick": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x stone_brick_stairs, 1x book", "id": "textcraft.train.257", "max_steps": 50, "misc": {"target_items": {"stone_brick_stairs": 3, "book": 1}, "initial_inventory": {"stone": 12, "sugar_cane": 4, "rabbit_hide": 5, "cobblestone": 4, "sunflower": 2}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["stone_brick_stairs", 1], "ingredients": {"stone_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["leather", 1], "ingredients": {"rabbit_hide": 4}, "result_count": 1}, {"action": "craft", "target": ["book", 1], "ingredients": {"paper": 3, "leather": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x blue_wool, 2x cut_sandstone_slab, 3x chiseled_nether_bricks", "id": "textcraft.train.258", "max_steps": 50, "misc": {"target_items": {"blue_wool": 1, "cut_sandstone_slab": 2, "chiseled_nether_bricks": 3}, "initial_inventory": {"cornflower": 1, "string": 5, "sand": 21, "nether_brick": 12, "ghast_tear": 5, "ice": 2, "shulker_shell": 5}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["blue_wool", 1], "ingredients": {"blue_dye": 1, "white_wool": 1}, "result_count": 1}, {"action": "craft", "target": ["sandstone", 4], "ingredients": {"sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_sandstone", 1], "ingredients": {"sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["cut_sandstone_slab", 1], "ingredients": {"cut_sandstone": 3}, "result_count": 6}, {"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_nether_bricks", 3], "ingredients": {"nether_brick_slab": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x polished_granite_stairs, 3x orange_wool", "id": "textcraft.train.259", "max_steps": 50, "misc": {"target_items": {"polished_granite_stairs": 1, "orange_wool": 3}, "initial_inventory": {"cobblestone": 11, "quartz": 17, "orange_tulip": 4, "string": 13, "lily_of_the_valley": 5, "red_sand": 5, "ghast_tear": 3, "glass": 2, "stone": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 4], "ingredients": {"cobblestone": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["granite", 8], "ingredients": {"diorite": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_granite", 2], "ingredients": {"granite": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_granite_stairs", 1], "ingredients": {"polished_granite": 6}, "result_count": 4}, {"action": "craft", "target": ["orange_dye", 3], "ingredients": {"orange_tulip": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["orange_wool", 3], "ingredients": {"orange_dye": 3, "white_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x white_terracotta", "id": "textcraft.train.260", "max_steps": 50, "misc": {"target_items": {"white_terracotta": 3}, "initial_inventory": {"terracotta": 11, "lily_of_the_valley": 2, "creeper_head": 4, "cobblestone": 4, "baked_potato": 5, "milk_bucket": 1}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_terracotta", 1], "ingredients": {"terracotta": 8, "white_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x pink_concrete_powder", "id": "textcraft.train.261", "max_steps": 50, "misc": {"target_items": {"pink_concrete_powder": 2}, "initial_inventory": {"pink_tulip": 2, "sand": 6, "gravel": 5, "acacia_log": 4, "egg": 1}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_concrete_powder", 1], "ingredients": {"pink_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x yellow_banner", "id": "textcraft.train.262", "max_steps": 50, "misc": {"target_items": {"yellow_banner": 2}, "initial_inventory": {"dandelion": 17, "string": 68, "acacia_log": 2, "feather": 3, "nether_brick": 2}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 12], "ingredients": {"dandelion": 12}, "result_count": 12}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["yellow_wool", 12], "ingredients": {"yellow_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["yellow_banner", 2], "ingredients": {"yellow_wool": 12, "stick": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x acacia_fence, 1x lever", "id": "textcraft.train.263", "max_steps": 50, "misc": {"target_items": {"acacia_fence": 1, "lever": 1}, "initial_inventory": {"acacia_log": 4, "cobblestone": 2, "gravel": 2, "carved_pumpkin": 3, "stripped_jungle_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["acacia_fence", 1], "ingredients": {"acacia_planks": 4, "stick": 2}, "result_count": 3}, {"action": "craft", "target": ["lever", 1], "ingredients": {"stick": 1, "cobblestone": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x wooden_pickaxe, 3x polished_blackstone_brick_slab, 2x white_carpet", "id": "textcraft.train.264", "max_steps": 50, "misc": {"target_items": {"wooden_pickaxe": 3, "polished_blackstone_brick_slab": 3, "white_carpet": 2}, "initial_inventory": {"acacia_log": 4, "blackstone": 6, "string": 12, "flint": 1, "baked_potato": 5, "brick": 3, "ender_pearl": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["wooden_pickaxe", 3], "ingredients": {"acacia_planks": 9, "stick": 6}, "result_count": 3}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_bricks", 1], "ingredients": {"polished_blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_brick_slab", 1], "ingredients": {"polished_blackstone_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["white_carpet", 1], "ingredients": {"white_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x blue_carpet", "id": "textcraft.train.265", "max_steps": 50, "misc": {"target_items": {"blue_carpet": 3}, "initial_inventory": {"string": 35, "cornflower": 1, "smooth_stone": 1, "dirt": 2, "warped_stem": 4, "sugar_cane": 3, "prismarine_shard": 3}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_carpet", 1], "ingredients": {"white_carpet": 8, "blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x respawn_anchor", "id": "textcraft.train.266", "max_steps": 50, "misc": {"target_items": {"respawn_anchor": 1}, "initial_inventory": {"crying_obsidian": 6, "glowstone_dust": 15, "bone": 1, "ender_pearl": 4}, "gold_trajectory": [{"action": "craft", "target": ["glowstone", 3], "ingredients": {"glowstone_dust": 12}, "result_count": 3}, {"action": "craft", "target": ["respawn_anchor", 1], "ingredients": {"crying_obsidian": 6, "glowstone": 3}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x leather_boots, 1x polished_granite_stairs", "id": "textcraft.train.267", "max_steps": 50, "misc": {"target_items": {"leather_boots": 1, "polished_granite_stairs": 1}, "initial_inventory": {"rabbit_hide": 24, "cobblestone": 12, "quartz": 16, "wither_rose": 3, "sunflower": 1, "netherite_scrap": 1, "prismarine_crystals": 1}, "gold_trajectory": [{"action": "craft", "target": ["leather", 4], "ingredients": {"rabbit_hide": 16}, "result_count": 4}, {"action": "craft", "target": ["leather_boots", 1], "ingredients": {"leather": 4}, "result_count": 1}, {"action": "craft", "target": ["diorite", 4], "ingredients": {"cobblestone": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["granite", 8], "ingredients": {"diorite": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_granite", 2], "ingredients": {"granite": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_granite_stairs", 1], "ingredients": {"polished_granite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x diorite_slab, 3x gray_terracotta, 2x light_blue_wool", "id": "textcraft.train.268", "max_steps": 50, "misc": {"target_items": {"diorite_slab": 1, "gray_terracotta": 3, "light_blue_wool": 2}, "initial_inventory": {"cobblestone": 4, "quartz": 4, "terracotta": 9, "wither_rose": 2, "lily_of_the_valley": 3, "cornflower": 2, "string": 9, "stripped_spruce_log": 5, "end_stone": 5}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["diorite_slab", 1], "ingredients": {"diorite": 3}, "result_count": 6}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_terracotta", 1], "ingredients": {"terracotta": 8, "gray_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["light_blue_wool", 2], "ingredients": {"light_blue_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x andesite_stairs, 3x polished_blackstone_wall", "id": "textcraft.train.269", "max_steps": 50, "misc": {"target_items": {"andesite_stairs": 1, "polished_blackstone_wall": 3}, "initial_inventory": {"cobblestone": 7, "quartz": 4, "blackstone": 12, "stripped_jungle_log": 5, "lilac": 4, "nether_wart": 1, "gravel": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 3], "ingredients": {"diorite": 3, "cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["andesite_stairs", 1], "ingredients": {"andesite": 6}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_wall", 1], "ingredients": {"polished_blackstone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x diorite_stairs, 2x oak_fence_gate", "id": "textcraft.train.270", "max_steps": 50, "misc": {"target_items": {"diorite_stairs": 1, "oak_fence_gate": 2}, "initial_inventory": {"cobblestone": 6, "quartz": 8, "acacia_log": 1, "oak_log": 2, "dandelion": 2, "gunpowder": 3}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_stairs", 1], "ingredients": {"diorite": 6}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["oak_planks", 1], "ingredients": {"oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["oak_fence_gate", 2], "ingredients": {"stick": 8, "oak_planks": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x blue_terracotta, 2x carrot_on_a_stick, 1x cut_red_sandstone", "id": "textcraft.train.271", "max_steps": 50, "misc": {"target_items": {"blue_terracotta": 1, "carrot_on_a_stick": 2, "cut_red_sandstone": 1}, "initial_inventory": {"terracotta": 10, "cornflower": 1, "acacia_log": 2, "string": 4, "carrot": 2, "red_sand": 22, "peony": 5, "spruce_log": 4, "gravel": 4, "poppy": 5}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_terracotta", 1], "ingredients": {"terracotta": 8, "blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["fishing_rod", 2], "ingredients": {"stick": 6, "string": 4}, "result_count": 2}, {"action": "craft", "target": ["carrot_on_a_stick", 2], "ingredients": {"fishing_rod": 2, "carrot": 2}, "result_count": 2}, {"action": "craft", "target": ["red_sandstone", 4], "ingredients": {"red_sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone", 1], "ingredients": {"red_sandstone": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x torch, 1x yellow_concrete_powder", "id": "textcraft.train.272", "max_steps": 50, "misc": {"target_items": {"torch": 2, "yellow_concrete_powder": 1}, "initial_inventory": {"acacia_log": 2, "dandelion": 1, "sand": 4, "gravel": 5, "gunpowder": 2, "warped_fungus": 2, "snowball": 1, "nautilus_shell": 1, "terracotta": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}, {"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_concrete_powder", 1], "ingredients": {"yellow_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x spectral_arrow, 3x pink_wool, 2x end_stone_brick_wall", "id": "textcraft.train.273", "max_steps": 50, "misc": {"target_items": {"spectral_arrow": 3, "pink_wool": 3, "end_stone_brick_wall": 2}, "initial_inventory": {"glowstone_dust": 9, "flint": 2, "acacia_log": 1, "feather": 1, "pink_tulip": 4, "string": 18, "end_stone": 11, "smooth_red_sandstone": 4, "carrot": 5, "stripped_birch_log": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}, {"action": "craft", "target": ["spectral_arrow", 2], "ingredients": {"glowstone_dust": 8, "arrow": 2}, "result_count": 4}, {"action": "craft", "target": ["pink_dye", 3], "ingredients": {"pink_tulip": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["pink_wool", 3], "ingredients": {"pink_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["end_stone_bricks", 2], "ingredients": {"end_stone": 8}, "result_count": 8}, {"action": "craft", "target": ["end_stone_brick_wall", 1], "ingredients": {"end_stone_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x end_stone_brick_slab, 2x jack_o_lantern", "id": "textcraft.train.274", "max_steps": 50, "misc": {"target_items": {"end_stone_brick_slab": 2, "jack_o_lantern": 2}, "initial_inventory": {"end_stone": 5, "carved_pumpkin": 2, "acacia_log": 1, "brown_mushroom": 3, "vine": 2, "carrot": 4}, "gold_trajectory": [{"action": "craft", "target": ["end_stone_bricks", 1], "ingredients": {"end_stone": 4}, "result_count": 4}, {"action": "craft", "target": ["end_stone_brick_slab", 1], "ingredients": {"end_stone_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}, {"action": "craft", "target": ["jack_o_lantern", 2], "ingredients": {"carved_pumpkin": 2, "torch": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x mojang_banner_pattern", "id": "textcraft.train.275", "max_steps": 50, "misc": {"target_items": {"mojang_banner_pattern": 3}, "initial_inventory": {"sugar_cane": 4, "enchanted_golden_apple": 4, "white_tulip": 4, "scute": 5}, "gold_trajectory": [{"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["mojang_banner_pattern", 3], "ingredients": {"paper": 3, "enchanted_golden_apple": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x yellow_banner, 2x grindstone", "id": "textcraft.train.276", "max_steps": 50, "misc": {"target_items": {"yellow_banner": 3, "grindstone": 2}, "initial_inventory": {"dandelion": 27, "string": 94, "acacia_log": 4, "stone": 4, "snowball": 5, "sunflower": 2}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 18], "ingredients": {"dandelion": 18}, "result_count": 18}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["yellow_wool", 18], "ingredients": {"yellow_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["yellow_banner", 3], "ingredients": {"yellow_wool": 18, "stick": 3}, "result_count": 3}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_slab", 1], "ingredients": {"stone": 3}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["grindstone", 2], "ingredients": {"stick": 4, "stone_slab": 2, "acacia_planks": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x yellow_stained_glass_pane", "id": "textcraft.train.277", "max_steps": 50, "misc": {"target_items": {"yellow_stained_glass_pane": 3}, "initial_inventory": {"glass": 8, "dandelion": 1, "nether_star": 1, "rose_bush": 2}, "gold_trajectory": [{"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "yellow_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x polished_blackstone_wall", "id": "textcraft.train.278", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_wall": 2}, "initial_inventory": {"blackstone": 8, "scute": 4, "white_tulip": 5, "nether_brick": 3, "warped_stem": 4, "acacia_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_wall", 1], "ingredients": {"polished_blackstone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x lime_stained_glass, 2x brown_stained_glass_pane", "id": "textcraft.train.279", "max_steps": 50, "misc": {"target_items": {"lime_stained_glass": 2, "brown_stained_glass_pane": 2}, "initial_inventory": {"glass": 17, "green_dye": 2, "lily_of_the_valley": 1, "cocoa_beans": 1, "gunpowder": 5, "ink_sac": 3, "cooked_rabbit": 5, "netherite_scrap": 3}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_stained_glass", 1], "ingredients": {"glass": 8, "lime_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_stained_glass", 1], "ingredients": {"glass": 8, "brown_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["brown_stained_glass_pane", 1], "ingredients": {"brown_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 1x green_wool, 1x brown_stained_glass", "id": "textcraft.train.280", "max_steps": 50, "misc": {"target_items": {"green_wool": 1, "brown_stained_glass": 1}, "initial_inventory": {"green_dye": 2, "string": 5, "glass": 11, "cocoa_beans": 2, "stripped_oak_log": 2, "orange_tulip": 3}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["green_wool", 1], "ingredients": {"green_dye": 1, "white_wool": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_stained_glass", 1], "ingredients": {"glass": 8, "brown_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x light_blue_concrete_powder", "id": "textcraft.train.281", "max_steps": 50, "misc": {"target_items": {"light_blue_concrete_powder": 2}, "initial_inventory": {"cornflower": 2, "lily_of_the_valley": 2, "sand": 5, "gravel": 6, "popped_chorus_fruit": 2, "spruce_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_concrete_powder", 1], "ingredients": {"light_blue_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x polished_diorite_stairs", "id": "textcraft.train.282", "max_steps": 50, "misc": {"target_items": {"polished_diorite_stairs": 2}, "initial_inventory": {"cobblestone": 12, "quartz": 9, "apple": 4, "warped_stem": 1}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 4], "ingredients": {"cobblestone": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_diorite", 2], "ingredients": {"diorite": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_diorite_stairs", 1], "ingredients": {"polished_diorite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x spruce_sign", "id": "textcraft.train.283", "max_steps": 50, "misc": {"target_items": {"spruce_sign": 2}, "initial_inventory": {"spruce_log": 2, "acacia_log": 2, "enchanted_golden_apple": 1, "string": 5, "wither_rose": 5}, "gold_trajectory": [{"action": "craft", "target": ["spruce_planks", 2], "ingredients": {"spruce_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"spruce_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["spruce_sign", 1], "ingredients": {"spruce_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x diorite_wall", "id": "textcraft.train.284", "max_steps": 50, "misc": {"target_items": {"diorite_wall": 2}, "initial_inventory": {"cobblestone": 9, "quartz": 8, "carrot": 5, "blue_orchid": 1}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_wall", 1], "ingredients": {"diorite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x warped_fence, 2x pink_stained_glass, 3x prismarine_brick_slab", "id": "textcraft.train.285", "max_steps": 50, "misc": {"target_items": {"warped_fence": 1, "pink_stained_glass": 2, "prismarine_brick_slab": 3}, "initial_inventory": {"warped_stem": 2, "acacia_log": 2, "glass": 10, "pink_tulip": 1, "prismarine_shard": 35, "jungle_log": 4, "oak_log": 4, "blackstone": 3}, "gold_trajectory": [{"action": "craft", "target": ["warped_planks", 1], "ingredients": {"warped_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"warped_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["warped_planks", 1], "ingredients": {"warped_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["warped_fence", 1], "ingredients": {"warped_planks": 4, "stick": 2}, "result_count": 3}, {"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_stained_glass", 1], "ingredients": {"glass": 8, "pink_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["prismarine_bricks", 3], "ingredients": {"prismarine_shard": 27}, "result_count": 3}, {"action": "craft", "target": ["prismarine_brick_slab", 1], "ingredients": {"prismarine_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x chiseled_polished_blackstone, 2x blue_stained_glass_pane", "id": "textcraft.train.286", "max_steps": 50, "misc": {"target_items": {"chiseled_polished_blackstone": 3, "blue_stained_glass_pane": 2}, "initial_inventory": {"blackstone": 5, "glass": 9, "cornflower": 1, "blue_orchid": 2, "oxeye_daisy": 5, "warped_stem": 1}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_slab", 1], "ingredients": {"polished_blackstone": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_polished_blackstone", 3], "ingredients": {"polished_blackstone_slab": 6}, "result_count": 3}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_stained_glass", 1], "ingredients": {"glass": 8, "blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["blue_stained_glass_pane", 1], "ingredients": {"blue_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 2x cut_red_sandstone, 3x cyan_dye", "id": "textcraft.train.287", "max_steps": 50, "misc": {"target_items": {"cut_red_sandstone": 2, "cyan_dye": 3}, "initial_inventory": {"red_sand": 22, "cornflower": 3, "green_dye": 2, "blue_orchid": 2, "white_tulip": 1}, "gold_trajectory": [{"action": "craft", "target": ["red_sandstone", 4], "ingredients": {"red_sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone", 1], "ingredients": {"red_sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["cyan_dye", 2], "ingredients": {"blue_dye": 2, "green_dye": 2}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x light_blue_dye", "id": "textcraft.train.288", "max_steps": 50, "misc": {"target_items": {"light_blue_dye": 2}, "initial_inventory": {"cornflower": 2, "lily_of_the_valley": 2, "stone": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x polished_granite", "id": "textcraft.train.289", "max_steps": 50, "misc": {"target_items": {"polished_granite": 2}, "initial_inventory": {"cobblestone": 6, "quartz": 11, "stripped_crimson_stem": 4, "melon_slice": 5, "spider_eye": 3, "nether_wart": 2}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 4], "ingredients": {"diorite": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite", 1], "ingredients": {"granite": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x light_blue_stained_glass, 3x blue_carpet", "id": "textcraft.train.290", "max_steps": 50, "misc": {"target_items": {"light_blue_stained_glass": 1, "blue_carpet": 3}, "initial_inventory": {"glass": 9, "cornflower": 3, "lily_of_the_valley": 1, "string": 32, "rose_bush": 4, "stripped_crimson_stem": 1, "vine": 5, "blaze_rod": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_stained_glass", 1], "ingredients": {"glass": 8, "light_blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_carpet", 1], "ingredients": {"white_carpet": 8, "blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x blue_concrete_powder, 3x dark_prismarine_stairs, 2x polished_diorite_slab", "id": "textcraft.train.291", "max_steps": 50, "misc": {"target_items": {"blue_concrete_powder": 3, "dark_prismarine_stairs": 3, "polished_diorite_slab": 2}, "initial_inventory": {"cornflower": 1, "sand": 4, "gravel": 4, "prismarine_shard": 49, "wither_rose": 7, "cobblestone": 4, "quartz": 4, "stripped_birch_log": 2, "vine": 4, "blaze_rod": 1, "gunpowder": 1, "jungle_log": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_concrete_powder", 1], "ingredients": {"blue_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["black_dye", 6], "ingredients": {"wither_rose": 6}, "result_count": 6}, {"action": "craft", "target": ["dark_prismarine", 6], "ingredients": {"prismarine_shard": 48, "black_dye": 6}, "result_count": 6}, {"action": "craft", "target": ["dark_prismarine_stairs", 1], "ingredients": {"dark_prismarine": 6}, "result_count": 4}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite_slab", 1], "ingredients": {"polished_diorite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x nether_brick_stairs, 1x torch, 3x sugar", "id": "textcraft.train.292", "max_steps": 50, "misc": {"target_items": {"nether_brick_stairs": 2, "torch": 1, "sugar": 3}, "initial_inventory": {"nether_brick": 26, "acacia_log": 1, "sugar_cane": 4, "melon_slice": 3, "lilac": 2}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 6], "ingredients": {"nether_brick": 24}, "result_count": 6}, {"action": "craft", "target": ["nether_brick_stairs", 1], "ingredients": {"nether_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}, {"action": "craft", "target": ["sugar", 3], "ingredients": {"sugar_cane": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x light_blue_dye", "id": "textcraft.train.293", "max_steps": 50, "misc": {"target_items": {"light_blue_dye": 3}, "initial_inventory": {"cornflower": 2, "lily_of_the_valley": 3, "honeycomb": 4, "nether_wart": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["white_dye", 2], "ingredients": {"lily_of_the_valley": 2}, "result_count": 2}, {"action": "craft", "target": ["light_blue_dye", 2], "ingredients": {"blue_dye": 2, "white_dye": 2}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x spectral_arrow, 3x white_bed", "id": "textcraft.train.294", "max_steps": 50, "misc": {"target_items": {"spectral_arrow": 3, "white_bed": 3}, "initial_inventory": {"glowstone_dust": 8, "flint": 2, "acacia_log": 5, "feather": 1, "string": 46, "snowball": 1, "smooth_stone": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}, {"action": "craft", "target": ["spectral_arrow", 2], "ingredients": {"glowstone_dust": 8, "arrow": 2}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 9], "ingredients": {"string": 36}, "result_count": 9}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["white_bed", 3], "ingredients": {"white_wool": 9, "acacia_planks": 9}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x polished_blackstone_bricks, 3x white_bed", "id": "textcraft.train.295", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_bricks": 3, "white_bed": 3}, "initial_inventory": {"blackstone": 4, "string": 39, "acacia_log": 4, "blaze_rod": 3, "pumpkin": 5, "stripped_crimson_stem": 3, "poppy": 1, "blue_orchid": 5}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_bricks", 1], "ingredients": {"polished_blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 9], "ingredients": {"string": 36}, "result_count": 9}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["white_bed", 3], "ingredients": {"white_wool": 9, "acacia_planks": 9}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x cyan_wool, 2x end_crystal", "id": "textcraft.train.296", "max_steps": 50, "misc": {"target_items": {"cyan_wool": 1, "end_crystal": 2}, "initial_inventory": {"cornflower": 2, "green_dye": 1, "string": 4, "glass": 18, "ender_pearl": 2, "blaze_rod": 2, "ghast_tear": 3, "stripped_warped_stem": 1, "sunflower": 5}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["cyan_wool", 1], "ingredients": {"cyan_dye": 1, "white_wool": 1}, "result_count": 1}, {"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["ender_eye", 2], "ingredients": {"ender_pearl": 2, "blaze_powder": 2}, "result_count": 2}, {"action": "craft", "target": ["end_crystal", 2], "ingredients": {"glass": 14, "ender_eye": 2, "ghast_tear": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x yellow_concrete_powder", "id": "textcraft.train.297", "max_steps": 50, "misc": {"target_items": {"yellow_concrete_powder": 2}, "initial_inventory": {"dandelion": 2, "sand": 4, "gravel": 5, "blackstone": 5, "azure_bluet": 5, "warped_stem": 1}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_concrete_powder", 1], "ingredients": {"yellow_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x gray_terracotta, 2x prismarine_slab", "id": "textcraft.train.298", "max_steps": 50, "misc": {"target_items": {"gray_terracotta": 3, "prismarine_slab": 2}, "initial_inventory": {"terracotta": 12, "wither_rose": 2, "lily_of_the_valley": 2, "prismarine_shard": 18, "spider_eye": 2, "azure_bluet": 5, "stripped_birch_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_terracotta", 1], "ingredients": {"terracotta": 8, "gray_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["prismarine", 3], "ingredients": {"prismarine_shard": 12}, "result_count": 3}, {"action": "craft", "target": ["prismarine_slab", 1], "ingredients": {"prismarine": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x purple_stained_glass", "id": "textcraft.train.299", "max_steps": 50, "misc": {"target_items": {"purple_stained_glass": 1}, "initial_inventory": {"glass": 8, "cornflower": 1, "rose_bush": 1, "melon_slice": 4, "feather": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_stained_glass", 1], "ingredients": {"glass": 8, "purple_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x orange_wool, 1x cut_sandstone_slab", "id": "textcraft.train.300", "max_steps": 50, "misc": {"target_items": {"orange_wool": 1, "cut_sandstone_slab": 1}, "initial_inventory": {"orange_tulip": 2, "string": 5, "sand": 23, "glowstone_dust": 5, "honeycomb": 2}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["orange_wool", 1], "ingredients": {"orange_dye": 1, "white_wool": 1}, "result_count": 1}, {"action": "craft", "target": ["sandstone", 4], "ingredients": {"sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_sandstone", 1], "ingredients": {"sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["cut_sandstone_slab", 1], "ingredients": {"cut_sandstone": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x torch, 3x red_banner", "id": "textcraft.train.301", "max_steps": 50, "misc": {"target_items": {"torch": 3, "red_banner": 3}, "initial_inventory": {"acacia_log": 3, "rose_bush": 10, "string": 75, "cocoa_beans": 5, "lily_of_the_valley": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}, {"action": "craft", "target": ["red_dye", 9], "ingredients": {"rose_bush": 9}, "result_count": 18}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["red_wool", 18], "ingredients": {"red_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["red_banner", 3], "ingredients": {"red_wool": 18, "stick": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x magenta_dye", "id": "textcraft.train.302", "max_steps": 50, "misc": {"target_items": {"magenta_dye": 3}, "initial_inventory": {"allium": 4, "dirt": 4, "clay_ball": 3, "glowstone_dust": 4, "warped_stem": 2, "brick": 2}, "gold_trajectory": [{"action": "craft", "target": ["magenta_dye", 3], "ingredients": {"allium": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x yellow_stained_glass, 3x cyan_wool, 3x light_blue_stained_glass", "id": "textcraft.train.303", "max_steps": 50, "misc": {"target_items": {"yellow_stained_glass": 2, "cyan_wool": 3, "light_blue_stained_glass": 3}, "initial_inventory": {"glass": 22, "dandelion": 2, "cornflower": 4, "green_dye": 3, "string": 18, "lily_of_the_valley": 1, "brick": 1, "poppy": 4, "stripped_crimson_stem": 2}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_stained_glass", 1], "ingredients": {"glass": 8, "yellow_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["cyan_dye", 2], "ingredients": {"blue_dye": 2, "green_dye": 2}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["cyan_wool", 3], "ingredients": {"cyan_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_stained_glass", 1], "ingredients": {"glass": 8, "light_blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x granite_stairs, 2x andesite_slab", "id": "textcraft.train.304", "max_steps": 50, "misc": {"target_items": {"granite_stairs": 2, "andesite_slab": 2}, "initial_inventory": {"cobblestone": 11, "quartz": 17, "warped_stem": 3, "stripped_birch_log": 3}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_stairs", 1], "ingredients": {"granite": 6}, "result_count": 4}, {"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["andesite", 2], "ingredients": {"diorite": 2, "cobblestone": 2}, "result_count": 4}, {"action": "craft", "target": ["andesite_slab", 1], "ingredients": {"andesite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x carrot_on_a_stick, 1x nether_brick_stairs, 1x leather_boots", "id": "textcraft.train.305", "max_steps": 50, "misc": {"target_items": {"carrot_on_a_stick": 3, "nether_brick_stairs": 1, "leather_boots": 1}, "initial_inventory": {"acacia_log": 2, "string": 7, "carrot": 4, "nether_brick": 26, "rabbit_hide": 20, "ink_sac": 5, "gunpowder": 1, "basalt": 3, "heart_of_the_sea": 2, "wither_rose": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["fishing_rod", 3], "ingredients": {"stick": 9, "string": 6}, "result_count": 3}, {"action": "craft", "target": ["carrot_on_a_stick", 3], "ingredients": {"fishing_rod": 3, "carrot": 3}, "result_count": 3}, {"action": "craft", "target": ["nether_bricks", 6], "ingredients": {"nether_brick": 24}, "result_count": 6}, {"action": "craft", "target": ["nether_brick_stairs", 1], "ingredients": {"nether_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["leather", 4], "ingredients": {"rabbit_hide": 16}, "result_count": 4}, {"action": "craft", "target": ["leather_boots", 1], "ingredients": {"leather": 4}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x polished_granite", "id": "textcraft.train.306", "max_steps": 50, "misc": {"target_items": {"polished_granite": 2}, "initial_inventory": {"cobblestone": 6, "quartz": 11, "warped_fungus": 2, "basalt": 5, "nether_brick": 2, "baked_potato": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 4], "ingredients": {"diorite": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite", 1], "ingredients": {"granite": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x blue_ice, 2x blue_stained_glass", "id": "textcraft.train.307", "max_steps": 50, "misc": {"target_items": {"blue_ice": 3, "blue_stained_glass": 2}, "initial_inventory": {"ice": 270, "glass": 8, "cornflower": 2, "prismarine_crystals": 2, "warped_stem": 1, "wither_skeleton_skull": 5, "stripped_birch_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["packed_ice", 27], "ingredients": {"ice": 243}, "result_count": 27}, {"action": "craft", "target": ["blue_ice", 3], "ingredients": {"packed_ice": 27}, "result_count": 3}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_stained_glass", 1], "ingredients": {"glass": 8, "blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x pumpkin_pie, 3x red_terracotta, 1x yellow_carpet", "id": "textcraft.train.308", "max_steps": 50, "misc": {"target_items": {"pumpkin_pie": 3, "red_terracotta": 3, "yellow_carpet": 1}, "initial_inventory": {"pumpkin": 4, "sugar_cane": 4, "egg": 3, "terracotta": 12, "rose_bush": 1, "dandelion": 3, "string": 10, "poppy": 5, "nether_wart": 2, "stone": 4}, "gold_trajectory": [{"action": "craft", "target": ["sugar", 3], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["pumpkin_pie", 3], "ingredients": {"pumpkin": 3, "sugar": 3, "egg": 3}, "result_count": 3}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_terracotta", 1], "ingredients": {"terracotta": 8, "red_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["yellow_dye", 2], "ingredients": {"dandelion": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["yellow_wool", 2], "ingredients": {"yellow_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["yellow_carpet", 1], "ingredients": {"yellow_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x mossy_cobblestone_stairs", "id": "textcraft.train.309", "max_steps": 50, "misc": {"target_items": {"mossy_cobblestone_stairs": 1}, "initial_inventory": {"cobblestone": 9, "vine": 7, "bone": 3, "nether_wart": 5, "green_dye": 5, "brown_mushroom": 5, "ender_pearl": 4}, "gold_trajectory": [{"action": "craft", "target": ["mossy_cobblestone", 6], "ingredients": {"cobblestone": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_cobblestone_stairs", 1], "ingredients": {"mossy_cobblestone": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x painting", "id": "textcraft.train.310", "max_steps": 50, "misc": {"target_items": {"painting": 3}, "initial_inventory": {"acacia_log": 4, "wither_rose": 3, "string": 16, "blue_orchid": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["stick", 6], "ingredients": {"acacia_planks": 12}, "result_count": 24}, {"action": "craft", "target": ["black_dye", 3], "ingredients": {"wither_rose": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["black_wool", 3], "ingredients": {"black_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["painting", 3], "ingredients": {"stick": 24, "black_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x jungle_fence_gate, 1x torch", "id": "textcraft.train.311", "max_steps": 50, "misc": {"target_items": {"jungle_fence_gate": 1, "torch": 1}, "initial_inventory": {"acacia_log": 2, "jungle_log": 2, "nether_star": 3, "spider_eye": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["jungle_fence_gate", 1], "ingredients": {"stick": 4, "jungle_planks": 2}, "result_count": 1}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x orange_carpet", "id": "textcraft.train.312", "max_steps": 50, "misc": {"target_items": {"orange_carpet": 3}, "initial_inventory": {"string": 34, "orange_tulip": 2, "ice": 5, "azure_bluet": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_carpet", 1], "ingredients": {"white_carpet": 8, "orange_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x birch_sign, 1x dark_oak_sign", "id": "textcraft.train.313", "max_steps": 50, "misc": {"target_items": {"birch_sign": 2, "dark_oak_sign": 1}, "initial_inventory": {"birch_log": 2, "acacia_log": 3, "dark_oak_log": 3, "ghast_tear": 5, "smooth_quartz": 2, "snowball": 1}, "gold_trajectory": [{"action": "craft", "target": ["birch_planks", 2], "ingredients": {"birch_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"birch_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["birch_sign", 1], "ingredients": {"birch_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["dark_oak_planks", 2], "ingredients": {"dark_oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["dark_oak_sign", 1], "ingredients": {"dark_oak_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x brick_wall, 1x spruce_sign", "id": "textcraft.train.314", "max_steps": 50, "misc": {"target_items": {"brick_wall": 2, "spruce_sign": 1}, "initial_inventory": {"brick": 34, "spruce_log": 2, "acacia_log": 1, "wither_skeleton_skull": 2, "honeycomb": 5, "cocoa_beans": 5, "glowstone_dust": 1}, "gold_trajectory": [{"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_wall", 1], "ingredients": {"bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["spruce_planks", 2], "ingredients": {"spruce_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"spruce_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["spruce_sign", 1], "ingredients": {"spruce_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x black_terracotta", "id": "textcraft.train.315", "max_steps": 50, "misc": {"target_items": {"black_terracotta": 3}, "initial_inventory": {"terracotta": 10, "wither_rose": 2, "prismarine_crystals": 4, "spruce_log": 2, "scute": 3, "rose_bush": 2}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_terracotta", 1], "ingredients": {"terracotta": 8, "black_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x green_carpet, 3x mossy_stone_brick_wall", "id": "textcraft.train.316", "max_steps": 50, "misc": {"target_items": {"green_carpet": 1, "mossy_stone_brick_wall": 3}, "initial_inventory": {"string": 26, "green_dye": 1, "stone": 12, "vine": 9, "oak_log": 2, "orange_tulip": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["green_carpet", 1], "ingredients": {"white_carpet": 8, "green_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["mossy_stone_bricks", 6], "ingredients": {"stone_bricks": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_stone_brick_wall", 1], "ingredients": {"mossy_stone_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x gray_stained_glass, 2x dark_prismarine_slab", "id": "textcraft.train.317", "max_steps": 50, "misc": {"target_items": {"gray_stained_glass": 2, "dark_prismarine_slab": 2}, "initial_inventory": {"glass": 9, "wither_rose": 6, "lily_of_the_valley": 1, "prismarine_shard": 25, "blue_orchid": 2, "jungle_log": 1, "cornflower": 1, "ink_sac": 3, "pumpkin": 3}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_stained_glass", 1], "ingredients": {"glass": 8, "gray_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["black_dye", 3], "ingredients": {"wither_rose": 3}, "result_count": 3}, {"action": "craft", "target": ["dark_prismarine", 3], "ingredients": {"prismarine_shard": 24, "black_dye": 3}, "result_count": 3}, {"action": "craft", "target": ["dark_prismarine_slab", 1], "ingredients": {"dark_prismarine": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x brown_carpet", "id": "textcraft.train.318", "max_steps": 50, "misc": {"target_items": {"brown_carpet": 3}, "initial_inventory": {"cocoa_beans": 3, "string": 9, "gunpowder": 3, "crying_obsidian": 3}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 2], "ingredients": {"cocoa_beans": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["brown_wool", 2], "ingredients": {"brown_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["brown_carpet", 1], "ingredients": {"brown_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x blue_wool", "id": "textcraft.train.319", "max_steps": 50, "misc": {"target_items": {"blue_wool": 1}, "initial_inventory": {"cornflower": 1, "string": 4, "dark_oak_log": 1, "stripped_crimson_stem": 3, "white_tulip": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["blue_wool", 1], "ingredients": {"blue_dye": 1, "white_wool": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x diorite_wall, 3x white_concrete_powder, 3x leather_leggings", "id": "textcraft.train.320", "max_steps": 50, "misc": {"target_items": {"diorite_wall": 1, "white_concrete_powder": 3, "leather_leggings": 3}, "initial_inventory": {"cobblestone": 8, "quartz": 9, "lily_of_the_valley": 1, "sand": 5, "gravel": 6, "rabbit_hide": 125, "smooth_quartz": 4, "orange_tulip": 3}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_wall", 1], "ingredients": {"diorite": 6}, "result_count": 6}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_concrete_powder", 1], "ingredients": {"white_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["leather", 21], "ingredients": {"rabbit_hide": 84}, "result_count": 21}, {"action": "craft", "target": ["leather_leggings", 3], "ingredients": {"leather": 21}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x orange_stained_glass_pane, 1x red_terracotta", "id": "textcraft.train.321", "max_steps": 50, "misc": {"target_items": {"orange_stained_glass_pane": 2, "red_terracotta": 1}, "initial_inventory": {"glass": 11, "orange_tulip": 1, "terracotta": 10, "rose_bush": 1, "nautilus_shell": 2, "prismarine_shard": 4}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_stained_glass", 1], "ingredients": {"glass": 8, "orange_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["orange_stained_glass_pane", 1], "ingredients": {"orange_stained_glass": 6}, "result_count": 16}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_terracotta", 1], "ingredients": {"terracotta": 8, "red_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x fire_charge", "id": "textcraft.train.322", "max_steps": 50, "misc": {"target_items": {"fire_charge": 1}, "initial_inventory": {"gunpowder": 1, "blaze_rod": 2, "terracotta": 1, "snowball": 4}, "gold_trajectory": [{"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["fire_charge", 1], "ingredients": {"gunpowder": 1, "blaze_powder": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x carrot_on_a_stick", "id": "textcraft.train.323", "max_steps": 50, "misc": {"target_items": {"carrot_on_a_stick": 3}, "initial_inventory": {"acacia_log": 2, "string": 6, "carrot": 4, "green_dye": 1, "clay_ball": 4, "quartz": 5, "scute": 5, "oak_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["fishing_rod", 3], "ingredients": {"stick": 9, "string": 6}, "result_count": 3}, {"action": "craft", "target": ["carrot_on_a_stick", 3], "ingredients": {"fishing_rod": 3, "carrot": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x mossy_stone_brick_wall, 1x gray_terracotta, 1x white_concrete_powder", "id": "textcraft.train.324", "max_steps": 50, "misc": {"target_items": {"mossy_stone_brick_wall": 1, "gray_terracotta": 1, "white_concrete_powder": 1}, "initial_inventory": {"stone": 12, "vine": 6, "terracotta": 12, "wither_rose": 1, "lily_of_the_valley": 2, "sand": 6, "gravel": 6, "nether_brick": 4, "apple": 5, "jungle_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["mossy_stone_bricks", 6], "ingredients": {"stone_bricks": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_stone_brick_wall", 1], "ingredients": {"mossy_stone_bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_terracotta", 1], "ingredients": {"terracotta": 8, "gray_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_concrete_powder", 1], "ingredients": {"white_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x gray_terracotta, 1x yellow_stained_glass, 1x leather_leggings", "id": "textcraft.train.325", "max_steps": 50, "misc": {"target_items": {"gray_terracotta": 1, "yellow_stained_glass": 1, "leather_leggings": 1}, "initial_inventory": {"terracotta": 12, "wither_rose": 1, "lily_of_the_valley": 2, "glass": 10, "dandelion": 1, "rabbit_hide": 31, "rose_bush": 2, "poppy": 4}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_terracotta", 1], "ingredients": {"terracotta": 8, "gray_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_stained_glass", 1], "ingredients": {"glass": 8, "yellow_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["leather", 7], "ingredients": {"rabbit_hide": 28}, "result_count": 7}, {"action": "craft", "target": ["leather_leggings", 1], "ingredients": {"leather": 7}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x cyan_wool, 3x dark_prismarine_slab, 2x polished_andesite_stairs", "id": "textcraft.train.326", "max_steps": 50, "misc": {"target_items": {"cyan_wool": 3, "dark_prismarine_slab": 3, "polished_andesite_stairs": 2}, "initial_inventory": {"cornflower": 3, "green_dye": 3, "string": 14, "prismarine_shard": 26, "wither_rose": 3, "cobblestone": 11, "quartz": 4, "smooth_sandstone": 2, "crimson_stem": 5}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["cyan_dye", 2], "ingredients": {"blue_dye": 2, "green_dye": 2}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["cyan_wool", 3], "ingredients": {"cyan_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["black_dye", 3], "ingredients": {"wither_rose": 3}, "result_count": 3}, {"action": "craft", "target": ["dark_prismarine", 3], "ingredients": {"prismarine_shard": 24, "black_dye": 3}, "result_count": 3}, {"action": "craft", "target": ["dark_prismarine_slab", 1], "ingredients": {"dark_prismarine": 3}, "result_count": 6}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 4], "ingredients": {"diorite": 4, "cobblestone": 4}, "result_count": 8}, {"action": "craft", "target": ["polished_andesite", 2], "ingredients": {"andesite": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_andesite_stairs", 1], "ingredients": {"polished_andesite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x gray_stained_glass, 1x diorite_slab, 2x prismarine_wall", "id": "textcraft.train.327", "max_steps": 50, "misc": {"target_items": {"gray_stained_glass": 1, "diorite_slab": 1, "prismarine_wall": 2}, "initial_inventory": {"glass": 8, "wither_rose": 1, "lily_of_the_valley": 2, "cobblestone": 4, "quartz": 6, "prismarine_shard": 25, "smooth_red_sandstone": 4, "allium": 5, "ink_sac": 3}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_stained_glass", 1], "ingredients": {"glass": 8, "gray_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["diorite_slab", 1], "ingredients": {"diorite": 3}, "result_count": 6}, {"action": "craft", "target": ["prismarine", 6], "ingredients": {"prismarine_shard": 24}, "result_count": 6}, {"action": "craft", "target": ["prismarine_wall", 1], "ingredients": {"prismarine": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x white_bed", "id": "textcraft.train.328", "max_steps": 50, "misc": {"target_items": {"white_bed": 1}, "initial_inventory": {"string": 13, "acacia_log": 2, "rose_bush": 5, "honeycomb": 2, "popped_chorus_fruit": 1}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["white_bed", 1], "ingredients": {"white_wool": 3, "acacia_planks": 3}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x yellow_banner", "id": "textcraft.train.329", "max_steps": 50, "misc": {"target_items": {"yellow_banner": 1}, "initial_inventory": {"dandelion": 6, "string": 34, "acacia_log": 1, "feather": 1, "rose_bush": 2, "nether_star": 4, "enchanted_golden_apple": 3, "blue_orchid": 2}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 6], "ingredients": {"dandelion": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["yellow_wool", 6], "ingredients": {"yellow_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["yellow_banner", 1], "ingredients": {"yellow_wool": 6, "stick": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x orange_stained_glass_pane", "id": "textcraft.train.330", "max_steps": 50, "misc": {"target_items": {"orange_stained_glass_pane": 2}, "initial_inventory": {"glass": 10, "orange_tulip": 2, "stripped_oak_log": 2, "sunflower": 5, "acacia_log": 2, "stripped_dark_oak_log": 3, "basalt": 3}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_stained_glass", 1], "ingredients": {"glass": 8, "orange_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["orange_stained_glass_pane", 1], "ingredients": {"orange_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 3x pink_stained_glass", "id": "textcraft.train.331", "max_steps": 50, "misc": {"target_items": {"pink_stained_glass": 3}, "initial_inventory": {"glass": 10, "pink_tulip": 1, "melon_slice": 1, "bamboo": 5, "terracotta": 2, "birch_log": 4, "prismarine_crystals": 5}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_stained_glass", 1], "ingredients": {"glass": 8, "pink_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x cut_red_sandstone_slab, 3x grindstone, 2x acacia_fence_gate", "id": "textcraft.train.332", "max_steps": 50, "misc": {"target_items": {"cut_red_sandstone_slab": 2, "grindstone": 3, "acacia_fence_gate": 2}, "initial_inventory": {"red_sand": 16, "acacia_log": 5, "stone": 3, "dark_oak_planks": 5, "glass": 2, "nether_star": 4, "oxeye_daisy": 5}, "gold_trajectory": [{"action": "craft", "target": ["red_sandstone", 4], "ingredients": {"red_sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone", 1], "ingredients": {"red_sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone_slab", 1], "ingredients": {"cut_red_sandstone": 3}, "result_count": 6}, {"action": "craft", "target": ["stick", 2], "ingredients": {"dark_oak_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["stone_slab", 1], "ingredients": {"stone": 3}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["grindstone", 3], "ingredients": {"stick": 6, "stone_slab": 3, "acacia_planks": 6}, "result_count": 3}, {"action": "craft", "target": ["stick", 2], "ingredients": {"tag:planks": 4}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["acacia_fence_gate", 2], "ingredients": {"stick": 8, "acacia_planks": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x red_nether_brick_stairs", "id": "textcraft.train.333", "max_steps": 50, "misc": {"target_items": {"red_nether_brick_stairs": 2}, "initial_inventory": {"nether_brick": 16, "nether_wart": 12, "prismarine_crystals": 1, "smooth_red_sandstone": 4, "dandelion": 3}, "gold_trajectory": [{"action": "craft", "target": ["red_nether_bricks", 6], "ingredients": {"nether_brick": 12, "nether_wart": 12}, "result_count": 6}, {"action": "craft", "target": ["red_nether_brick_stairs", 1], "ingredients": {"red_nether_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x prismarine_stairs, 2x wooden_hoe, 2x red_bed", "id": "textcraft.train.334", "max_steps": 50, "misc": {"target_items": {"prismarine_stairs": 2, "wooden_hoe": 2, "red_bed": 2}, "initial_inventory": {"prismarine_shard": 30, "acacia_log": 5, "rose_bush": 4, "string": 29, "jungle_planks": 5, "stripped_acacia_log": 4, "quartz": 3}, "gold_trajectory": [{"action": "craft", "target": ["prismarine", 6], "ingredients": {"prismarine_shard": 24}, "result_count": 6}, {"action": "craft", "target": ["prismarine_stairs", 1], "ingredients": {"prismarine": 6}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"jungle_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_hoe", 2], "ingredients": {"acacia_planks": 4, "stick": 4}, "result_count": 2}, {"action": "craft", "target": ["red_dye", 3], "ingredients": {"rose_bush": 3}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["red_wool", 6], "ingredients": {"red_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["red_bed", 2], "ingredients": {"red_wool": 6, "tag:planks": 6}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x orange_terracotta, 3x respawn_anchor, 1x stone_pickaxe", "id": "textcraft.train.335", "max_steps": 50, "misc": {"target_items": {"orange_terracotta": 2, "respawn_anchor": 3, "stone_pickaxe": 1}, "initial_inventory": {"terracotta": 10, "orange_tulip": 1, "crying_obsidian": 27, "glowstone_dust": 40, "blackstone": 4, "acacia_log": 1, "scute": 3, "rose_bush": 2, "nether_brick": 4, "pumpkin": 4, "ink_sac": 5}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_terracotta", 1], "ingredients": {"terracotta": 8, "orange_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["glowstone", 9], "ingredients": {"glowstone_dust": 36}, "result_count": 9}, {"action": "craft", "target": ["respawn_anchor", 3], "ingredients": {"crying_obsidian": 18, "glowstone": 9}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_pickaxe", 1], "ingredients": {"blackstone": 3, "stick": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x brown_bed, 3x gray_terracotta", "id": "textcraft.train.336", "max_steps": 50, "misc": {"target_items": {"brown_bed": 1, "gray_terracotta": 3}, "initial_inventory": {"string": 18, "acacia_log": 1, "cocoa_beans": 1, "terracotta": 9, "wither_rose": 2, "lily_of_the_valley": 2, "melon_slice": 4, "stripped_dark_oak_log": 4, "allium": 4, "sand": 3}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["white_bed", 1], "ingredients": {"white_wool": 3, "acacia_planks": 3}, "result_count": 1}, {"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_bed", 1], "ingredients": {"white_bed": 1, "brown_dye": 1}, "result_count": 1}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_terracotta", 1], "ingredients": {"terracotta": 8, "gray_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x orange_dye", "id": "textcraft.train.337", "max_steps": 50, "misc": {"target_items": {"orange_dye": 2}, "initial_inventory": {"orange_tulip": 3, "dirt": 2, "stripped_dark_oak_log": 4, "red_mushroom": 1}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 2], "ingredients": {"orange_tulip": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x item_frame", "id": "textcraft.train.338", "max_steps": 50, "misc": {"target_items": {"item_frame": 3}, "initial_inventory": {"acacia_log": 4, "rabbit_hide": 16, "stripped_spruce_log": 4, "peony": 2, "smooth_sandstone": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["stick", 6], "ingredients": {"acacia_planks": 12}, "result_count": 24}, {"action": "craft", "target": ["leather", 3], "ingredients": {"rabbit_hide": 12}, "result_count": 3}, {"action": "craft", "target": ["item_frame", 3], "ingredients": {"stick": 24, "leather": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x andesite_slab", "id": "textcraft.train.339", "max_steps": 50, "misc": {"target_items": {"andesite_slab": 1}, "initial_inventory": {"cobblestone": 4, "quartz": 3, "red_tulip": 2, "pink_tulip": 5, "end_stone": 4, "sunflower": 2}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["andesite", 2], "ingredients": {"diorite": 2, "cobblestone": 2}, "result_count": 4}, {"action": "craft", "target": ["andesite_slab", 1], "ingredients": {"andesite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x diorite_wall", "id": "textcraft.train.340", "max_steps": 50, "misc": {"target_items": {"diorite_wall": 3}, "initial_inventory": {"cobblestone": 8, "quartz": 6, "gunpowder": 4, "ink_sac": 5, "wither_rose": 3}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_wall", 1], "ingredients": {"diorite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x black_banner, 2x end_stone_brick_slab", "id": "textcraft.train.341", "max_steps": 50, "misc": {"target_items": {"black_banner": 1, "end_stone_brick_slab": 2}, "initial_inventory": {"wither_rose": 7, "string": 32, "acacia_log": 1, "end_stone": 5, "bone": 4, "oxeye_daisy": 3}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 6], "ingredients": {"wither_rose": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["black_wool", 6], "ingredients": {"black_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["black_banner", 1], "ingredients": {"black_wool": 6, "stick": 1}, "result_count": 1}, {"action": "craft", "target": ["end_stone_bricks", 1], "ingredients": {"end_stone": 4}, "result_count": 4}, {"action": "craft", "target": ["end_stone_brick_slab", 1], "ingredients": {"end_stone_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x mossy_stone_brick_stairs, 3x andesite_stairs", "id": "textcraft.train.342", "max_steps": 50, "misc": {"target_items": {"mossy_stone_brick_stairs": 1, "andesite_stairs": 3}, "initial_inventory": {"stone": 8, "vine": 7, "cobblestone": 9, "quartz": 4, "cooked_rabbit": 1, "poppy": 1, "nether_wart": 3, "basalt": 4, "gravel": 2}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["mossy_stone_bricks", 6], "ingredients": {"stone_bricks": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_stone_brick_stairs", 1], "ingredients": {"mossy_stone_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 3], "ingredients": {"diorite": 3, "cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["andesite_stairs", 1], "ingredients": {"andesite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x brown_banner", "id": "textcraft.train.343", "max_steps": 50, "misc": {"target_items": {"brown_banner": 3}, "initial_inventory": {"cocoa_beans": 26, "string": 85, "acacia_log": 2, "stripped_oak_log": 5, "ice": 1}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 18], "ingredients": {"cocoa_beans": 18}, "result_count": 18}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["brown_wool", 18], "ingredients": {"brown_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["brown_banner", 3], "ingredients": {"brown_wool": 18, "stick": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x chiseled_nether_bricks, 3x white_terracotta", "id": "textcraft.train.344", "max_steps": 50, "misc": {"target_items": {"chiseled_nether_bricks": 1, "white_terracotta": 3}, "initial_inventory": {"nether_brick": 12, "terracotta": 8, "lily_of_the_valley": 2, "honeycomb": 3, "enchanted_golden_apple": 2, "egg": 1}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_nether_bricks", 1], "ingredients": {"nether_brick_slab": 2}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_terracotta", 1], "ingredients": {"terracotta": 8, "white_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x polished_diorite, 1x purple_stained_glass", "id": "textcraft.train.345", "max_steps": 50, "misc": {"target_items": {"polished_diorite": 2, "purple_stained_glass": 1}, "initial_inventory": {"cobblestone": 6, "quartz": 6, "glass": 8, "cornflower": 1, "rose_bush": 1, "apple": 2, "sunflower": 4, "birch_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_stained_glass", 1], "ingredients": {"glass": 8, "purple_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x cartography_table, 1x nether_brick_stairs", "id": "textcraft.train.346", "max_steps": 50, "misc": {"target_items": {"cartography_table": 3, "nether_brick_stairs": 1}, "initial_inventory": {"sugar_cane": 7, "acacia_log": 4, "nether_brick": 30, "quartz": 2, "sand": 3}, "gold_trajectory": [{"action": "craft", "target": ["paper", 2], "ingredients": {"sugar_cane": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["cartography_table", 3], "ingredients": {"paper": 6, "acacia_planks": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_bricks", 6], "ingredients": {"nether_brick": 24}, "result_count": 6}, {"action": "craft", "target": ["nether_brick_stairs", 1], "ingredients": {"nether_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x chiseled_polished_blackstone, 3x purple_stained_glass", "id": "textcraft.train.347", "max_steps": 50, "misc": {"target_items": {"chiseled_polished_blackstone": 2, "purple_stained_glass": 3}, "initial_inventory": {"blackstone": 5, "glass": 8, "cornflower": 2, "rose_bush": 1, "terracotta": 3, "feather": 5, "blue_orchid": 1}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_slab", 1], "ingredients": {"polished_blackstone": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_polished_blackstone", 2], "ingredients": {"polished_blackstone_slab": 4}, "result_count": 2}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_stained_glass", 1], "ingredients": {"glass": 8, "purple_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x writable_book, 1x leather_leggings, 3x jungle_sign", "id": "textcraft.train.348", "max_steps": 50, "misc": {"target_items": {"writable_book": 2, "leather_leggings": 1, "jungle_sign": 3}, "initial_inventory": {"sugar_cane": 8, "rabbit_hide": 51, "ink_sac": 2, "feather": 3, "jungle_log": 2, "acacia_log": 2, "birch_log": 2, "stripped_spruce_log": 5, "vine": 1, "quartz": 1, "obsidian": 1}, "gold_trajectory": [{"action": "craft", "target": ["paper", 2], "ingredients": {"sugar_cane": 6}, "result_count": 6}, {"action": "craft", "target": ["leather", 2], "ingredients": {"rabbit_hide": 8}, "result_count": 2}, {"action": "craft", "target": ["book", 2], "ingredients": {"paper": 6, "leather": 2}, "result_count": 2}, {"action": "craft", "target": ["writable_book", 2], "ingredients": {"book": 2, "ink_sac": 2, "feather": 2}, "result_count": 2}, {"action": "craft", "target": ["leather", 7], "ingredients": {"rabbit_hide": 28}, "result_count": 7}, {"action": "craft", "target": ["leather_leggings", 1], "ingredients": {"leather": 7}, "result_count": 1}, {"action": "craft", "target": ["jungle_planks", 2], "ingredients": {"jungle_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"jungle_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_sign", 1], "ingredients": {"jungle_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x wooden_sword, 2x warped_fence_gate", "id": "textcraft.train.349", "max_steps": 50, "misc": {"target_items": {"wooden_sword": 1, "warped_fence_gate": 2}, "initial_inventory": {"acacia_log": 3, "warped_stem": 1, "apple": 5, "jungle_log": 3, "baked_potato": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["wooden_sword", 1], "ingredients": {"acacia_planks": 2, "stick": 1}, "result_count": 1}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["warped_planks", 1], "ingredients": {"warped_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["warped_fence_gate", 2], "ingredients": {"stick": 8, "warped_planks": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x polished_blackstone_brick_wall, 2x black_concrete_powder", "id": "textcraft.train.350", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_brick_wall": 3, "black_concrete_powder": 2}, "initial_inventory": {"blackstone": 10, "wither_rose": 1, "sand": 4, "gravel": 6, "rose_bush": 2, "melon_slice": 5, "carved_pumpkin": 2, "pumpkin": 2}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_bricks", 2], "ingredients": {"polished_blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_brick_wall", 1], "ingredients": {"polished_blackstone_bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_concrete_powder", 1], "ingredients": {"black_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x end_stone_brick_wall, 2x blue_stained_glass, 3x end_stone_brick_stairs", "id": "textcraft.train.351", "max_steps": 50, "misc": {"target_items": {"end_stone_brick_wall": 1, "blue_stained_glass": 2, "end_stone_brick_stairs": 3}, "initial_inventory": {"end_stone": 16, "glass": 8, "cornflower": 2, "allium": 1, "stripped_oak_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["end_stone_bricks", 2], "ingredients": {"end_stone": 8}, "result_count": 8}, {"action": "craft", "target": ["end_stone_brick_wall", 1], "ingredients": {"end_stone_bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_stained_glass", 1], "ingredients": {"glass": 8, "blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["end_stone_bricks", 1], "ingredients": {"end_stone": 4}, "result_count": 4}, {"action": "craft", "target": ["end_stone_brick_stairs", 1], "ingredients": {"end_stone_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x blue_ice", "id": "textcraft.train.352", "max_steps": 50, "misc": {"target_items": {"blue_ice": 1}, "initial_inventory": {"ice": 92, "enchanted_golden_apple": 5, "azure_bluet": 4, "apple": 4}, "gold_trajectory": [{"action": "craft", "target": ["packed_ice", 9], "ingredients": {"ice": 81}, "result_count": 9}, {"action": "craft", "target": ["blue_ice", 1], "ingredients": {"packed_ice": 9}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x end_stone_brick_wall", "id": "textcraft.train.353", "max_steps": 50, "misc": {"target_items": {"end_stone_brick_wall": 2}, "initial_inventory": {"end_stone": 8, "milk_bucket": 5, "basalt": 5, "cobblestone": 2, "blackstone": 4}, "gold_trajectory": [{"action": "craft", "target": ["end_stone_bricks", 2], "ingredients": {"end_stone": 8}, "result_count": 8}, {"action": "craft", "target": ["end_stone_brick_wall", 1], "ingredients": {"end_stone_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x white_stained_glass, 2x prismarine_slab", "id": "textcraft.train.354", "max_steps": 50, "misc": {"target_items": {"white_stained_glass": 2, "prismarine_slab": 2}, "initial_inventory": {"glass": 12, "lily_of_the_valley": 2, "prismarine_shard": 12, "baked_potato": 4, "popped_chorus_fruit": 2, "allium": 1, "oak_log": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_stained_glass", 1], "ingredients": {"glass": 8, "white_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["prismarine", 3], "ingredients": {"prismarine_shard": 12}, "result_count": 3}, {"action": "craft", "target": ["prismarine_slab", 1], "ingredients": {"prismarine": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x red_nether_brick_stairs, 2x blue_concrete_powder, 3x black_carpet", "id": "textcraft.train.355", "max_steps": 50, "misc": {"target_items": {"red_nether_brick_stairs": 2, "blue_concrete_powder": 2, "black_carpet": 3}, "initial_inventory": {"nether_brick": 14, "nether_wart": 15, "cornflower": 2, "sand": 5, "gravel": 6, "wither_rose": 2, "string": 11, "red_tulip": 5}, "gold_trajectory": [{"action": "craft", "target": ["red_nether_bricks", 6], "ingredients": {"nether_brick": 12, "nether_wart": 12}, "result_count": 6}, {"action": "craft", "target": ["red_nether_brick_stairs", 1], "ingredients": {"red_nether_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_concrete_powder", 1], "ingredients": {"blue_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["black_wool", 2], "ingredients": {"black_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["black_carpet", 1], "ingredients": {"black_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x prismarine_brick_stairs, 2x green_bed, 3x andesite_wall", "id": "textcraft.train.356", "max_steps": 50, "misc": {"target_items": {"prismarine_brick_stairs": 1, "green_bed": 2, "andesite_wall": 3}, "initial_inventory": {"prismarine_shard": 76, "green_dye": 6, "string": 35, "acacia_log": 2, "cobblestone": 9, "quartz": 6, "pumpkin": 2, "blackstone": 2, "red_sand": 5, "scute": 2, "oak_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["prismarine_bricks", 6], "ingredients": {"prismarine_shard": 54}, "result_count": 6}, {"action": "craft", "target": ["prismarine_brick_stairs", 1], "ingredients": {"prismarine_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["green_wool", 6], "ingredients": {"green_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["green_bed", 2], "ingredients": {"green_wool": 6, "acacia_planks": 6}, "result_count": 2}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 3], "ingredients": {"diorite": 3, "cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["andesite_wall", 1], "ingredients": {"andesite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x polished_blackstone_brick_wall", "id": "textcraft.train.357", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_brick_wall": 3}, "initial_inventory": {"blackstone": 11, "vine": 5, "azure_bluet": 5, "allium": 4, "cooked_rabbit": 4}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_bricks", 2], "ingredients": {"polished_blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_brick_wall", 1], "ingredients": {"polished_blackstone_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x wooden_pickaxe, 2x black_wool, 3x orange_stained_glass_pane", "id": "textcraft.train.358", "max_steps": 50, "misc": {"target_items": {"wooden_pickaxe": 3, "black_wool": 2, "orange_stained_glass_pane": 3}, "initial_inventory": {"acacia_log": 5, "wither_rose": 3, "string": 8, "glass": 8, "orange_tulip": 2, "spruce_log": 2, "dark_oak_log": 4, "pink_tulip": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["wooden_pickaxe", 3], "ingredients": {"acacia_planks": 9, "stick": 6}, "result_count": 3}, {"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["black_wool", 2], "ingredients": {"black_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_stained_glass", 1], "ingredients": {"glass": 8, "orange_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["orange_stained_glass_pane", 1], "ingredients": {"orange_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 2x cut_red_sandstone", "id": "textcraft.train.359", "max_steps": 50, "misc": {"target_items": {"cut_red_sandstone": 2}, "initial_inventory": {"red_sand": 16, "terracotta": 4, "rabbit_hide": 4}, "gold_trajectory": [{"action": "craft", "target": ["red_sandstone", 4], "ingredients": {"red_sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone", 1], "ingredients": {"red_sandstone": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x black_banner, 3x red_stained_glass_pane", "id": "textcraft.train.360", "max_steps": 50, "misc": {"target_items": {"black_banner": 3, "red_stained_glass_pane": 3}, "initial_inventory": {"wither_rose": 19, "string": 82, "acacia_log": 1, "glass": 8, "rose_bush": 1, "peony": 1, "snowball": 5, "enchanted_golden_apple": 4}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 18], "ingredients": {"wither_rose": 18}, "result_count": 18}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["black_wool", 18], "ingredients": {"black_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["black_banner", 3], "ingredients": {"black_wool": 18, "stick": 3}, "result_count": 3}, {"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "red_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x wooden_shovel, 1x granite_stairs", "id": "textcraft.train.361", "max_steps": 50, "misc": {"target_items": {"wooden_shovel": 1, "granite_stairs": 1}, "initial_inventory": {"acacia_log": 3, "cobblestone": 6, "quartz": 17, "end_stone": 2, "dandelion": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["wooden_shovel", 1], "ingredients": {"acacia_planks": 1, "stick": 2}, "result_count": 1}, {"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_stairs", 1], "ingredients": {"granite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x black_terracotta, 2x blue_banner", "id": "textcraft.train.362", "max_steps": 50, "misc": {"target_items": {"black_terracotta": 2, "blue_banner": 2}, "initial_inventory": {"terracotta": 8, "wither_rose": 1, "cornflower": 15, "string": 70, "acacia_log": 2, "snowball": 5, "rabbit_hide": 3}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_terracotta", 1], "ingredients": {"terracotta": 8, "black_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["blue_dye", 12], "ingredients": {"cornflower": 12}, "result_count": 12}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["blue_wool", 12], "ingredients": {"blue_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["blue_banner", 2], "ingredients": {"blue_wool": 12, "stick": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x pink_dye", "id": "textcraft.train.363", "max_steps": 50, "misc": {"target_items": {"pink_dye": 2}, "initial_inventory": {"pink_tulip": 2, "sunflower": 3, "nether_wart": 4, "quartz": 5, "carrot": 4}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 2], "ingredients": {"pink_tulip": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x wooden_shovel, 1x red_nether_brick_wall", "id": "textcraft.train.364", "max_steps": 50, "misc": {"target_items": {"wooden_shovel": 2, "red_nether_brick_wall": 1}, "initial_inventory": {"acacia_log": 3, "nether_brick": 12, "nether_wart": 15, "honeycomb": 2, "cooked_rabbit": 1, "sand": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["wooden_shovel", 2], "ingredients": {"acacia_planks": 2, "stick": 4}, "result_count": 2}, {"action": "craft", "target": ["red_nether_bricks", 6], "ingredients": {"nether_brick": 12, "nether_wart": 12}, "result_count": 6}, {"action": "craft", "target": ["red_nether_brick_wall", 1], "ingredients": {"red_nether_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x blue_terracotta", "id": "textcraft.train.365", "max_steps": 50, "misc": {"target_items": {"blue_terracotta": 3}, "initial_inventory": {"terracotta": 9, "cornflower": 2, "lily_of_the_valley": 3, "nether_wart": 2, "dandelion": 5, "acacia_log": 2, "sand": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_terracotta", 1], "ingredients": {"terracotta": 8, "blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x polished_blackstone_wall", "id": "textcraft.train.366", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_wall": 2}, "initial_inventory": {"blackstone": 10, "smooth_red_sandstone": 2, "gunpowder": 4, "flint": 5}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_wall", 1], "ingredients": {"polished_blackstone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x leather_leggings, 2x acacia_fence_gate", "id": "textcraft.train.367", "max_steps": 50, "misc": {"target_items": {"leather_leggings": 2, "acacia_fence_gate": 2}, "initial_inventory": {"rabbit_hide": 68, "acacia_log": 2, "brick": 2, "pink_tulip": 5, "glass": 1, "stripped_crimson_stem": 3}, "gold_trajectory": [{"action": "craft", "target": ["leather", 14], "ingredients": {"rabbit_hide": 56}, "result_count": 14}, {"action": "craft", "target": ["leather_leggings", 2], "ingredients": {"leather": 14}, "result_count": 2}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["acacia_fence_gate", 2], "ingredients": {"stick": 8, "acacia_planks": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x pink_stained_glass, 1x leather_helmet, 3x sugar", "id": "textcraft.train.368", "max_steps": 50, "misc": {"target_items": {"pink_stained_glass": 3, "leather_helmet": 1, "sugar": 3}, "initial_inventory": {"glass": 9, "pink_tulip": 2, "rabbit_hide": 27, "sugar_cane": 4, "melon_slice": 2, "dark_oak_log": 2, "nautilus_shell": 1}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_stained_glass", 1], "ingredients": {"glass": 8, "pink_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["leather", 5], "ingredients": {"rabbit_hide": 20}, "result_count": 5}, {"action": "craft", "target": ["leather_helmet", 1], "ingredients": {"leather": 5}, "result_count": 1}, {"action": "craft", "target": ["sugar", 3], "ingredients": {"sugar_cane": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x ladder", "id": "textcraft.train.369", "max_steps": 50, "misc": {"target_items": {"ladder": 2}, "initial_inventory": {"acacia_log": 2, "carved_pumpkin": 1, "birch_log": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["ladder", 1], "ingredients": {"stick": 7}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x wooden_pickaxe, 3x mossy_stone_brick_slab", "id": "textcraft.train.370", "max_steps": 50, "misc": {"target_items": {"wooden_pickaxe": 1, "mossy_stone_brick_slab": 3}, "initial_inventory": {"acacia_log": 3, "stone": 6, "vine": 3, "warped_planks": 4, "warped_fungus": 4, "blue_orchid": 1, "wither_rose": 1, "azure_bluet": 1}, "gold_trajectory": [{"action": "craft", "target": ["stick", 1], "ingredients": {"warped_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_pickaxe", 1], "ingredients": {"acacia_planks": 3, "stick": 2}, "result_count": 1}, {"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["mossy_stone_bricks", 3], "ingredients": {"stone_bricks": 3, "vine": 3}, "result_count": 3}, {"action": "craft", "target": ["mossy_stone_brick_slab", 1], "ingredients": {"mossy_stone_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x cyan_concrete_powder, 2x gray_wool", "id": "textcraft.train.371", "max_steps": 50, "misc": {"target_items": {"cyan_concrete_powder": 1, "gray_wool": 2}, "initial_inventory": {"cornflower": 2, "green_dye": 2, "sand": 5, "gravel": 6, "wither_rose": 1, "lily_of_the_valley": 1, "string": 10, "stone": 5, "lilac": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_concrete_powder", 1], "ingredients": {"cyan_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["gray_wool", 2], "ingredients": {"gray_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x dark_oak_fence_gate, 3x purple_wool, 2x polished_diorite_slab", "id": "textcraft.train.372", "max_steps": 50, "misc": {"target_items": {"dark_oak_fence_gate": 3, "purple_wool": 3, "polished_diorite_slab": 2}, "initial_inventory": {"acacia_log": 2, "dark_oak_log": 2, "cornflower": 2, "rose_bush": 1, "string": 13, "cobblestone": 6, "quartz": 6, "smooth_sandstone": 5, "glowstone_dust": 3, "wither_rose": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["dark_oak_planks", 2], "ingredients": {"dark_oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["dark_oak_fence_gate", 3], "ingredients": {"stick": 12, "dark_oak_planks": 6}, "result_count": 3}, {"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 2], "ingredients": {"blue_dye": 2, "red_dye": 2}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["purple_wool", 3], "ingredients": {"purple_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite_slab", 1], "ingredients": {"polished_diorite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x bookshelf", "id": "textcraft.train.373", "max_steps": 50, "misc": {"target_items": {"bookshelf": 2}, "initial_inventory": {"acacia_log": 3, "sugar_cane": 20, "rabbit_hide": 33, "gravel": 3, "stripped_crimson_stem": 5}, "gold_trajectory": [{"action": "craft", "target": ["paper", 6], "ingredients": {"sugar_cane": 18}, "result_count": 18}, {"action": "craft", "target": ["leather", 6], "ingredients": {"rabbit_hide": 24}, "result_count": 6}, {"action": "craft", "target": ["book", 6], "ingredients": {"paper": 18, "leather": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["bookshelf", 2], "ingredients": {"acacia_planks": 12, "book": 6}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x polished_blackstone_button, 2x arrow", "id": "textcraft.train.374", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_button": 2, "arrow": 2}, "initial_inventory": {"blackstone": 5, "flint": 1, "acacia_log": 2, "feather": 2, "nether_wart": 4}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_button", 2], "ingredients": {"polished_blackstone": 2}, "result_count": 2}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x jack_o_lantern", "id": "textcraft.train.375", "max_steps": 50, "misc": {"target_items": {"jack_o_lantern": 2}, "initial_inventory": {"carved_pumpkin": 3, "acacia_log": 1, "bone": 3, "wither_rose": 5, "dirt": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}, {"action": "craft", "target": ["jack_o_lantern", 2], "ingredients": {"carved_pumpkin": 2, "torch": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x spruce_fence_gate", "id": "textcraft.train.376", "max_steps": 50, "misc": {"target_items": {"spruce_fence_gate": 2}, "initial_inventory": {"acacia_log": 1, "spruce_log": 1, "cornflower": 4, "sand": 1, "stripped_acacia_log": 5, "cobblestone": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["spruce_planks", 1], "ingredients": {"spruce_log": 1}, "result_count": 4}, {"action": "craft", "target": ["spruce_fence_gate", 2], "ingredients": {"stick": 8, "spruce_planks": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x fishing_rod", "id": "textcraft.train.377", "max_steps": 50, "misc": {"target_items": {"fishing_rod": 2}, "initial_inventory": {"acacia_log": 1, "string": 5, "red_mushroom": 5, "stripped_crimson_stem": 3, "oak_log": 5, "stone": 2, "scute": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["fishing_rod", 2], "ingredients": {"stick": 6, "string": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x cyan_wool, 2x granite", "id": "textcraft.train.378", "max_steps": 50, "misc": {"target_items": {"cyan_wool": 2, "granite": 2}, "initial_inventory": {"cornflower": 2, "green_dye": 1, "string": 10, "cobblestone": 2, "quartz": 5, "beetroot": 3, "egg": 1, "bone": 2, "cooked_rabbit": 5}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["cyan_wool", 2], "ingredients": {"cyan_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["granite", 2], "ingredients": {"diorite": 2, "quartz": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x purple_concrete_powder", "id": "textcraft.train.379", "max_steps": 50, "misc": {"target_items": {"purple_concrete_powder": 3}, "initial_inventory": {"cornflower": 2, "rose_bush": 2, "sand": 4, "gravel": 5, "red_mushroom": 4, "birch_log": 5, "pink_tulip": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_concrete_powder", 1], "ingredients": {"purple_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x purple_stained_glass, 3x lime_concrete_powder", "id": "textcraft.train.380", "max_steps": 50, "misc": {"target_items": {"purple_stained_glass": 1, "lime_concrete_powder": 3}, "initial_inventory": {"glass": 8, "cornflower": 2, "rose_bush": 2, "green_dye": 1, "lily_of_the_valley": 1, "sand": 6, "gravel": 5, "nether_wart": 5, "stripped_acacia_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_stained_glass", 1], "ingredients": {"glass": 8, "purple_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_concrete_powder", 1], "ingredients": {"lime_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x jungle_sign, 1x oak_fence_gate", "id": "textcraft.train.381", "max_steps": 50, "misc": {"target_items": {"jungle_sign": 2, "oak_fence_gate": 1}, "initial_inventory": {"jungle_log": 3, "acacia_log": 3, "oak_log": 2, "blue_orchid": 1, "rose_bush": 2, "wither_skeleton_skull": 1}, "gold_trajectory": [{"action": "craft", "target": ["jungle_planks", 2], "ingredients": {"jungle_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"jungle_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_sign", 1], "ingredients": {"jungle_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["oak_planks", 1], "ingredients": {"oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["oak_fence_gate", 1], "ingredients": {"stick": 4, "oak_planks": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x stone_brick_wall", "id": "textcraft.train.382", "max_steps": 50, "misc": {"target_items": {"stone_brick_wall": 1}, "initial_inventory": {"stone": 12, "heart_of_the_sea": 3, "gravel": 1, "smooth_sandstone": 3, "apple": 2, "green_dye": 3}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["stone_brick_wall", 1], "ingredients": {"stone_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x granite_stairs", "id": "textcraft.train.383", "max_steps": 50, "misc": {"target_items": {"granite_stairs": 2}, "initial_inventory": {"cobblestone": 9, "quartz": 13, "rabbit_hide": 5, "basalt": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_stairs", 1], "ingredients": {"granite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x granite_wall", "id": "textcraft.train.384", "max_steps": 50, "misc": {"target_items": {"granite_wall": 1}, "initial_inventory": {"cobblestone": 7, "quartz": 18, "cornflower": 4, "glass": 3, "netherite_scrap": 3, "cocoa_beans": 2}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_wall", 1], "ingredients": {"granite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x magenta_dye, 2x cut_sandstone, 1x stone_pickaxe", "id": "textcraft.train.385", "max_steps": 50, "misc": {"target_items": {"magenta_dye": 3, "cut_sandstone": 2, "stone_pickaxe": 1}, "initial_inventory": {"allium": 3, "sand": 21, "blackstone": 4, "acacia_log": 1, "vine": 2, "dirt": 2, "brick": 1, "baked_potato": 4}, "gold_trajectory": [{"action": "craft", "target": ["magenta_dye", 3], "ingredients": {"allium": 3}, "result_count": 3}, {"action": "craft", "target": ["sandstone", 4], "ingredients": {"sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_sandstone", 1], "ingredients": {"sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_pickaxe", 1], "ingredients": {"blackstone": 3, "stick": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x yellow_banner", "id": "textcraft.train.386", "max_steps": 50, "misc": {"target_items": {"yellow_banner": 3}, "initial_inventory": {"dandelion": 21, "string": 99, "acacia_log": 1, "vine": 1, "pink_tulip": 5, "obsidian": 2, "allium": 5, "warped_fungus": 2}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 18], "ingredients": {"dandelion": 18}, "result_count": 18}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["yellow_wool", 18], "ingredients": {"yellow_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["yellow_banner", 3], "ingredients": {"yellow_wool": 18, "stick": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x red_bed, 3x yellow_terracotta", "id": "textcraft.train.387", "max_steps": 50, "misc": {"target_items": {"red_bed": 1, "yellow_terracotta": 3}, "initial_inventory": {"rose_bush": 3, "string": 17, "acacia_log": 1, "terracotta": 10, "dandelion": 1, "stripped_jungle_log": 3, "sugar_cane": 4, "honeycomb": 3, "carved_pumpkin": 2}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 2], "ingredients": {"rose_bush": 2}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["red_wool", 3], "ingredients": {"red_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["red_bed", 1], "ingredients": {"red_wool": 3, "acacia_planks": 3}, "result_count": 1}, {"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_terracotta", 1], "ingredients": {"terracotta": 8, "yellow_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x polished_blackstone_button", "id": "textcraft.train.388", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_button": 3}, "initial_inventory": {"blackstone": 6, "netherite_scrap": 4, "ink_sac": 2, "stripped_dark_oak_log": 2, "sunflower": 2}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_button", 3], "ingredients": {"polished_blackstone": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x cyan_terracotta", "id": "textcraft.train.389", "max_steps": 50, "misc": {"target_items": {"cyan_terracotta": 3}, "initial_inventory": {"terracotta": 10, "cornflower": 2, "green_dye": 2, "warped_fungus": 1, "blaze_rod": 1, "red_mushroom": 4, "rabbit_hide": 5, "warped_stem": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_terracotta", 1], "ingredients": {"terracotta": 8, "cyan_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x orange_stained_glass_pane, 2x red_banner, 3x polished_blackstone_button", "id": "textcraft.train.390", "max_steps": 50, "misc": {"target_items": {"orange_stained_glass_pane": 1, "red_banner": 2, "polished_blackstone_button": 3}, "initial_inventory": {"glass": 11, "orange_tulip": 2, "rose_bush": 9, "string": 67, "acacia_log": 2, "blackstone": 4, "smooth_sandstone": 2, "spider_eye": 5}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_stained_glass", 1], "ingredients": {"glass": 8, "orange_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["orange_stained_glass_pane", 1], "ingredients": {"orange_stained_glass": 6}, "result_count": 16}, {"action": "craft", "target": ["red_dye", 6], "ingredients": {"rose_bush": 6}, "result_count": 12}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["red_wool", 12], "ingredients": {"red_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["red_banner", 2], "ingredients": {"red_wool": 12, "stick": 2}, "result_count": 2}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_button", 3], "ingredients": {"polished_blackstone": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x wooden_sword", "id": "textcraft.train.391", "max_steps": 50, "misc": {"target_items": {"wooden_sword": 3}, "initial_inventory": {"acacia_log": 4, "cooked_rabbit": 2, "sunflower": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_sword", 3], "ingredients": {"acacia_planks": 6, "stick": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x quartz_pillar, 1x jungle_fence_gate", "id": "textcraft.train.392", "max_steps": 50, "misc": {"target_items": {"quartz_pillar": 2, "jungle_fence_gate": 1}, "initial_inventory": {"quartz": 8, "acacia_log": 2, "jungle_log": 1, "stripped_acacia_log": 3, "warped_stem": 5, "scute": 5, "sand": 4}, "gold_trajectory": [{"action": "craft", "target": ["quartz_block", 2], "ingredients": {"quartz": 8}, "result_count": 2}, {"action": "craft", "target": ["quartz_pillar", 1], "ingredients": {"quartz_block": 2}, "result_count": 2}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["jungle_fence_gate", 1], "ingredients": {"stick": 4, "jungle_planks": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x crimson_fence_gate", "id": "textcraft.train.393", "max_steps": 50, "misc": {"target_items": {"crimson_fence_gate": 1}, "initial_inventory": {"acacia_log": 1, "crimson_stem": 1, "cobblestone": 2, "ice": 3, "warped_stem": 3, "creeper_head": 2, "glass": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["crimson_planks", 1], "ingredients": {"crimson_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["crimson_fence_gate", 1], "ingredients": {"stick": 4, "crimson_planks": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x light_blue_terracotta, 2x prismarine_slab", "id": "textcraft.train.394", "max_steps": 50, "misc": {"target_items": {"light_blue_terracotta": 3, "prismarine_slab": 2}, "initial_inventory": {"terracotta": 8, "cornflower": 1, "lily_of_the_valley": 1, "prismarine_shard": 16, "oxeye_daisy": 4, "warped_stem": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_terracotta", 1], "ingredients": {"terracotta": 8, "light_blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["prismarine", 3], "ingredients": {"prismarine_shard": 12}, "result_count": 3}, {"action": "craft", "target": ["prismarine_slab", 1], "ingredients": {"prismarine": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x polished_blackstone_brick_wall", "id": "textcraft.train.395", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_brick_wall": 1}, "initial_inventory": {"blackstone": 9, "beetroot": 1, "spruce_log": 2, "warped_fungus": 5}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_bricks", 2], "ingredients": {"polished_blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_brick_wall", 1], "ingredients": {"polished_blackstone_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x white_banner, 2x purple_concrete_powder, 3x warped_fence_gate", "id": "textcraft.train.396", "max_steps": 50, "misc": {"target_items": {"white_banner": 1, "purple_concrete_powder": 2, "warped_fence_gate": 3}, "initial_inventory": {"string": 31, "acacia_log": 3, "cornflower": 2, "rose_bush": 2, "sand": 5, "gravel": 4, "warped_stem": 2, "wither_skeleton_skull": 3, "warped_fungus": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["white_banner", 1], "ingredients": {"white_wool": 6, "stick": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_concrete_powder", 1], "ingredients": {"purple_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["warped_planks", 2], "ingredients": {"warped_stem": 2}, "result_count": 8}, {"action": "craft", "target": ["warped_fence_gate", 3], "ingredients": {"stick": 12, "warped_planks": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x dark_oak_fence_gate", "id": "textcraft.train.397", "max_steps": 50, "misc": {"target_items": {"dark_oak_fence_gate": 1}, "initial_inventory": {"acacia_log": 1, "dark_oak_log": 2, "birch_log": 4, "flint": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_planks", 1], "ingredients": {"dark_oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_fence_gate", 1], "ingredients": {"stick": 4, "dark_oak_planks": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x orange_carpet", "id": "textcraft.train.398", "max_steps": 50, "misc": {"target_items": {"orange_carpet": 1}, "initial_inventory": {"string": 30, "orange_tulip": 2, "gravel": 3, "cornflower": 4, "pumpkin": 1}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_carpet", 1], "ingredients": {"white_carpet": 8, "orange_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x lime_concrete_powder", "id": "textcraft.train.399", "max_steps": 50, "misc": {"target_items": {"lime_concrete_powder": 2}, "initial_inventory": {"green_dye": 1, "lily_of_the_valley": 2, "sand": 4, "gravel": 4, "stripped_acacia_log": 4, "rabbit_hide": 3, "milk_bucket": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_concrete_powder", 1], "ingredients": {"lime_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x brown_stained_glass, 3x green_banner", "id": "textcraft.train.400", "max_steps": 50, "misc": {"target_items": {"brown_stained_glass": 2, "green_banner": 3}, "initial_inventory": {"glass": 11, "cocoa_beans": 1, "green_dye": 19, "string": 108, "acacia_log": 2, "flint": 1, "smooth_quartz": 2, "lilac": 4, "gravel": 3}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_stained_glass", 1], "ingredients": {"glass": 8, "brown_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["green_wool", 18], "ingredients": {"green_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["green_banner", 3], "ingredients": {"green_wool": 18, "stick": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x light_blue_terracotta, 2x brick_slab, 3x cyan_terracotta", "id": "textcraft.train.401", "max_steps": 50, "misc": {"target_items": {"light_blue_terracotta": 3, "brick_slab": 2, "cyan_terracotta": 3}, "initial_inventory": {"terracotta": 24, "cornflower": 3, "lily_of_the_valley": 1, "brick": 15, "green_dye": 1, "rabbit_hide": 5, "ender_pearl": 2, "pink_tulip": 1, "enchanted_golden_apple": 3, "smooth_sandstone": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_terracotta", 1], "ingredients": {"terracotta": 8, "light_blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["bricks", 3], "ingredients": {"brick": 12}, "result_count": 3}, {"action": "craft", "target": ["brick_slab", 1], "ingredients": {"bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_terracotta", 1], "ingredients": {"terracotta": 8, "cyan_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x dark_oak_sign", "id": "textcraft.train.402", "max_steps": 50, "misc": {"target_items": {"dark_oak_sign": 2}, "initial_inventory": {"dark_oak_log": 2, "acacia_log": 2, "orange_tulip": 3, "jungle_log": 1, "brick": 1, "basalt": 1, "ice": 1}, "gold_trajectory": [{"action": "craft", "target": ["dark_oak_planks", 2], "ingredients": {"dark_oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"dark_oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_sign", 1], "ingredients": {"dark_oak_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x chiseled_polished_blackstone, 2x granite, 2x mossy_stone_brick_stairs", "id": "textcraft.train.403", "max_steps": 50, "misc": {"target_items": {"chiseled_polished_blackstone": 1, "granite": 2, "mossy_stone_brick_stairs": 2}, "initial_inventory": {"blackstone": 6, "cobblestone": 3, "quartz": 6, "stone": 10, "vine": 8, "cocoa_beans": 2, "spruce_log": 1, "dandelion": 4}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_slab", 1], "ingredients": {"polished_blackstone": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_polished_blackstone", 1], "ingredients": {"polished_blackstone_slab": 2}, "result_count": 1}, {"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["granite", 2], "ingredients": {"diorite": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["mossy_stone_bricks", 6], "ingredients": {"stone_bricks": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_stone_brick_stairs", 1], "ingredients": {"mossy_stone_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x purple_terracotta", "id": "textcraft.train.404", "max_steps": 50, "misc": {"target_items": {"purple_terracotta": 2}, "initial_inventory": {"terracotta": 12, "cornflower": 1, "rose_bush": 1, "lilac": 5, "red_sand": 1, "prismarine_shard": 4, "red_mushroom": 3, "feather": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_terracotta", 1], "ingredients": {"terracotta": 8, "purple_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x ender_eye, 3x pink_stained_glass", "id": "textcraft.train.405", "max_steps": 50, "misc": {"target_items": {"ender_eye": 2, "pink_stained_glass": 3}, "initial_inventory": {"ender_pearl": 3, "blaze_rod": 1, "glass": 10, "pink_tulip": 1, "bone": 3, "red_sand": 3}, "gold_trajectory": [{"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["ender_eye", 2], "ingredients": {"ender_pearl": 2, "blaze_powder": 2}, "result_count": 2}, {"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_stained_glass", 1], "ingredients": {"glass": 8, "pink_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x magenta_dye", "id": "textcraft.train.406", "max_steps": 50, "misc": {"target_items": {"magenta_dye": 1}, "initial_inventory": {"allium": 1, "sunflower": 1, "lily_of_the_valley": 1, "nether_star": 1, "gravel": 3, "glass": 5}, "gold_trajectory": [{"action": "craft", "target": ["magenta_dye", 1], "ingredients": {"allium": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x jack_o_lantern", "id": "textcraft.train.407", "max_steps": 50, "misc": {"target_items": {"jack_o_lantern": 2}, "initial_inventory": {"carved_pumpkin": 3, "acacia_log": 1, "heart_of_the_sea": 4, "nautilus_shell": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}, {"action": "craft", "target": ["jack_o_lantern", 2], "ingredients": {"carved_pumpkin": 2, "torch": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x granite", "id": "textcraft.train.408", "max_steps": 50, "misc": {"target_items": {"granite": 1}, "initial_inventory": {"cobblestone": 2, "quartz": 4, "acacia_log": 1, "smooth_red_sandstone": 2, "basalt": 4, "azure_bluet": 1, "stone": 2}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["granite", 1], "ingredients": {"diorite": 1, "quartz": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x mossy_stone_brick_stairs", "id": "textcraft.train.409", "max_steps": 50, "misc": {"target_items": {"mossy_stone_brick_stairs": 3}, "initial_inventory": {"stone": 12, "vine": 8, "stripped_crimson_stem": 3, "smooth_red_sandstone": 3, "clay_ball": 4, "sunflower": 4, "enchanted_golden_apple": 2}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["mossy_stone_bricks", 6], "ingredients": {"stone_bricks": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_stone_brick_stairs", 1], "ingredients": {"mossy_stone_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x wooden_sword", "id": "textcraft.train.410", "max_steps": 50, "misc": {"target_items": {"wooden_sword": 1}, "initial_inventory": {"acacia_log": 2, "string": 3, "gravel": 1, "bone": 2, "vine": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["wooden_sword", 1], "ingredients": {"acacia_planks": 2, "stick": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x sandstone_wall", "id": "textcraft.train.411", "max_steps": 50, "misc": {"target_items": {"sandstone_wall": 3}, "initial_inventory": {"sand": 24, "pink_tulip": 5, "oak_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["sandstone", 6], "ingredients": {"sand": 24}, "result_count": 6}, {"action": "craft", "target": ["sandstone_wall", 1], "ingredients": {"sandstone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x wooden_axe, 1x stone_axe, 3x cut_sandstone", "id": "textcraft.train.412", "max_steps": 50, "misc": {"target_items": {"wooden_axe": 1, "stone_axe": 1, "cut_sandstone": 3}, "initial_inventory": {"acacia_log": 3, "blackstone": 4, "sand": 22, "dark_oak_planks": 4, "terracotta": 3, "rose_bush": 5, "carrot": 2, "pink_tulip": 4}, "gold_trajectory": [{"action": "craft", "target": ["stick", 1], "ingredients": {"dark_oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_axe", 1], "ingredients": {"acacia_planks": 3, "stick": 2}, "result_count": 1}, {"action": "craft", "target": ["stone_axe", 1], "ingredients": {"blackstone": 3, "stick": 2}, "result_count": 1}, {"action": "craft", "target": ["sandstone", 4], "ingredients": {"sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_sandstone", 1], "ingredients": {"sandstone": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x nether_brick_fence", "id": "textcraft.train.413", "max_steps": 50, "misc": {"target_items": {"nether_brick_fence": 2}, "initial_inventory": {"nether_brick": 18, "bamboo": 2, "stripped_oak_log": 2, "lily_of_the_valley": 5}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 4], "ingredients": {"nether_brick": 16}, "result_count": 4}, {"action": "craft", "target": ["nether_brick_fence", 1], "ingredients": {"nether_bricks": 4, "nether_brick": 2}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x dark_prismarine_slab", "id": "textcraft.train.414", "max_steps": 50, "misc": {"target_items": {"dark_prismarine_slab": 2}, "initial_inventory": {"prismarine_shard": 24, "wither_rose": 4, "bamboo": 2, "carved_pumpkin": 2, "warped_stem": 4, "spruce_log": 3, "stripped_oak_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 3], "ingredients": {"wither_rose": 3}, "result_count": 3}, {"action": "craft", "target": ["dark_prismarine", 3], "ingredients": {"prismarine_shard": 24, "black_dye": 3}, "result_count": 3}, {"action": "craft", "target": ["dark_prismarine_slab", 1], "ingredients": {"dark_prismarine": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x bookshelf", "id": "textcraft.train.415", "max_steps": 50, "misc": {"target_items": {"bookshelf": 1}, "initial_inventory": {"acacia_log": 3, "sugar_cane": 12, "rabbit_hide": 12, "stone": 4, "nether_brick": 5, "spider_eye": 3, "lilac": 1}, "gold_trajectory": [{"action": "craft", "target": ["paper", 3], "ingredients": {"sugar_cane": 9}, "result_count": 9}, {"action": "craft", "target": ["leather", 3], "ingredients": {"rabbit_hide": 12}, "result_count": 3}, {"action": "craft", "target": ["book", 3], "ingredients": {"paper": 9, "leather": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["bookshelf", 1], "ingredients": {"acacia_planks": 6, "book": 3}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x red_wool", "id": "textcraft.train.416", "max_steps": 50, "misc": {"target_items": {"red_wool": 2}, "initial_inventory": {"rose_bush": 2, "string": 11, "pink_tulip": 4, "gravel": 5, "red_tulip": 1}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["red_wool", 2], "ingredients": {"red_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x dark_prismarine_stairs", "id": "textcraft.train.417", "max_steps": 50, "misc": {"target_items": {"dark_prismarine_stairs": 2}, "initial_inventory": {"prismarine_shard": 52, "wither_rose": 9, "dirt": 4, "stripped_birch_log": 5, "apple": 1, "glowstone_dust": 2}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 6], "ingredients": {"wither_rose": 6}, "result_count": 6}, {"action": "craft", "target": ["dark_prismarine", 6], "ingredients": {"prismarine_shard": 48, "black_dye": 6}, "result_count": 6}, {"action": "craft", "target": ["dark_prismarine_stairs", 1], "ingredients": {"dark_prismarine": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x warped_fungus_on_a_stick", "id": "textcraft.train.418", "max_steps": 50, "misc": {"target_items": {"warped_fungus_on_a_stick": 3}, "initial_inventory": {"acacia_log": 2, "string": 9, "warped_fungus": 3, "dark_oak_log": 5, "wither_skeleton_skull": 1, "stripped_oak_log": 4, "stripped_spruce_log": 5, "crying_obsidian": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["fishing_rod", 3], "ingredients": {"stick": 9, "string": 6}, "result_count": 3}, {"action": "craft", "target": ["warped_fungus_on_a_stick", 3], "ingredients": {"fishing_rod": 3, "warped_fungus": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x polished_blackstone_pressure_plate", "id": "textcraft.train.419", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_pressure_plate": 2}, "initial_inventory": {"blackstone": 5, "nether_star": 4, "nether_wart": 2, "smooth_sandstone": 4, "crying_obsidian": 1}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_pressure_plate", 2], "ingredients": {"polished_blackstone": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x chiseled_polished_blackstone, 1x polished_blackstone_bricks, 2x fishing_rod", "id": "textcraft.train.420", "max_steps": 50, "misc": {"target_items": {"chiseled_polished_blackstone": 3, "polished_blackstone_bricks": 1, "fishing_rod": 2}, "initial_inventory": {"blackstone": 9, "acacia_log": 1, "string": 6, "stripped_spruce_log": 1, "warped_fungus": 5, "glass": 3}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_slab", 1], "ingredients": {"polished_blackstone": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_polished_blackstone", 3], "ingredients": {"polished_blackstone_slab": 6}, "result_count": 3}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_bricks", 1], "ingredients": {"polished_blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["fishing_rod", 2], "ingredients": {"stick": 6, "string": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x crimson_fence_gate", "id": "textcraft.train.421", "max_steps": 50, "misc": {"target_items": {"crimson_fence_gate": 3}, "initial_inventory": {"acacia_log": 2, "crimson_stem": 2, "brick": 3, "lilac": 1, "bone": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["crimson_planks", 2], "ingredients": {"crimson_stem": 2}, "result_count": 8}, {"action": "craft", "target": ["crimson_fence_gate", 3], "ingredients": {"stick": 12, "crimson_planks": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x pink_concrete_powder, 2x crimson_sign", "id": "textcraft.train.422", "max_steps": 50, "misc": {"target_items": {"pink_concrete_powder": 1, "crimson_sign": 2}, "initial_inventory": {"pink_tulip": 1, "sand": 5, "gravel": 4, "crimson_stem": 3, "acacia_log": 1, "pumpkin": 4, "oxeye_daisy": 3, "stripped_oak_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_concrete_powder", 1], "ingredients": {"pink_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["crimson_planks", 2], "ingredients": {"crimson_stem": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"crimson_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["crimson_sign", 1], "ingredients": {"crimson_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x pink_wool", "id": "textcraft.train.423", "max_steps": 50, "misc": {"target_items": {"pink_wool": 3}, "initial_inventory": {"pink_tulip": 3, "string": 12, "sugar_cane": 4, "obsidian": 5, "wither_skeleton_skull": 1, "creeper_head": 5}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 3], "ingredients": {"pink_tulip": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["pink_wool", 3], "ingredients": {"pink_dye": 3, "white_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x birch_fence_gate", "id": "textcraft.train.424", "max_steps": 50, "misc": {"target_items": {"birch_fence_gate": 1}, "initial_inventory": {"acacia_log": 1, "birch_log": 2, "red_mushroom": 2, "egg": 3, "vine": 5, "feather": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["birch_planks", 1], "ingredients": {"birch_log": 1}, "result_count": 4}, {"action": "craft", "target": ["birch_fence_gate", 1], "ingredients": {"stick": 4, "birch_planks": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x grindstone, 2x end_crystal", "id": "textcraft.train.425", "max_steps": 50, "misc": {"target_items": {"grindstone": 3, "end_crystal": 2}, "initial_inventory": {"acacia_log": 3, "stone": 4, "glass": 16, "ender_pearl": 2, "blaze_rod": 2, "ghast_tear": 3, "shulker_shell": 5, "nether_star": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["stone_slab", 1], "ingredients": {"stone": 3}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["grindstone", 3], "ingredients": {"stick": 6, "stone_slab": 3, "acacia_planks": 6}, "result_count": 3}, {"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["ender_eye", 2], "ingredients": {"ender_pearl": 2, "blaze_powder": 2}, "result_count": 2}, {"action": "craft", "target": ["end_crystal", 2], "ingredients": {"glass": 14, "ender_eye": 2, "ghast_tear": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x granite_wall", "id": "textcraft.train.426", "max_steps": 50, "misc": {"target_items": {"granite_wall": 2}, "initial_inventory": {"cobblestone": 9, "quartz": 15, "lily_of_the_valley": 5, "sand": 5, "red_tulip": 4, "popped_chorus_fruit": 5}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_wall", 1], "ingredients": {"granite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x red_nether_brick_stairs, 2x oak_fence", "id": "textcraft.train.427", "max_steps": 50, "misc": {"target_items": {"red_nether_brick_stairs": 1, "oak_fence": 2}, "initial_inventory": {"nether_brick": 13, "nether_wart": 12, "oak_log": 2, "acacia_log": 2, "red_sand": 5, "gravel": 4, "snowball": 1, "lilac": 3}, "gold_trajectory": [{"action": "craft", "target": ["red_nether_bricks", 6], "ingredients": {"nether_brick": 12, "nether_wart": 12}, "result_count": 6}, {"action": "craft", "target": ["red_nether_brick_stairs", 1], "ingredients": {"red_nether_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["oak_planks", 1], "ingredients": {"oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["oak_planks", 1], "ingredients": {"oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["oak_fence", 1], "ingredients": {"oak_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x dark_prismarine, 1x jungle_fence", "id": "textcraft.train.428", "max_steps": 50, "misc": {"target_items": {"dark_prismarine": 1, "jungle_fence": 1}, "initial_inventory": {"prismarine_shard": 9, "wither_rose": 2, "jungle_log": 2, "acacia_log": 1, "oak_log": 3}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["dark_prismarine", 1], "ingredients": {"prismarine_shard": 8, "black_dye": 1}, "result_count": 1}, {"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"jungle_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["jungle_fence", 1], "ingredients": {"jungle_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x mossy_stone_brick_wall, 2x diorite_stairs, 1x stone_axe", "id": "textcraft.train.429", "max_steps": 50, "misc": {"target_items": {"mossy_stone_brick_wall": 3, "diorite_stairs": 2, "stone_axe": 1}, "initial_inventory": {"stone": 12, "vine": 6, "cobblestone": 9, "quartz": 8, "blackstone": 3, "acacia_log": 1, "brown_mushroom": 3}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["mossy_stone_bricks", 6], "ingredients": {"stone_bricks": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_stone_brick_wall", 1], "ingredients": {"mossy_stone_bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_stairs", 1], "ingredients": {"diorite": 6}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_axe", 1], "ingredients": {"stone": 3, "stick": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x prismarine_brick_slab, 2x polished_blackstone_button, 3x book", "id": "textcraft.train.430", "max_steps": 50, "misc": {"target_items": {"prismarine_brick_slab": 3, "polished_blackstone_button": 2, "book": 3}, "initial_inventory": {"prismarine_shard": 39, "blackstone": 5, "sugar_cane": 11, "rabbit_hide": 18, "popped_chorus_fruit": 2, "carved_pumpkin": 4, "gunpowder": 1, "peony": 4}, "gold_trajectory": [{"action": "craft", "target": ["prismarine_bricks", 3], "ingredients": {"prismarine_shard": 27}, "result_count": 3}, {"action": "craft", "target": ["prismarine_brick_slab", 1], "ingredients": {"prismarine_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_button", 2], "ingredients": {"polished_blackstone": 2}, "result_count": 2}, {"action": "craft", "target": ["paper", 3], "ingredients": {"sugar_cane": 9}, "result_count": 9}, {"action": "craft", "target": ["leather", 3], "ingredients": {"rabbit_hide": 12}, "result_count": 3}, {"action": "craft", "target": ["book", 3], "ingredients": {"paper": 9, "leather": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x pumpkin_pie", "id": "textcraft.train.431", "max_steps": 50, "misc": {"target_items": {"pumpkin_pie": 2}, "initial_inventory": {"pumpkin": 2, "sugar_cane": 3, "egg": 3, "string": 1, "brick": 1, "ice": 5}, "gold_trajectory": [{"action": "craft", "target": ["sugar", 2], "ingredients": {"sugar_cane": 2}, "result_count": 2}, {"action": "craft", "target": ["pumpkin_pie", 2], "ingredients": {"pumpkin": 2, "sugar": 2, "egg": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x green_wool", "id": "textcraft.train.432", "max_steps": 50, "misc": {"target_items": {"green_wool": 2}, "initial_inventory": {"green_dye": 2, "string": 11, "stripped_dark_oak_log": 5, "sunflower": 3}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["green_wool", 2], "ingredients": {"green_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x polished_blackstone_stairs, 3x prismarine_wall", "id": "textcraft.train.433", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_stairs": 1, "prismarine_wall": 3}, "initial_inventory": {"blackstone": 10, "prismarine_shard": 31, "glass": 3, "pink_tulip": 4}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_stairs", 1], "ingredients": {"polished_blackstone": 6}, "result_count": 4}, {"action": "craft", "target": ["prismarine", 6], "ingredients": {"prismarine_shard": 24}, "result_count": 6}, {"action": "craft", "target": ["prismarine_wall", 1], "ingredients": {"prismarine": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x cartography_table", "id": "textcraft.train.434", "max_steps": 50, "misc": {"target_items": {"cartography_table": 3}, "initial_inventory": {"sugar_cane": 9, "acacia_log": 3, "egg": 2, "apple": 3, "stripped_dark_oak_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["paper", 2], "ingredients": {"sugar_cane": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["cartography_table", 3], "ingredients": {"paper": 6, "acacia_planks": 12}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x blue_terracotta", "id": "textcraft.train.435", "max_steps": 50, "misc": {"target_items": {"blue_terracotta": 3}, "initial_inventory": {"terracotta": 12, "cornflower": 2, "vine": 4, "feather": 2, "stripped_spruce_log": 1, "stripped_crimson_stem": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_terracotta", 1], "ingredients": {"terracotta": 8, "blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x prismarine_wall", "id": "textcraft.train.436", "max_steps": 50, "misc": {"target_items": {"prismarine_wall": 1}, "initial_inventory": {"prismarine_shard": 25, "cocoa_beans": 2, "pumpkin": 3, "string": 1, "flint": 4}, "gold_trajectory": [{"action": "craft", "target": ["prismarine", 6], "ingredients": {"prismarine_shard": 24}, "result_count": 6}, {"action": "craft", "target": ["prismarine_wall", 1], "ingredients": {"prismarine": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x dark_prismarine, 2x polished_granite", "id": "textcraft.train.437", "max_steps": 50, "misc": {"target_items": {"dark_prismarine": 1, "polished_granite": 2}, "initial_inventory": {"prismarine_shard": 12, "wither_rose": 2, "cobblestone": 5, "quartz": 10, "stripped_warped_stem": 1, "gravel": 4}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["dark_prismarine", 1], "ingredients": {"prismarine_shard": 8, "black_dye": 1}, "result_count": 1}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 4], "ingredients": {"diorite": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite", 1], "ingredients": {"granite": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x dark_prismarine_stairs", "id": "textcraft.train.438", "max_steps": 50, "misc": {"target_items": {"dark_prismarine_stairs": 2}, "initial_inventory": {"prismarine_shard": 64, "wither_rose": 9, "carved_pumpkin": 4, "spruce_log": 3, "end_stone": 1, "feather": 4}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 6], "ingredients": {"wither_rose": 6}, "result_count": 6}, {"action": "craft", "target": ["dark_prismarine", 6], "ingredients": {"prismarine_shard": 48, "black_dye": 6}, "result_count": 6}, {"action": "craft", "target": ["dark_prismarine_stairs", 1], "ingredients": {"dark_prismarine": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x spruce_fence_gate, 3x sandstone_wall", "id": "textcraft.train.439", "max_steps": 50, "misc": {"target_items": {"spruce_fence_gate": 3, "sandstone_wall": 3}, "initial_inventory": {"acacia_log": 3, "spruce_log": 3, "sand": 30, "cornflower": 3, "gunpowder": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["spruce_planks", 2], "ingredients": {"spruce_log": 2}, "result_count": 8}, {"action": "craft", "target": ["spruce_fence_gate", 3], "ingredients": {"stick": 12, "spruce_planks": 6}, "result_count": 3}, {"action": "craft", "target": ["sandstone", 6], "ingredients": {"sand": 24}, "result_count": 6}, {"action": "craft", "target": ["sandstone_wall", 1], "ingredients": {"sandstone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x mossy_stone_brick_slab, 1x oak_sign, 3x brown_concrete_powder", "id": "textcraft.train.440", "max_steps": 50, "misc": {"target_items": {"mossy_stone_brick_slab": 1, "oak_sign": 1, "brown_concrete_powder": 3}, "initial_inventory": {"stone": 6, "vine": 4, "oak_log": 3, "acacia_log": 1, "cocoa_beans": 1, "sand": 5, "gravel": 6, "cooked_rabbit": 2, "heart_of_the_sea": 4}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["mossy_stone_bricks", 3], "ingredients": {"stone_bricks": 3, "vine": 3}, "result_count": 3}, {"action": "craft", "target": ["mossy_stone_brick_slab", 1], "ingredients": {"mossy_stone_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["oak_planks", 2], "ingredients": {"oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["oak_sign", 1], "ingredients": {"oak_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_concrete_powder", 1], "ingredients": {"brown_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x brick_wall", "id": "textcraft.train.441", "max_steps": 50, "misc": {"target_items": {"brick_wall": 3}, "initial_inventory": {"brick": 28, "rabbit_hide": 5, "cooked_rabbit": 2, "ender_pearl": 1}, "gold_trajectory": [{"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_wall", 1], "ingredients": {"bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x leather_helmet", "id": "textcraft.train.442", "max_steps": 50, "misc": {"target_items": {"leather_helmet": 3}, "initial_inventory": {"rabbit_hide": 70, "carrot": 3, "wither_skeleton_skull": 3, "scute": 4, "blackstone": 3, "smooth_stone": 1}, "gold_trajectory": [{"action": "craft", "target": ["leather", 15], "ingredients": {"rabbit_hide": 60}, "result_count": 15}, {"action": "craft", "target": ["leather_helmet", 3], "ingredients": {"leather": 15}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x brick_stairs, 3x polished_blackstone_brick_slab", "id": "textcraft.train.443", "max_steps": 50, "misc": {"target_items": {"brick_stairs": 3, "polished_blackstone_brick_slab": 3}, "initial_inventory": {"brick": 35, "blackstone": 6, "flint": 4, "cornflower": 2}, "gold_trajectory": [{"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_stairs", 1], "ingredients": {"bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_bricks", 1], "ingredients": {"polished_blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_brick_slab", 1], "ingredients": {"polished_blackstone_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x diorite_slab, 2x warped_fungus_on_a_stick", "id": "textcraft.train.444", "max_steps": 50, "misc": {"target_items": {"diorite_slab": 1, "warped_fungus_on_a_stick": 2}, "initial_inventory": {"cobblestone": 6, "quartz": 4, "acacia_log": 2, "string": 6, "warped_fungus": 3, "stripped_birch_log": 3, "heart_of_the_sea": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["diorite_slab", 1], "ingredients": {"diorite": 3}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["fishing_rod", 2], "ingredients": {"stick": 6, "string": 4}, "result_count": 2}, {"action": "craft", "target": ["warped_fungus_on_a_stick", 2], "ingredients": {"fishing_rod": 2, "warped_fungus": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x orange_bed, 1x light_blue_concrete_powder", "id": "textcraft.train.445", "max_steps": 50, "misc": {"target_items": {"orange_bed": 1, "light_blue_concrete_powder": 1}, "initial_inventory": {"orange_tulip": 4, "string": 18, "acacia_log": 1, "cornflower": 2, "lily_of_the_valley": 2, "sand": 6, "gravel": 5, "dirt": 1, "gunpowder": 2, "crimson_stem": 2, "dandelion": 3}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 3], "ingredients": {"orange_tulip": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["orange_wool", 3], "ingredients": {"orange_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["orange_bed", 1], "ingredients": {"orange_wool": 3, "acacia_planks": 3}, "result_count": 1}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_concrete_powder", 1], "ingredients": {"light_blue_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x brown_wool, 2x stone_shovel, 2x acacia_fence", "id": "textcraft.train.446", "max_steps": 50, "misc": {"target_items": {"brown_wool": 2, "stone_shovel": 2, "acacia_fence": 2}, "initial_inventory": {"cocoa_beans": 2, "string": 10, "blackstone": 2, "acacia_log": 4, "spider_eye": 3}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 2], "ingredients": {"cocoa_beans": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["brown_wool", 2], "ingredients": {"brown_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_shovel", 2], "ingredients": {"blackstone": 2, "stick": 4}, "result_count": 2}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_fence", 1], "ingredients": {"acacia_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x pink_stained_glass", "id": "textcraft.train.447", "max_steps": 50, "misc": {"target_items": {"pink_stained_glass": 2}, "initial_inventory": {"glass": 10, "pink_tulip": 1, "gravel": 1, "carved_pumpkin": 3, "baked_potato": 3, "brick": 5, "poppy": 5}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_stained_glass", 1], "ingredients": {"glass": 8, "pink_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x yellow_carpet", "id": "textcraft.train.448", "max_steps": 50, "misc": {"target_items": {"yellow_carpet": 3}, "initial_inventory": {"dandelion": 3, "string": 12, "oxeye_daisy": 4, "end_stone": 2, "rabbit_hide": 4}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 2], "ingredients": {"dandelion": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["yellow_wool", 2], "ingredients": {"yellow_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["yellow_carpet", 1], "ingredients": {"yellow_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x green_wool, 1x polished_diorite", "id": "textcraft.train.449", "max_steps": 50, "misc": {"target_items": {"green_wool": 3, "polished_diorite": 1}, "initial_inventory": {"green_dye": 4, "string": 12, "cobblestone": 4, "quartz": 6, "honeycomb": 5, "birch_log": 3, "stripped_crimson_stem": 5, "wither_skeleton_skull": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["green_wool", 3], "ingredients": {"green_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x pink_stained_glass, 2x purple_wool", "id": "textcraft.train.450", "max_steps": 50, "misc": {"target_items": {"pink_stained_glass": 1, "purple_wool": 2}, "initial_inventory": {"glass": 8, "pink_tulip": 2, "cornflower": 2, "rose_bush": 1, "string": 8, "spruce_log": 1, "heart_of_the_sea": 5}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_stained_glass", 1], "ingredients": {"glass": 8, "pink_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["purple_wool", 2], "ingredients": {"purple_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x stone_brick_stairs", "id": "textcraft.train.451", "max_steps": 50, "misc": {"target_items": {"stone_brick_stairs": 3}, "initial_inventory": {"stone": 11, "ghast_tear": 1, "nautilus_shell": 5, "nether_wart": 5}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["stone_brick_stairs", 1], "ingredients": {"stone_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x black_stained_glass_pane", "id": "textcraft.train.452", "max_steps": 50, "misc": {"target_items": {"black_stained_glass_pane": 2}, "initial_inventory": {"glass": 11, "wither_rose": 2, "enchanted_golden_apple": 5, "stripped_birch_log": 5, "pumpkin": 4}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_stained_glass", 1], "ingredients": {"glass": 8, "black_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["black_stained_glass_pane", 1], "ingredients": {"black_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 1x lime_concrete_powder, 3x pumpkin_pie, 1x acacia_sign", "id": "textcraft.train.453", "max_steps": 50, "misc": {"target_items": {"lime_concrete_powder": 1, "pumpkin_pie": 3, "acacia_sign": 1}, "initial_inventory": {"green_dye": 1, "lily_of_the_valley": 1, "sand": 6, "gravel": 6, "pumpkin": 3, "sugar_cane": 3, "egg": 3, "acacia_log": 4, "smooth_red_sandstone": 3, "poppy": 1, "gunpowder": 3}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_concrete_powder", 1], "ingredients": {"lime_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["sugar", 3], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["pumpkin_pie", 3], "ingredients": {"pumpkin": 3, "sugar": 3, "egg": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_sign", 1], "ingredients": {"acacia_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x brown_stained_glass, 2x polished_diorite", "id": "textcraft.train.454", "max_steps": 50, "misc": {"target_items": {"brown_stained_glass": 2, "polished_diorite": 2}, "initial_inventory": {"glass": 8, "cocoa_beans": 2, "cobblestone": 4, "quartz": 6, "crying_obsidian": 5, "jungle_log": 1, "gravel": 2, "crimson_stem": 4}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_stained_glass", 1], "ingredients": {"glass": 8, "brown_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x lime_terracotta, 3x stone_sword", "id": "textcraft.train.455", "max_steps": 50, "misc": {"target_items": {"lime_terracotta": 1, "stone_sword": 3}, "initial_inventory": {"terracotta": 10, "green_dye": 1, "lily_of_the_valley": 1, "blackstone": 6, "acacia_log": 2, "red_sand": 1, "stripped_acacia_log": 3, "sand": 4, "oxeye_daisy": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_terracotta", 1], "ingredients": {"terracotta": 8, "lime_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_sword", 3], "ingredients": {"blackstone": 6, "stick": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x stone_brick_wall, 1x stone_brick_slab", "id": "textcraft.train.456", "max_steps": 50, "misc": {"target_items": {"stone_brick_wall": 3, "stone_brick_slab": 1}, "initial_inventory": {"stone": 18, "jungle_log": 4, "warped_fungus": 4}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["stone_brick_wall", 1], "ingredients": {"stone_bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["stone_brick_slab", 1], "ingredients": {"stone_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x dark_prismarine_slab", "id": "textcraft.train.457", "max_steps": 50, "misc": {"target_items": {"dark_prismarine_slab": 3}, "initial_inventory": {"prismarine_shard": 29, "wither_rose": 3, "smooth_red_sandstone": 3, "red_tulip": 3, "terracotta": 2}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 3], "ingredients": {"wither_rose": 3}, "result_count": 3}, {"action": "craft", "target": ["dark_prismarine", 3], "ingredients": {"prismarine_shard": 24, "black_dye": 3}, "result_count": 3}, {"action": "craft", "target": ["dark_prismarine_slab", 1], "ingredients": {"dark_prismarine": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x polished_blackstone_button, 1x wooden_axe", "id": "textcraft.train.458", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_button": 3, "wooden_axe": 1}, "initial_inventory": {"blackstone": 6, "acacia_log": 3, "spruce_planks": 3, "shulker_shell": 4, "stripped_birch_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_button", 3], "ingredients": {"polished_blackstone": 3}, "result_count": 3}, {"action": "craft", "target": ["stick", 1], "ingredients": {"spruce_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_axe", 1], "ingredients": {"acacia_planks": 3, "stick": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x white_banner", "id": "textcraft.train.459", "max_steps": 50, "misc": {"target_items": {"white_banner": 2}, "initial_inventory": {"string": 56, "acacia_log": 1, "ink_sac": 1, "baked_potato": 2, "stripped_warped_stem": 3, "prismarine_crystals": 1}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["white_banner", 2], "ingredients": {"white_wool": 12, "stick": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x chiseled_stone_bricks", "id": "textcraft.train.460", "max_steps": 50, "misc": {"target_items": {"chiseled_stone_bricks": 1}, "initial_inventory": {"stone": 6, "sugar_cane": 1, "nether_brick": 5}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["stone_brick_slab", 1], "ingredients": {"stone_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_stone_bricks", 1], "ingredients": {"stone_brick_slab": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x polished_blackstone_pressure_plate, 2x spruce_fence_gate", "id": "textcraft.train.461", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_pressure_plate": 3, "spruce_fence_gate": 2}, "initial_inventory": {"blackstone": 11, "acacia_log": 2, "spruce_log": 2, "warped_stem": 1, "snowball": 2, "stripped_dark_oak_log": 5}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_pressure_plate", 3], "ingredients": {"polished_blackstone": 6}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["spruce_planks", 1], "ingredients": {"spruce_log": 1}, "result_count": 4}, {"action": "craft", "target": ["spruce_fence_gate", 2], "ingredients": {"stick": 8, "spruce_planks": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x stone_pickaxe", "id": "textcraft.train.462", "max_steps": 50, "misc": {"target_items": {"stone_pickaxe": 1}, "initial_inventory": {"blackstone": 4, "acacia_log": 2, "rose_bush": 4, "ghast_tear": 2, "quartz": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_pickaxe", 1], "ingredients": {"blackstone": 3, "stick": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x fire_charge", "id": "textcraft.train.463", "max_steps": 50, "misc": {"target_items": {"fire_charge": 1}, "initial_inventory": {"gunpowder": 1, "blaze_rod": 1, "jungle_log": 2, "brick": 1, "lily_of_the_valley": 3}, "gold_trajectory": [{"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["fire_charge", 1], "ingredients": {"gunpowder": 1, "blaze_powder": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x diorite_slab, 2x grindstone, 3x stone_brick_wall", "id": "textcraft.train.464", "max_steps": 50, "misc": {"target_items": {"diorite_slab": 1, "grindstone": 2, "stone_brick_wall": 3}, "initial_inventory": {"cobblestone": 5, "quartz": 5, "acacia_log": 3, "stone": 16, "dark_oak_planks": 6, "lily_of_the_valley": 5, "stripped_spruce_log": 1, "carved_pumpkin": 3, "orange_tulip": 5}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["diorite_slab", 1], "ingredients": {"diorite": 3}, "result_count": 6}, {"action": "craft", "target": ["stick", 1], "ingredients": {"dark_oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_slab", 1], "ingredients": {"stone": 3}, "result_count": 6}, {"action": "craft", "target": ["grindstone", 2], "ingredients": {"stick": 4, "stone_slab": 2, "dark_oak_planks": 4}, "result_count": 2}, {"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["stone_brick_wall", 1], "ingredients": {"stone_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x granite_slab", "id": "textcraft.train.465", "max_steps": 50, "misc": {"target_items": {"granite_slab": 1}, "initial_inventory": {"cobblestone": 6, "quartz": 10, "dirt": 1, "gunpowder": 1, "spruce_log": 3, "acacia_log": 4, "netherite_scrap": 1}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 3], "ingredients": {"diorite": 3, "quartz": 3}, "result_count": 3}, {"action": "craft", "target": ["granite_slab", 1], "ingredients": {"granite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x nether_brick_fence", "id": "textcraft.train.466", "max_steps": 50, "misc": {"target_items": {"nether_brick_fence": 3}, "initial_inventory": {"nether_brick": 24, "warped_stem": 4, "red_tulip": 4, "sunflower": 2, "melon_slice": 4, "lilac": 4}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 4], "ingredients": {"nether_brick": 16}, "result_count": 4}, {"action": "craft", "target": ["nether_brick_fence", 1], "ingredients": {"nether_bricks": 4, "nether_brick": 2}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x blue_terracotta, 2x yellow_wool", "id": "textcraft.train.467", "max_steps": 50, "misc": {"target_items": {"blue_terracotta": 1, "yellow_wool": 2}, "initial_inventory": {"terracotta": 12, "cornflower": 2, "dandelion": 3, "string": 8, "stripped_warped_stem": 4, "apple": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_terracotta", 1], "ingredients": {"terracotta": 8, "blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["yellow_dye", 2], "ingredients": {"dandelion": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["yellow_wool", 2], "ingredients": {"yellow_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x orange_concrete_powder, 2x polished_andesite_slab, 2x lime_concrete_powder", "id": "textcraft.train.468", "max_steps": 50, "misc": {"target_items": {"orange_concrete_powder": 2, "polished_andesite_slab": 2, "lime_concrete_powder": 2}, "initial_inventory": {"orange_tulip": 2, "sand": 12, "gravel": 8, "cobblestone": 4, "quartz": 3, "green_dye": 2, "lily_of_the_valley": 2, "jungle_log": 4, "warped_stem": 4, "oak_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_concrete_powder", 1], "ingredients": {"orange_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["andesite", 2], "ingredients": {"diorite": 2, "cobblestone": 2}, "result_count": 4}, {"action": "craft", "target": ["polished_andesite", 1], "ingredients": {"andesite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_andesite_slab", 1], "ingredients": {"polished_andesite": 3}, "result_count": 6}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_concrete_powder", 1], "ingredients": {"lime_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x purple_dye", "id": "textcraft.train.469", "max_steps": 50, "misc": {"target_items": {"purple_dye": 1}, "initial_inventory": {"cornflower": 1, "rose_bush": 1, "dirt": 1, "lilac": 5, "jungle_log": 5}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x yellow_concrete_powder", "id": "textcraft.train.470", "max_steps": 50, "misc": {"target_items": {"yellow_concrete_powder": 1}, "initial_inventory": {"dandelion": 1, "sand": 4, "gravel": 5, "pumpkin": 4, "bone": 4, "brick": 2, "snowball": 3}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_concrete_powder", 1], "ingredients": {"yellow_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x blue_terracotta", "id": "textcraft.train.471", "max_steps": 50, "misc": {"target_items": {"blue_terracotta": 1}, "initial_inventory": {"terracotta": 8, "cornflower": 1, "birch_log": 5, "shulker_shell": 3, "spider_eye": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_terracotta", 1], "ingredients": {"terracotta": 8, "blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x yellow_stained_glass", "id": "textcraft.train.472", "max_steps": 50, "misc": {"target_items": {"yellow_stained_glass": 3}, "initial_inventory": {"glass": 9, "dandelion": 2, "bone": 2, "white_tulip": 5}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_stained_glass", 1], "ingredients": {"glass": 8, "yellow_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x purple_dye, 3x red_nether_brick_wall, 1x cyan_terracotta", "id": "textcraft.train.473", "max_steps": 50, "misc": {"target_items": {"purple_dye": 3, "red_nether_brick_wall": 3, "cyan_terracotta": 1}, "initial_inventory": {"cornflower": 3, "rose_bush": 2, "nether_brick": 17, "nether_wart": 16, "terracotta": 12, "green_dye": 2, "spruce_log": 2, "string": 3, "honeycomb": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 2], "ingredients": {"blue_dye": 2, "red_dye": 2}, "result_count": 4}, {"action": "craft", "target": ["red_nether_bricks", 6], "ingredients": {"nether_brick": 12, "nether_wart": 12}, "result_count": 6}, {"action": "craft", "target": ["red_nether_brick_wall", 1], "ingredients": {"red_nether_bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_terracotta", 1], "ingredients": {"terracotta": 8, "cyan_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x bow, 3x red_terracotta, 1x cyan_terracotta", "id": "textcraft.train.474", "max_steps": 50, "misc": {"target_items": {"bow": 1, "red_terracotta": 3, "cyan_terracotta": 1}, "initial_inventory": {"acacia_log": 1, "string": 4, "terracotta": 18, "rose_bush": 2, "cornflower": 2, "green_dye": 2, "wither_rose": 1, "orange_tulip": 4, "stripped_spruce_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["bow", 1], "ingredients": {"stick": 3, "string": 3}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_terracotta", 1], "ingredients": {"terracotta": 8, "red_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_terracotta", 1], "ingredients": {"terracotta": 8, "cyan_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x black_bed", "id": "textcraft.train.475", "max_steps": 50, "misc": {"target_items": {"black_bed": 2}, "initial_inventory": {"wither_rose": 9, "string": 34, "acacia_log": 3, "smooth_red_sandstone": 4, "pink_tulip": 2, "cobblestone": 2, "apple": 5, "birch_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 6], "ingredients": {"wither_rose": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["black_wool", 6], "ingredients": {"black_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["black_bed", 2], "ingredients": {"black_wool": 6, "acacia_planks": 6}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x cartography_table, 1x brick_slab", "id": "textcraft.train.476", "max_steps": 50, "misc": {"target_items": {"cartography_table": 2, "brick_slab": 1}, "initial_inventory": {"sugar_cane": 7, "acacia_log": 2, "brick": 18, "blaze_rod": 5, "peony": 5, "obsidian": 3}, "gold_trajectory": [{"action": "craft", "target": ["paper", 2], "ingredients": {"sugar_cane": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["cartography_table", 2], "ingredients": {"paper": 4, "acacia_planks": 8}, "result_count": 2}, {"action": "craft", "target": ["bricks", 3], "ingredients": {"brick": 12}, "result_count": 3}, {"action": "craft", "target": ["brick_slab", 1], "ingredients": {"bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x polished_blackstone_stairs", "id": "textcraft.train.477", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_stairs": 2}, "initial_inventory": {"blackstone": 9, "brick": 3, "carrot": 4}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_stairs", 1], "ingredients": {"polished_blackstone": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x cut_red_sandstone", "id": "textcraft.train.478", "max_steps": 50, "misc": {"target_items": {"cut_red_sandstone": 2}, "initial_inventory": {"red_sand": 20, "quartz": 3, "flint": 1}, "gold_trajectory": [{"action": "craft", "target": ["red_sandstone", 4], "ingredients": {"red_sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone", 1], "ingredients": {"red_sandstone": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x blue_wool", "id": "textcraft.train.479", "max_steps": 50, "misc": {"target_items": {"blue_wool": 3}, "initial_inventory": {"cornflower": 3, "string": 12, "wither_skeleton_skull": 5, "allium": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 3], "ingredients": {"cornflower": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["blue_wool", 3], "ingredients": {"blue_dye": 3, "white_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x stone_hoe, 3x polished_blackstone_button, 2x orange_dye", "id": "textcraft.train.480", "max_steps": 50, "misc": {"target_items": {"stone_hoe": 1, "polished_blackstone_button": 3, "orange_dye": 2}, "initial_inventory": {"blackstone": 8, "acacia_log": 2, "orange_tulip": 2, "crying_obsidian": 4, "end_stone": 5, "lily_of_the_valley": 2, "brown_mushroom": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_hoe", 1], "ingredients": {"blackstone": 2, "stick": 2}, "result_count": 1}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_button", 3], "ingredients": {"polished_blackstone": 3}, "result_count": 3}, {"action": "craft", "target": ["orange_dye", 2], "ingredients": {"orange_tulip": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x polished_blackstone_stairs", "id": "textcraft.train.481", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_stairs": 3}, "initial_inventory": {"blackstone": 11, "ender_pearl": 4, "carrot": 5, "orange_tulip": 2}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_stairs", 1], "ingredients": {"polished_blackstone": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x stone_brick_stairs", "id": "textcraft.train.482", "max_steps": 50, "misc": {"target_items": {"stone_brick_stairs": 2}, "initial_inventory": {"stone": 12, "orange_tulip": 1, "brown_mushroom": 3, "stripped_birch_log": 3}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["stone_brick_stairs", 1], "ingredients": {"stone_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x birch_fence_gate, 2x white_banner, 2x orange_stained_glass", "id": "textcraft.train.483", "max_steps": 50, "misc": {"target_items": {"birch_fence_gate": 1, "white_banner": 2, "orange_stained_glass": 2}, "initial_inventory": {"acacia_log": 3, "birch_log": 1, "string": 66, "glass": 9, "orange_tulip": 1, "obsidian": 5, "heart_of_the_sea": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["birch_planks", 1], "ingredients": {"birch_log": 1}, "result_count": 4}, {"action": "craft", "target": ["birch_fence_gate", 1], "ingredients": {"stick": 4, "birch_planks": 2}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["white_banner", 2], "ingredients": {"white_wool": 12, "stick": 2}, "result_count": 2}, {"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_stained_glass", 1], "ingredients": {"glass": 8, "orange_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x red_nether_brick_stairs", "id": "textcraft.train.484", "max_steps": 50, "misc": {"target_items": {"red_nether_brick_stairs": 2}, "initial_inventory": {"nether_brick": 15, "nether_wart": 13, "oak_log": 1, "warped_stem": 5, "sand": 5}, "gold_trajectory": [{"action": "craft", "target": ["red_nether_bricks", 6], "ingredients": {"nether_brick": 12, "nether_wart": 12}, "result_count": 6}, {"action": "craft", "target": ["red_nether_brick_stairs", 1], "ingredients": {"red_nether_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x polished_granite_slab, 3x nether_brick_slab", "id": "textcraft.train.485", "max_steps": 50, "misc": {"target_items": {"polished_granite_slab": 1, "nether_brick_slab": 3}, "initial_inventory": {"cobblestone": 5, "quartz": 8, "nether_brick": 12, "stripped_spruce_log": 4, "warped_stem": 1}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 4], "ingredients": {"diorite": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite", 1], "ingredients": {"granite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite_slab", 1], "ingredients": {"polished_granite": 3}, "result_count": 6}, {"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x mossy_cobblestone_stairs, 1x red_banner", "id": "textcraft.train.486", "max_steps": 50, "misc": {"target_items": {"mossy_cobblestone_stairs": 3, "red_banner": 1}, "initial_inventory": {"cobblestone": 8, "vine": 8, "rose_bush": 4, "string": 27, "acacia_log": 1, "feather": 5, "bamboo": 4, "smooth_red_sandstone": 4, "egg": 2}, "gold_trajectory": [{"action": "craft", "target": ["mossy_cobblestone", 6], "ingredients": {"cobblestone": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_cobblestone_stairs", 1], "ingredients": {"mossy_cobblestone": 6}, "result_count": 4}, {"action": "craft", "target": ["red_dye", 3], "ingredients": {"rose_bush": 3}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["red_wool", 6], "ingredients": {"red_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["red_banner", 1], "ingredients": {"red_wool": 6, "stick": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x nether_brick_stairs, 2x nether_brick_fence", "id": "textcraft.train.487", "max_steps": 50, "misc": {"target_items": {"nether_brick_stairs": 2, "nether_brick_fence": 2}, "initial_inventory": {"nether_brick": 59, "oxeye_daisy": 1, "gunpowder": 4, "blue_orchid": 5}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 6], "ingredients": {"nether_brick": 24}, "result_count": 6}, {"action": "craft", "target": ["nether_brick_stairs", 1], "ingredients": {"nether_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["nether_bricks", 4], "ingredients": {"nether_brick": 16}, "result_count": 4}, {"action": "craft", "target": ["nether_brick_fence", 1], "ingredients": {"nether_bricks": 4, "nether_brick": 2}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x painting, 1x andesite_wall", "id": "textcraft.train.488", "max_steps": 50, "misc": {"target_items": {"painting": 3, "andesite_wall": 1}, "initial_inventory": {"acacia_log": 4, "wither_rose": 4, "string": 13, "cobblestone": 7, "quartz": 4, "melon_slice": 4, "honeycomb": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["stick", 6], "ingredients": {"acacia_planks": 12}, "result_count": 24}, {"action": "craft", "target": ["black_dye", 3], "ingredients": {"wither_rose": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["black_wool", 3], "ingredients": {"black_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["painting", 3], "ingredients": {"stick": 24, "black_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 3], "ingredients": {"diorite": 3, "cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["andesite_wall", 1], "ingredients": {"andesite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x polished_blackstone_bricks", "id": "textcraft.train.489", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_bricks": 3}, "initial_inventory": {"blackstone": 5, "ghast_tear": 4, "orange_tulip": 3}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_bricks", 1], "ingredients": {"polished_blackstone": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x wooden_hoe, 3x dark_prismarine_stairs, 3x granite_slab", "id": "textcraft.train.490", "max_steps": 50, "misc": {"target_items": {"wooden_hoe": 2, "dark_prismarine_stairs": 3, "granite_slab": 3}, "initial_inventory": {"acacia_log": 3, "prismarine_shard": 48, "wither_rose": 8, "cobblestone": 6, "quartz": 8, "warped_planks": 6, "lily_of_the_valley": 2, "smooth_quartz": 4, "vine": 4, "birch_log": 5, "nautilus_shell": 1}, "gold_trajectory": [{"action": "craft", "target": ["stick", 1], "ingredients": {"warped_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["wooden_hoe", 2], "ingredients": {"warped_planks": 4, "stick": 4}, "result_count": 2}, {"action": "craft", "target": ["black_dye", 6], "ingredients": {"wither_rose": 6}, "result_count": 6}, {"action": "craft", "target": ["dark_prismarine", 6], "ingredients": {"prismarine_shard": 48, "black_dye": 6}, "result_count": 6}, {"action": "craft", "target": ["dark_prismarine_stairs", 1], "ingredients": {"dark_prismarine": 6}, "result_count": 4}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 3], "ingredients": {"diorite": 3, "quartz": 3}, "result_count": 3}, {"action": "craft", "target": ["granite_slab", 1], "ingredients": {"granite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x mossy_cobblestone_stairs", "id": "textcraft.train.491", "max_steps": 50, "misc": {"target_items": {"mossy_cobblestone_stairs": 3}, "initial_inventory": {"cobblestone": 6, "vine": 9, "prismarine_crystals": 1, "creeper_head": 5, "dark_oak_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["mossy_cobblestone", 6], "ingredients": {"cobblestone": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_cobblestone_stairs", 1], "ingredients": {"mossy_cobblestone": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x blue_dye", "id": "textcraft.train.492", "max_steps": 50, "misc": {"target_items": {"blue_dye": 2}, "initial_inventory": {"cornflower": 2, "cocoa_beans": 4, "cooked_rabbit": 5}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x mojang_banner_pattern", "id": "textcraft.train.493", "max_steps": 50, "misc": {"target_items": {"mojang_banner_pattern": 3}, "initial_inventory": {"sugar_cane": 3, "enchanted_golden_apple": 3, "stripped_dark_oak_log": 4, "heart_of_the_sea": 1}, "gold_trajectory": [{"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["mojang_banner_pattern", 3], "ingredients": {"paper": 3, "enchanted_golden_apple": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x purple_stained_glass, 2x white_concrete_powder, 3x diorite_wall", "id": "textcraft.train.494", "max_steps": 50, "misc": {"target_items": {"purple_stained_glass": 2, "white_concrete_powder": 2, "diorite_wall": 3}, "initial_inventory": {"glass": 10, "cornflower": 2, "rose_bush": 2, "lily_of_the_valley": 2, "sand": 6, "gravel": 6, "cobblestone": 7, "quartz": 6, "spider_eye": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_stained_glass", 1], "ingredients": {"glass": 8, "purple_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_concrete_powder", 1], "ingredients": {"white_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_wall", 1], "ingredients": {"diorite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x yellow_banner", "id": "textcraft.train.495", "max_steps": 50, "misc": {"target_items": {"yellow_banner": 3}, "initial_inventory": {"dandelion": 19, "string": 80, "acacia_log": 2, "beetroot": 5, "red_sand": 3, "nautilus_shell": 5}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 18], "ingredients": {"dandelion": 18}, "result_count": 18}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["yellow_wool", 18], "ingredients": {"yellow_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["yellow_banner", 3], "ingredients": {"yellow_wool": 18, "stick": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x acacia_fence_gate, 1x respawn_anchor, 1x cut_red_sandstone", "id": "textcraft.train.496", "max_steps": 50, "misc": {"target_items": {"acacia_fence_gate": 1, "respawn_anchor": 1, "cut_red_sandstone": 1}, "initial_inventory": {"acacia_log": 2, "crying_obsidian": 7, "glowstone_dust": 13, "red_sand": 18, "smooth_sandstone": 3, "bone": 1, "baked_potato": 5, "jungle_log": 4, "poppy": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_fence_gate", 1], "ingredients": {"stick": 4, "acacia_planks": 2}, "result_count": 1}, {"action": "craft", "target": ["glowstone", 3], "ingredients": {"glowstone_dust": 12}, "result_count": 3}, {"action": "craft", "target": ["respawn_anchor", 1], "ingredients": {"crying_obsidian": 6, "glowstone": 3}, "result_count": 1}, {"action": "craft", "target": ["red_sandstone", 4], "ingredients": {"red_sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone", 1], "ingredients": {"red_sandstone": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x wooden_pickaxe, 1x black_wool", "id": "textcraft.train.497", "max_steps": 50, "misc": {"target_items": {"wooden_pickaxe": 1, "black_wool": 1}, "initial_inventory": {"acacia_log": 3, "wither_rose": 2, "string": 5, "warped_planks": 4, "dandelion": 3, "rabbit_hide": 1, "red_sand": 2, "cooked_rabbit": 3}, "gold_trajectory": [{"action": "craft", "target": ["stick", 1], "ingredients": {"warped_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_pickaxe", 1], "ingredients": {"acacia_planks": 3, "stick": 2}, "result_count": 1}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["black_wool", 1], "ingredients": {"black_dye": 1, "white_wool": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x birch_sign, 2x end_crystal, 3x blue_carpet", "id": "textcraft.train.498", "max_steps": 50, "misc": {"target_items": {"birch_sign": 2, "end_crystal": 2, "blue_carpet": 3}, "initial_inventory": {"birch_log": 3, "acacia_log": 1, "glass": 20, "ender_pearl": 3, "blaze_rod": 1, "ghast_tear": 2, "string": 29, "cornflower": 2, "cobblestone": 4, "spider_eye": 5, "brown_mushroom": 2, "oxeye_daisy": 3}, "gold_trajectory": [{"action": "craft", "target": ["birch_planks", 2], "ingredients": {"birch_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"birch_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["birch_sign", 1], "ingredients": {"birch_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["ender_eye", 2], "ingredients": {"ender_pearl": 2, "blaze_powder": 2}, "result_count": 2}, {"action": "craft", "target": ["end_crystal", 2], "ingredients": {"glass": 14, "ender_eye": 2, "ghast_tear": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_carpet", 1], "ingredients": {"white_carpet": 8, "blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x chiseled_polished_blackstone, 3x acacia_fence_gate", "id": "textcraft.train.499", "max_steps": 50, "misc": {"target_items": {"chiseled_polished_blackstone": 3, "acacia_fence_gate": 3}, "initial_inventory": {"blackstone": 6, "acacia_log": 4, "blue_orchid": 1, "obsidian": 2}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_slab", 1], "ingredients": {"polished_blackstone": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_polished_blackstone", 3], "ingredients": {"polished_blackstone_slab": 6}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["acacia_fence_gate", 3], "ingredients": {"stick": 12, "acacia_planks": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x red_concrete_powder, 1x light_blue_stained_glass, 1x cyan_stained_glass", "id": "textcraft.train.500", "max_steps": 50, "misc": {"target_items": {"red_concrete_powder": 2, "light_blue_stained_glass": 1, "cyan_stained_glass": 1}, "initial_inventory": {"rose_bush": 2, "sand": 6, "gravel": 6, "glass": 16, "cornflower": 3, "lily_of_the_valley": 1, "green_dye": 2, "feather": 5, "nautilus_shell": 1, "heart_of_the_sea": 3}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_concrete_powder", 1], "ingredients": {"red_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_stained_glass", 1], "ingredients": {"glass": 8, "light_blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_stained_glass", 1], "ingredients": {"glass": 8, "cyan_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x cut_red_sandstone, 1x gray_terracotta, 3x red_carpet", "id": "textcraft.train.501", "max_steps": 50, "misc": {"target_items": {"cut_red_sandstone": 3, "gray_terracotta": 1, "red_carpet": 3}, "initial_inventory": {"red_sand": 22, "terracotta": 11, "wither_rose": 1, "lily_of_the_valley": 1, "rose_bush": 1, "string": 12, "cobblestone": 3, "azure_bluet": 2, "jungle_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["red_sandstone", 4], "ingredients": {"red_sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone", 1], "ingredients": {"red_sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_terracotta", 1], "ingredients": {"terracotta": 8, "gray_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["red_wool", 2], "ingredients": {"red_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["red_carpet", 1], "ingredients": {"red_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x armor_stand, 3x blue_dye", "id": "textcraft.train.502", "max_steps": 50, "misc": {"target_items": {"armor_stand": 3, "blue_dye": 3}, "initial_inventory": {"acacia_log": 4, "smooth_stone": 3, "cornflower": 3, "peony": 5, "sugar_cane": 1, "rose_bush": 4, "white_tulip": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["stick", 5], "ingredients": {"acacia_planks": 10}, "result_count": 20}, {"action": "craft", "target": ["smooth_stone_slab", 1], "ingredients": {"smooth_stone": 3}, "result_count": 6}, {"action": "craft", "target": ["armor_stand", 3], "ingredients": {"stick": 18, "smooth_stone_slab": 3}, "result_count": 3}, {"action": "craft", "target": ["blue_dye", 3], "ingredients": {"cornflower": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x pink_dye", "id": "textcraft.train.503", "max_steps": 50, "misc": {"target_items": {"pink_dye": 2}, "initial_inventory": {"pink_tulip": 3, "apple": 2, "nether_star": 2}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 2], "ingredients": {"pink_tulip": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x light_blue_stained_glass, 3x light_blue_concrete_powder, 2x pink_stained_glass", "id": "textcraft.train.504", "max_steps": 50, "misc": {"target_items": {"light_blue_stained_glass": 2, "light_blue_concrete_powder": 3, "pink_stained_glass": 2}, "initial_inventory": {"glass": 18, "cornflower": 3, "lily_of_the_valley": 2, "sand": 6, "gravel": 5, "pink_tulip": 2, "allium": 3, "popped_chorus_fruit": 2, "smooth_red_sandstone": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_stained_glass", 1], "ingredients": {"glass": 8, "light_blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["light_blue_concrete_powder", 1], "ingredients": {"light_blue_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_stained_glass", 1], "ingredients": {"glass": 8, "pink_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x blue_stained_glass_pane, 2x andesite_stairs, 1x granite_slab", "id": "textcraft.train.505", "max_steps": 50, "misc": {"target_items": {"blue_stained_glass_pane": 3, "andesite_stairs": 2, "granite_slab": 1}, "initial_inventory": {"glass": 12, "cornflower": 1, "cobblestone": 16, "quartz": 14, "ice": 3, "melon_slice": 3, "pink_tulip": 5, "stripped_warped_stem": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_stained_glass", 1], "ingredients": {"glass": 8, "blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["blue_stained_glass_pane", 1], "ingredients": {"blue_stained_glass": 6}, "result_count": 16}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 3], "ingredients": {"diorite": 3, "cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["andesite_stairs", 1], "ingredients": {"andesite": 6}, "result_count": 4}, {"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["granite", 3], "ingredients": {"diorite": 3, "quartz": 3}, "result_count": 3}, {"action": "craft", "target": ["granite_slab", 1], "ingredients": {"granite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x red_banner", "id": "textcraft.train.506", "max_steps": 50, "misc": {"target_items": {"red_banner": 1}, "initial_inventory": {"rose_bush": 4, "string": 27, "acacia_log": 2, "crying_obsidian": 1, "dandelion": 2, "bamboo": 2, "crimson_stem": 5}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 3], "ingredients": {"rose_bush": 3}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["red_wool", 6], "ingredients": {"red_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["red_banner", 1], "ingredients": {"red_wool": 6, "stick": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x andesite, 2x dark_prismarine", "id": "textcraft.train.507", "max_steps": 50, "misc": {"target_items": {"andesite": 1, "dark_prismarine": 2}, "initial_inventory": {"cobblestone": 4, "quartz": 3, "prismarine_shard": 22, "wither_rose": 3, "blackstone": 3, "milk_bucket": 3, "red_mushroom": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["andesite", 1], "ingredients": {"diorite": 1, "cobblestone": 1}, "result_count": 2}, {"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["dark_prismarine", 2], "ingredients": {"prismarine_shard": 16, "black_dye": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x nether_brick_slab, 3x gray_wool, 1x polished_diorite", "id": "textcraft.train.508", "max_steps": 50, "misc": {"target_items": {"nether_brick_slab": 1, "gray_wool": 3, "polished_diorite": 1}, "initial_inventory": {"nether_brick": 14, "wither_rose": 2, "lily_of_the_valley": 2, "string": 13, "cobblestone": 6, "quartz": 5, "egg": 3, "beetroot": 2}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_dye", 2], "ingredients": {"lily_of_the_valley": 2}, "result_count": 2}, {"action": "craft", "target": ["gray_dye", 2], "ingredients": {"black_dye": 2, "white_dye": 2}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["gray_wool", 3], "ingredients": {"gray_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x white_carpet", "id": "textcraft.train.509", "max_steps": 50, "misc": {"target_items": {"white_carpet": 3}, "initial_inventory": {"string": 10, "red_mushroom": 2, "sugar_cane": 1}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["white_carpet", 1], "ingredients": {"white_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x arrow, 3x blue_stained_glass_pane", "id": "textcraft.train.510", "max_steps": 50, "misc": {"target_items": {"arrow": 2, "blue_stained_glass_pane": 3}, "initial_inventory": {"flint": 1, "acacia_log": 2, "feather": 2, "glass": 11, "cornflower": 1, "red_tulip": 2, "lily_of_the_valley": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_stained_glass", 1], "ingredients": {"glass": 8, "blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["blue_stained_glass_pane", 1], "ingredients": {"blue_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 1x brick_slab, 2x orange_banner", "id": "textcraft.train.511", "max_steps": 50, "misc": {"target_items": {"brick_slab": 1, "orange_banner": 2}, "initial_inventory": {"brick": 13, "orange_tulip": 14, "string": 57, "acacia_log": 2, "crying_obsidian": 3, "nether_brick": 2, "creeper_head": 4, "pumpkin": 5, "sand": 4}, "gold_trajectory": [{"action": "craft", "target": ["bricks", 3], "ingredients": {"brick": 12}, "result_count": 3}, {"action": "craft", "target": ["brick_slab", 1], "ingredients": {"bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["orange_dye", 12], "ingredients": {"orange_tulip": 12}, "result_count": 12}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["orange_wool", 12], "ingredients": {"orange_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["orange_banner", 2], "ingredients": {"orange_wool": 12, "stick": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x polished_blackstone_stairs", "id": "textcraft.train.512", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_stairs": 3}, "initial_inventory": {"blackstone": 8, "oak_log": 2, "lily_of_the_valley": 2, "string": 5, "red_tulip": 4}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_stairs", 1], "ingredients": {"polished_blackstone": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x orange_banner, 2x prismarine_brick_slab", "id": "textcraft.train.513", "max_steps": 50, "misc": {"target_items": {"orange_banner": 2, "prismarine_brick_slab": 2}, "initial_inventory": {"orange_tulip": 18, "string": 49, "acacia_log": 2, "prismarine_shard": 33, "nautilus_shell": 1, "red_sand": 4, "stripped_spruce_log": 3, "ender_pearl": 4}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 12], "ingredients": {"orange_tulip": 12}, "result_count": 12}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["orange_wool", 12], "ingredients": {"orange_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["orange_banner", 2], "ingredients": {"orange_wool": 12, "stick": 2}, "result_count": 2}, {"action": "craft", "target": ["prismarine_bricks", 3], "ingredients": {"prismarine_shard": 27}, "result_count": 3}, {"action": "craft", "target": ["prismarine_brick_slab", 1], "ingredients": {"prismarine_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x oak_fence_gate", "id": "textcraft.train.514", "max_steps": 50, "misc": {"target_items": {"oak_fence_gate": 3}, "initial_inventory": {"acacia_log": 3, "oak_log": 3, "crimson_stem": 3, "sunflower": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["oak_planks", 2], "ingredients": {"oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["oak_fence_gate", 3], "ingredients": {"stick": 12, "oak_planks": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x crimson_fence_gate, 3x red_carpet", "id": "textcraft.train.515", "max_steps": 50, "misc": {"target_items": {"crimson_fence_gate": 1, "red_carpet": 3}, "initial_inventory": {"acacia_log": 2, "crimson_stem": 2, "rose_bush": 2, "string": 10, "beetroot": 1, "wither_skeleton_skull": 3, "stripped_acacia_log": 3, "gravel": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["crimson_planks", 1], "ingredients": {"crimson_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["crimson_fence_gate", 1], "ingredients": {"stick": 4, "crimson_planks": 2}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["red_wool", 2], "ingredients": {"red_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["red_carpet", 1], "ingredients": {"red_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x orange_stained_glass, 1x granite_slab", "id": "textcraft.train.516", "max_steps": 50, "misc": {"target_items": {"orange_stained_glass": 3, "granite_slab": 1}, "initial_inventory": {"glass": 10, "orange_tulip": 1, "cobblestone": 6, "quartz": 10, "stripped_acacia_log": 1, "stripped_dark_oak_log": 1, "stripped_crimson_stem": 2}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_stained_glass", 1], "ingredients": {"glass": 8, "orange_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 3], "ingredients": {"diorite": 3, "quartz": 3}, "result_count": 3}, {"action": "craft", "target": ["granite_slab", 1], "ingredients": {"granite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x chiseled_stone_bricks, 2x fermented_spider_eye, 3x diorite_wall", "id": "textcraft.train.517", "max_steps": 50, "misc": {"target_items": {"chiseled_stone_bricks": 2, "fermented_spider_eye": 2, "diorite_wall": 3}, "initial_inventory": {"stone": 6, "spider_eye": 2, "brown_mushroom": 3, "sugar_cane": 2, "cobblestone": 6, "quartz": 8, "crying_obsidian": 2, "red_sand": 1, "oxeye_daisy": 5, "apple": 1}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["stone_brick_slab", 1], "ingredients": {"stone_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_stone_bricks", 2], "ingredients": {"stone_brick_slab": 4}, "result_count": 2}, {"action": "craft", "target": ["sugar", 2], "ingredients": {"sugar_cane": 2}, "result_count": 2}, {"action": "craft", "target": ["fermented_spider_eye", 2], "ingredients": {"spider_eye": 2, "brown_mushroom": 2, "sugar": 2}, "result_count": 2}, {"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_wall", 1], "ingredients": {"diorite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x pink_dye, 2x wooden_pickaxe", "id": "textcraft.train.518", "max_steps": 50, "misc": {"target_items": {"pink_dye": 2, "wooden_pickaxe": 2}, "initial_inventory": {"pink_tulip": 2, "acacia_log": 3, "apple": 1, "blaze_rod": 1, "allium": 5, "stripped_birch_log": 3}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 2], "ingredients": {"pink_tulip": 2}, "result_count": 2}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_pickaxe", 2], "ingredients": {"acacia_planks": 6, "stick": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x diorite_wall, 3x dark_prismarine", "id": "textcraft.train.519", "max_steps": 50, "misc": {"target_items": {"diorite_wall": 2, "dark_prismarine": 3}, "initial_inventory": {"cobblestone": 6, "quartz": 9, "prismarine_shard": 26, "wither_rose": 4, "smooth_sandstone": 4, "melon_slice": 1, "nether_brick": 2, "peony": 3}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_wall", 1], "ingredients": {"diorite": 6}, "result_count": 6}, {"action": "craft", "target": ["black_dye", 3], "ingredients": {"wither_rose": 3}, "result_count": 3}, {"action": "craft", "target": ["dark_prismarine", 3], "ingredients": {"prismarine_shard": 24, "black_dye": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x green_carpet, 1x orange_stained_glass", "id": "textcraft.train.520", "max_steps": 50, "misc": {"target_items": {"green_carpet": 2, "orange_stained_glass": 1}, "initial_inventory": {"string": 27, "green_dye": 1, "glass": 8, "orange_tulip": 2, "terracotta": 5, "brick": 5, "smooth_stone": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["green_carpet", 1], "ingredients": {"white_carpet": 8, "green_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_stained_glass", 1], "ingredients": {"glass": 8, "orange_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x andesite_stairs, 2x wooden_shovel, 1x green_banner", "id": "textcraft.train.521", "max_steps": 50, "misc": {"target_items": {"andesite_stairs": 2, "wooden_shovel": 2, "green_banner": 1}, "initial_inventory": {"cobblestone": 7, "quartz": 6, "acacia_log": 4, "green_dye": 8, "string": 25, "dark_oak_log": 5, "blue_orchid": 3, "smooth_red_sandstone": 3}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 3], "ingredients": {"diorite": 3, "cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["andesite_stairs", 1], "ingredients": {"andesite": 6}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["wooden_shovel", 2], "ingredients": {"acacia_planks": 2, "stick": 4}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["green_wool", 6], "ingredients": {"green_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["green_banner", 1], "ingredients": {"green_wool": 6, "stick": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x red_stained_glass, 1x cyan_wool", "id": "textcraft.train.522", "max_steps": 50, "misc": {"target_items": {"red_stained_glass": 1, "cyan_wool": 1}, "initial_inventory": {"glass": 12, "rose_bush": 1, "cornflower": 2, "green_dye": 2, "string": 5, "prismarine_crystals": 3, "brown_mushroom": 4}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_stained_glass", 1], "ingredients": {"glass": 8, "red_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["cyan_wool", 1], "ingredients": {"cyan_dye": 1, "white_wool": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x gray_stained_glass", "id": "textcraft.train.523", "max_steps": 50, "misc": {"target_items": {"gray_stained_glass": 3}, "initial_inventory": {"glass": 9, "wither_rose": 2, "lily_of_the_valley": 1, "spider_eye": 2}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_stained_glass", 1], "ingredients": {"glass": 8, "gray_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x brown_stained_glass_pane", "id": "textcraft.train.524", "max_steps": 50, "misc": {"target_items": {"brown_stained_glass_pane": 2}, "initial_inventory": {"glass": 9, "cocoa_beans": 1, "stripped_warped_stem": 4, "gravel": 2, "nether_brick": 5, "peony": 3, "beetroot": 3}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_stained_glass", 1], "ingredients": {"glass": 8, "brown_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["brown_stained_glass_pane", 1], "ingredients": {"brown_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 1x flower_banner_pattern, 1x end_stone_brick_slab", "id": "textcraft.train.525", "max_steps": 50, "misc": {"target_items": {"flower_banner_pattern": 1, "end_stone_brick_slab": 1}, "initial_inventory": {"sugar_cane": 4, "oxeye_daisy": 2, "end_stone": 4, "ink_sac": 4, "feather": 2, "pumpkin": 1, "red_tulip": 5}, "gold_trajectory": [{"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["flower_banner_pattern", 1], "ingredients": {"paper": 1, "oxeye_daisy": 1}, "result_count": 1}, {"action": "craft", "target": ["end_stone_bricks", 1], "ingredients": {"end_stone": 4}, "result_count": 4}, {"action": "craft", "target": ["end_stone_brick_slab", 1], "ingredients": {"end_stone_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x black_terracotta, 3x fire_charge", "id": "textcraft.train.526", "max_steps": 50, "misc": {"target_items": {"black_terracotta": 1, "fire_charge": 3}, "initial_inventory": {"terracotta": 11, "wither_rose": 1, "gunpowder": 2, "blaze_rod": 1, "stripped_warped_stem": 5, "allium": 2, "smooth_stone": 3, "apple": 2, "stripped_acacia_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_terracotta", 1], "ingredients": {"terracotta": 8, "black_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["fire_charge", 1], "ingredients": {"gunpowder": 1, "blaze_powder": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x light_blue_wool, 1x cartography_table, 1x light_blue_stained_glass", "id": "textcraft.train.527", "max_steps": 50, "misc": {"target_items": {"light_blue_wool": 2, "cartography_table": 1, "light_blue_stained_glass": 1}, "initial_inventory": {"cornflower": 2, "lily_of_the_valley": 3, "string": 11, "sugar_cane": 3, "acacia_log": 2, "glass": 9, "crimson_stem": 5, "ice": 1, "red_sand": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["light_blue_wool", 2], "ingredients": {"light_blue_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["cartography_table", 1], "ingredients": {"paper": 2, "acacia_planks": 4}, "result_count": 1}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_stained_glass", 1], "ingredients": {"glass": 8, "light_blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x wooden_axe, 3x orange_carpet, 1x stone_pickaxe", "id": "textcraft.train.528", "max_steps": 50, "misc": {"target_items": {"wooden_axe": 2, "orange_carpet": 3, "stone_pickaxe": 1}, "initial_inventory": {"acacia_log": 5, "string": 36, "orange_tulip": 2, "blackstone": 3, "green_dye": 5, "warped_fungus": 4, "cocoa_beans": 1, "sand": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_axe", 2], "ingredients": {"acacia_planks": 6, "stick": 4}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_carpet", 1], "ingredients": {"white_carpet": 8, "orange_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_pickaxe", 1], "ingredients": {"blackstone": 3, "stick": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x white_banner, 1x bookshelf, 2x green_bed", "id": "textcraft.train.529", "max_steps": 50, "misc": {"target_items": {"white_banner": 2, "bookshelf": 1, "green_bed": 2}, "initial_inventory": {"string": 78, "acacia_log": 6, "sugar_cane": 9, "rabbit_hide": 15, "green_dye": 9, "prismarine_crystals": 3, "rose_bush": 3, "prismarine_shard": 4}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["white_banner", 2], "ingredients": {"white_wool": 12, "stick": 2}, "result_count": 2}, {"action": "craft", "target": ["paper", 3], "ingredients": {"sugar_cane": 9}, "result_count": 9}, {"action": "craft", "target": ["leather", 3], "ingredients": {"rabbit_hide": 12}, "result_count": 3}, {"action": "craft", "target": ["book", 3], "ingredients": {"paper": 9, "leather": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["bookshelf", 1], "ingredients": {"acacia_planks": 6, "book": 3}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["green_wool", 6], "ingredients": {"green_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["green_bed", 2], "ingredients": {"green_wool": 6, "acacia_planks": 6}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x end_stone_brick_slab, 2x polished_diorite_stairs", "id": "textcraft.train.530", "max_steps": 50, "misc": {"target_items": {"end_stone_brick_slab": 3, "polished_diorite_stairs": 2}, "initial_inventory": {"end_stone": 6, "cobblestone": 8, "quartz": 9, "dandelion": 3, "snowball": 2, "blue_orchid": 5}, "gold_trajectory": [{"action": "craft", "target": ["end_stone_bricks", 1], "ingredients": {"end_stone": 4}, "result_count": 4}, {"action": "craft", "target": ["end_stone_brick_slab", 1], "ingredients": {"end_stone_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["diorite", 4], "ingredients": {"cobblestone": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_diorite", 2], "ingredients": {"diorite": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_diorite_stairs", 1], "ingredients": {"polished_diorite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x cut_red_sandstone_slab", "id": "textcraft.train.531", "max_steps": 50, "misc": {"target_items": {"cut_red_sandstone_slab": 2}, "initial_inventory": {"red_sand": 16, "rose_bush": 2, "nether_star": 2}, "gold_trajectory": [{"action": "craft", "target": ["red_sandstone", 4], "ingredients": {"red_sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone", 1], "ingredients": {"red_sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone_slab", 1], "ingredients": {"cut_red_sandstone": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x polished_granite_stairs, 3x stone_brick_wall, 3x leather_horse_armor", "id": "textcraft.train.532", "max_steps": 50, "misc": {"target_items": {"polished_granite_stairs": 2, "stone_brick_wall": 3, "leather_horse_armor": 3}, "initial_inventory": {"cobblestone": 8, "quartz": 24, "stone": 9, "rabbit_hide": 96, "poppy": 1, "green_dye": 1, "heart_of_the_sea": 5, "terracotta": 3}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 4], "ingredients": {"cobblestone": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["granite", 8], "ingredients": {"diorite": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_granite", 2], "ingredients": {"granite": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_granite_stairs", 1], "ingredients": {"polished_granite": 6}, "result_count": 4}, {"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["stone_brick_wall", 1], "ingredients": {"stone_bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["leather", 21], "ingredients": {"rabbit_hide": 84}, "result_count": 21}, {"action": "craft", "target": ["leather_horse_armor", 3], "ingredients": {"leather": 21}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x polished_granite, 3x blue_wool, 1x nether_brick_fence", "id": "textcraft.train.533", "max_steps": 50, "misc": {"target_items": {"polished_granite": 1, "blue_wool": 3, "nether_brick_fence": 1}, "initial_inventory": {"cobblestone": 6, "quartz": 8, "cornflower": 3, "string": 16, "nether_brick": 22, "melon_slice": 2, "honeycomb": 5}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 4], "ingredients": {"diorite": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite", 1], "ingredients": {"granite": 4}, "result_count": 4}, {"action": "craft", "target": ["blue_dye", 3], "ingredients": {"cornflower": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["blue_wool", 3], "ingredients": {"blue_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["nether_bricks", 4], "ingredients": {"nether_brick": 16}, "result_count": 4}, {"action": "craft", "target": ["nether_brick_fence", 1], "ingredients": {"nether_bricks": 4, "nether_brick": 2}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x polished_blackstone_brick_slab, 2x chiseled_stone_bricks, 3x oak_fence", "id": "textcraft.train.534", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_brick_slab": 1, "chiseled_stone_bricks": 2, "oak_fence": 3}, "initial_inventory": {"blackstone": 5, "stone": 6, "oak_log": 2, "acacia_log": 2, "stripped_dark_oak_log": 2, "rose_bush": 3, "nether_wart": 5, "stripped_spruce_log": 3}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_bricks", 1], "ingredients": {"polished_blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_brick_slab", 1], "ingredients": {"polished_blackstone_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["stone_brick_slab", 1], "ingredients": {"stone_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_stone_bricks", 2], "ingredients": {"stone_brick_slab": 4}, "result_count": 2}, {"action": "craft", "target": ["oak_planks", 1], "ingredients": {"oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["oak_planks", 1], "ingredients": {"oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["oak_fence", 1], "ingredients": {"oak_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x red_stained_glass_pane, 1x brick_stairs, 2x dark_oak_sign", "id": "textcraft.train.535", "max_steps": 50, "misc": {"target_items": {"red_stained_glass_pane": 2, "brick_stairs": 1, "dark_oak_sign": 2}, "initial_inventory": {"glass": 9, "rose_bush": 2, "brick": 26, "dark_oak_log": 2, "acacia_log": 1, "nether_wart": 3, "end_stone": 4, "stripped_oak_log": 5, "lilac": 2}, "gold_trajectory": [{"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "red_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_stairs", 1], "ingredients": {"bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_planks", 2], "ingredients": {"dark_oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"dark_oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_sign", 1], "ingredients": {"dark_oak_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x creeper_banner_pattern", "id": "textcraft.train.536", "max_steps": 50, "misc": {"target_items": {"creeper_banner_pattern": 1}, "initial_inventory": {"sugar_cane": 4, "creeper_head": 2, "beetroot": 5, "bamboo": 1, "pumpkin": 3, "obsidian": 2}, "gold_trajectory": [{"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["creeper_banner_pattern", 1], "ingredients": {"paper": 1, "creeper_head": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x warped_fence_gate", "id": "textcraft.train.537", "max_steps": 50, "misc": {"target_items": {"warped_fence_gate": 1}, "initial_inventory": {"acacia_log": 2, "warped_stem": 2, "snowball": 3, "cocoa_beans": 4, "smooth_quartz": 5, "brown_mushroom": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["warped_planks", 1], "ingredients": {"warped_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["warped_fence_gate", 1], "ingredients": {"stick": 4, "warped_planks": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x stone_brick_slab", "id": "textcraft.train.538", "max_steps": 50, "misc": {"target_items": {"stone_brick_slab": 3}, "initial_inventory": {"stone": 5, "sand": 1, "honeycomb": 2, "smooth_quartz": 4, "apple": 5}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["stone_brick_slab", 1], "ingredients": {"stone_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x gray_concrete_powder", "id": "textcraft.train.539", "max_steps": 50, "misc": {"target_items": {"gray_concrete_powder": 1}, "initial_inventory": {"wither_rose": 1, "lily_of_the_valley": 2, "sand": 6, "gravel": 5, "basalt": 5, "netherite_scrap": 5, "popped_chorus_fruit": 5}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_concrete_powder", 1], "ingredients": {"gray_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x stone_pickaxe", "id": "textcraft.train.540", "max_steps": 50, "misc": {"target_items": {"stone_pickaxe": 1}, "initial_inventory": {"blackstone": 4, "acacia_log": 2, "prismarine_shard": 1, "baked_potato": 1, "pink_tulip": 3, "stripped_jungle_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_pickaxe", 1], "ingredients": {"blackstone": 3, "stick": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x diorite_stairs, 1x skull_banner_pattern, 2x end_stone_brick_stairs", "id": "textcraft.train.541", "max_steps": 50, "misc": {"target_items": {"diorite_stairs": 2, "skull_banner_pattern": 1, "end_stone_brick_stairs": 2}, "initial_inventory": {"cobblestone": 8, "quartz": 8, "sugar_cane": 3, "wither_skeleton_skull": 2, "end_stone": 10, "baked_potato": 1, "ice": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_stairs", 1], "ingredients": {"diorite": 6}, "result_count": 4}, {"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["skull_banner_pattern", 1], "ingredients": {"paper": 1, "wither_skeleton_skull": 1}, "result_count": 1}, {"action": "craft", "target": ["end_stone_bricks", 2], "ingredients": {"end_stone": 8}, "result_count": 8}, {"action": "craft", "target": ["end_stone_brick_stairs", 1], "ingredients": {"end_stone_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x orange_concrete_powder, 3x granite_wall", "id": "textcraft.train.542", "max_steps": 50, "misc": {"target_items": {"orange_concrete_powder": 1, "granite_wall": 3}, "initial_inventory": {"orange_tulip": 1, "sand": 6, "gravel": 5, "cobblestone": 6, "quartz": 16, "crying_obsidian": 5, "smooth_quartz": 5, "carrot": 3, "string": 3, "stripped_oak_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_concrete_powder", 1], "ingredients": {"orange_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_wall", 1], "ingredients": {"granite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x red_bed, 1x dark_prismarine_stairs", "id": "textcraft.train.543", "max_steps": 50, "misc": {"target_items": {"red_bed": 2, "dark_prismarine_stairs": 1}, "initial_inventory": {"rose_bush": 4, "string": 32, "acacia_log": 3, "prismarine_shard": 68, "wither_rose": 7, "stone": 5, "basalt": 2, "beetroot": 2, "melon_slice": 3}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 3], "ingredients": {"rose_bush": 3}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["red_wool", 6], "ingredients": {"red_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["red_bed", 2], "ingredients": {"red_wool": 6, "acacia_planks": 6}, "result_count": 2}, {"action": "craft", "target": ["black_dye", 6], "ingredients": {"wither_rose": 6}, "result_count": 6}, {"action": "craft", "target": ["dark_prismarine", 6], "ingredients": {"prismarine_shard": 48, "black_dye": 6}, "result_count": 6}, {"action": "craft", "target": ["dark_prismarine_stairs", 1], "ingredients": {"dark_prismarine": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x granite_stairs", "id": "textcraft.train.544", "max_steps": 50, "misc": {"target_items": {"granite_stairs": 1}, "initial_inventory": {"cobblestone": 6, "quartz": 18, "wither_skeleton_skull": 3, "terracotta": 3, "lily_of_the_valley": 2}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_stairs", 1], "ingredients": {"granite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x pink_concrete_powder, 2x warped_fence_gate, 2x leather_helmet", "id": "textcraft.train.545", "max_steps": 50, "misc": {"target_items": {"pink_concrete_powder": 1, "warped_fence_gate": 2, "leather_helmet": 2}, "initial_inventory": {"pink_tulip": 1, "sand": 4, "gravel": 5, "acacia_log": 1, "warped_stem": 1, "rabbit_hide": 54, "oxeye_daisy": 1, "jungle_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_concrete_powder", 1], "ingredients": {"pink_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["warped_planks", 1], "ingredients": {"warped_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["warped_fence_gate", 2], "ingredients": {"stick": 8, "warped_planks": 4}, "result_count": 2}, {"action": "craft", "target": ["leather", 10], "ingredients": {"rabbit_hide": 40}, "result_count": 10}, {"action": "craft", "target": ["leather_helmet", 2], "ingredients": {"leather": 10}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x blue_terracotta, 1x pumpkin_pie", "id": "textcraft.train.546", "max_steps": 50, "misc": {"target_items": {"blue_terracotta": 1, "pumpkin_pie": 1}, "initial_inventory": {"terracotta": 12, "cornflower": 1, "pumpkin": 1, "sugar_cane": 1, "egg": 1, "nautilus_shell": 5, "gravel": 3, "nether_brick": 2, "melon_slice": 1, "stripped_spruce_log": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_terracotta", 1], "ingredients": {"terracotta": 8, "blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["sugar", 1], "ingredients": {"sugar_cane": 1}, "result_count": 1}, {"action": "craft", "target": ["pumpkin_pie", 1], "ingredients": {"pumpkin": 1, "sugar": 1, "egg": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x granite_stairs, 2x black_bed", "id": "textcraft.train.547", "max_steps": 50, "misc": {"target_items": {"granite_stairs": 2, "black_bed": 2}, "initial_inventory": {"cobblestone": 6, "quartz": 15, "wither_rose": 8, "string": 27, "acacia_log": 2, "bamboo": 1, "peony": 3, "sunflower": 2, "honeycomb": 2, "white_tulip": 1}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_stairs", 1], "ingredients": {"granite": 6}, "result_count": 4}, {"action": "craft", "target": ["black_dye", 6], "ingredients": {"wither_rose": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["black_wool", 6], "ingredients": {"black_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["black_bed", 2], "ingredients": {"black_wool": 6, "acacia_planks": 6}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x stone_brick_slab, 2x andesite_slab", "id": "textcraft.train.548", "max_steps": 50, "misc": {"target_items": {"stone_brick_slab": 1, "andesite_slab": 2}, "initial_inventory": {"stone": 4, "cobblestone": 4, "quartz": 2, "stripped_jungle_log": 1, "creeper_head": 1, "gunpowder": 2}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["stone_brick_slab", 1], "ingredients": {"stone_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["andesite", 2], "ingredients": {"diorite": 2, "cobblestone": 2}, "result_count": 4}, {"action": "craft", "target": ["andesite_slab", 1], "ingredients": {"andesite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x polished_diorite, 1x spectral_arrow", "id": "textcraft.train.549", "max_steps": 50, "misc": {"target_items": {"polished_diorite": 2, "spectral_arrow": 1}, "initial_inventory": {"cobblestone": 5, "quartz": 4, "glowstone_dust": 6, "flint": 1, "acacia_log": 2, "feather": 1, "ink_sac": 5, "apple": 5, "cooked_rabbit": 2, "end_stone": 1, "sugar_cane": 2}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}, {"action": "craft", "target": ["spectral_arrow", 1], "ingredients": {"glowstone_dust": 4, "arrow": 1}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x cartography_table", "id": "textcraft.train.550", "max_steps": 50, "misc": {"target_items": {"cartography_table": 3}, "initial_inventory": {"sugar_cane": 8, "acacia_log": 3, "gunpowder": 5, "popped_chorus_fruit": 2, "cornflower": 5, "stripped_crimson_stem": 2}, "gold_trajectory": [{"action": "craft", "target": ["paper", 2], "ingredients": {"sugar_cane": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["cartography_table", 3], "ingredients": {"paper": 6, "acacia_planks": 12}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x cyan_stained_glass, 3x cyan_concrete_powder, 1x polished_blackstone_bricks", "id": "textcraft.train.551", "max_steps": 50, "misc": {"target_items": {"cyan_stained_glass": 2, "cyan_concrete_powder": 3, "polished_blackstone_bricks": 1}, "initial_inventory": {"glass": 9, "cornflower": 2, "green_dye": 3, "sand": 4, "gravel": 6, "blackstone": 6, "heart_of_the_sea": 4, "poppy": 5, "dandelion": 5, "string": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_stained_glass", 1], "ingredients": {"glass": 8, "cyan_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["cyan_concrete_powder", 1], "ingredients": {"cyan_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_bricks", 1], "ingredients": {"polished_blackstone": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x orange_dye", "id": "textcraft.train.552", "max_steps": 50, "misc": {"target_items": {"orange_dye": 2}, "initial_inventory": {"orange_tulip": 3, "shulker_shell": 1, "dark_oak_log": 4, "warped_fungus": 1}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 2], "ingredients": {"orange_tulip": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x dark_oak_sign", "id": "textcraft.train.553", "max_steps": 50, "misc": {"target_items": {"dark_oak_sign": 1}, "initial_inventory": {"dark_oak_log": 2, "acacia_log": 1, "creeper_head": 4, "smooth_quartz": 1, "string": 4}, "gold_trajectory": [{"action": "craft", "target": ["dark_oak_planks", 2], "ingredients": {"dark_oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"dark_oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_sign", 1], "ingredients": {"dark_oak_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x prismarine_slab", "id": "textcraft.train.554", "max_steps": 50, "misc": {"target_items": {"prismarine_slab": 3}, "initial_inventory": {"prismarine_shard": 14, "wither_rose": 3, "feather": 5, "rose_bush": 3, "lilac": 3}, "gold_trajectory": [{"action": "craft", "target": ["prismarine", 3], "ingredients": {"prismarine_shard": 12}, "result_count": 3}, {"action": "craft", "target": ["prismarine_slab", 1], "ingredients": {"prismarine": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x polished_blackstone_stairs", "id": "textcraft.train.555", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_stairs": 2}, "initial_inventory": {"blackstone": 11, "stripped_warped_stem": 1, "stripped_spruce_log": 2, "glass": 5, "allium": 2, "pumpkin": 2}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_stairs", 1], "ingredients": {"polished_blackstone": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x blue_dye", "id": "textcraft.train.556", "max_steps": 50, "misc": {"target_items": {"blue_dye": 3}, "initial_inventory": {"cornflower": 4, "white_tulip": 5, "rabbit_hide": 1, "stripped_dark_oak_log": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 3], "ingredients": {"cornflower": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x cyan_dye, 2x nether_brick_slab", "id": "textcraft.train.557", "max_steps": 50, "misc": {"target_items": {"cyan_dye": 2, "nether_brick_slab": 2}, "initial_inventory": {"cornflower": 2, "green_dye": 2, "nether_brick": 15, "baked_potato": 3, "smooth_sandstone": 1, "blackstone": 5, "poppy": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x quartz_pillar", "id": "textcraft.train.558", "max_steps": 50, "misc": {"target_items": {"quartz_pillar": 3}, "initial_inventory": {"quartz": 17, "prismarine_crystals": 4, "baked_potato": 2}, "gold_trajectory": [{"action": "craft", "target": ["quartz_block", 4], "ingredients": {"quartz": 16}, "result_count": 4}, {"action": "craft", "target": ["quartz_pillar", 2], "ingredients": {"quartz_block": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x diorite_slab", "id": "textcraft.train.559", "max_steps": 50, "misc": {"target_items": {"diorite_slab": 2}, "initial_inventory": {"cobblestone": 4, "quartz": 6, "ink_sac": 3, "oak_log": 1, "dandelion": 3, "rabbit_hide": 1}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["diorite_slab", 1], "ingredients": {"diorite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x green_carpet, 2x gray_concrete_powder, 2x creeper_banner_pattern", "id": "textcraft.train.560", "max_steps": 50, "misc": {"target_items": {"green_carpet": 3, "gray_concrete_powder": 2, "creeper_banner_pattern": 2}, "initial_inventory": {"string": 25, "green_dye": 2, "wither_rose": 1, "lily_of_the_valley": 1, "sand": 6, "gravel": 5, "sugar_cane": 4, "creeper_head": 2, "blackstone": 1, "warped_fungus": 4, "cocoa_beans": 5, "cooked_rabbit": 4, "ink_sac": 3}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["green_carpet", 1], "ingredients": {"white_carpet": 8, "green_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_concrete_powder", 1], "ingredients": {"gray_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["creeper_banner_pattern", 2], "ingredients": {"paper": 2, "creeper_head": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x stone_shovel", "id": "textcraft.train.561", "max_steps": 50, "misc": {"target_items": {"stone_shovel": 2}, "initial_inventory": {"blackstone": 3, "acacia_log": 2, "stripped_oak_log": 1, "beetroot": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_shovel", 2], "ingredients": {"blackstone": 2, "stick": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x black_concrete_powder, 2x polished_blackstone_stairs", "id": "textcraft.train.562", "max_steps": 50, "misc": {"target_items": {"black_concrete_powder": 3, "polished_blackstone_stairs": 2}, "initial_inventory": {"wither_rose": 2, "sand": 6, "gravel": 6, "blackstone": 8, "warped_fungus": 4, "poppy": 1, "spider_eye": 5, "lilac": 1}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_concrete_powder", 1], "ingredients": {"black_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_stairs", 1], "ingredients": {"polished_blackstone": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x brown_carpet", "id": "textcraft.train.563", "max_steps": 50, "misc": {"target_items": {"brown_carpet": 3}, "initial_inventory": {"cocoa_beans": 3, "string": 10, "stripped_oak_log": 2, "prismarine_crystals": 4, "popped_chorus_fruit": 3, "vine": 4, "sugar_cane": 3}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 2], "ingredients": {"cocoa_beans": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["brown_wool", 2], "ingredients": {"brown_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["brown_carpet", 1], "ingredients": {"brown_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x mossy_cobblestone_slab", "id": "textcraft.train.564", "max_steps": 50, "misc": {"target_items": {"mossy_cobblestone_slab": 3}, "initial_inventory": {"cobblestone": 4, "vine": 4, "glass": 5, "pink_tulip": 1, "popped_chorus_fruit": 1}, "gold_trajectory": [{"action": "craft", "target": ["mossy_cobblestone", 3], "ingredients": {"cobblestone": 3, "vine": 3}, "result_count": 3}, {"action": "craft", "target": ["mossy_cobblestone_slab", 1], "ingredients": {"mossy_cobblestone": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x green_carpet", "id": "textcraft.train.565", "max_steps": 50, "misc": {"target_items": {"green_carpet": 3}, "initial_inventory": {"string": 30, "green_dye": 2, "stone": 3, "stripped_dark_oak_log": 3, "glass": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["green_carpet", 1], "ingredients": {"white_carpet": 8, "green_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x grindstone", "id": "textcraft.train.566", "max_steps": 50, "misc": {"target_items": {"grindstone": 1}, "initial_inventory": {"acacia_log": 2, "stone": 3, "jungle_log": 2, "flint": 1, "smooth_red_sandstone": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_slab", 1], "ingredients": {"stone": 3}, "result_count": 6}, {"action": "craft", "target": ["grindstone", 1], "ingredients": {"stick": 2, "stone_slab": 1, "acacia_planks": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x quartz_pillar", "id": "textcraft.train.567", "max_steps": 50, "misc": {"target_items": {"quartz_pillar": 2}, "initial_inventory": {"quartz": 11, "brown_mushroom": 5, "white_tulip": 2, "orange_tulip": 2, "dandelion": 5, "green_dye": 5}, "gold_trajectory": [{"action": "craft", "target": ["quartz_block", 2], "ingredients": {"quartz": 8}, "result_count": 2}, {"action": "craft", "target": ["quartz_pillar", 1], "ingredients": {"quartz_block": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x white_stained_glass_pane, 2x ladder, 3x polished_blackstone_pressure_plate", "id": "textcraft.train.568", "max_steps": 50, "misc": {"target_items": {"white_stained_glass_pane": 3, "ladder": 2, "polished_blackstone_pressure_plate": 3}, "initial_inventory": {"glass": 8, "lily_of_the_valley": 1, "acacia_log": 1, "blackstone": 10, "crimson_stem": 3, "string": 1, "smooth_stone": 5}, "gold_trajectory": [{"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "white_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["ladder", 1], "ingredients": {"stick": 7}, "result_count": 3}, {"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_pressure_plate", 3], "ingredients": {"polished_blackstone": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x polished_blackstone_wall, 2x red_stained_glass", "id": "textcraft.train.569", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_wall": 2, "red_stained_glass": 2}, "initial_inventory": {"blackstone": 9, "glass": 12, "rose_bush": 2, "beetroot": 5, "pumpkin": 5, "lily_of_the_valley": 1}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_wall", 1], "ingredients": {"polished_blackstone": 6}, "result_count": 6}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_stained_glass", 1], "ingredients": {"glass": 8, "red_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x dark_oak_sign, 2x ladder", "id": "textcraft.train.570", "max_steps": 50, "misc": {"target_items": {"dark_oak_sign": 2, "ladder": 2}, "initial_inventory": {"dark_oak_log": 2, "acacia_log": 3, "gunpowder": 1, "lilac": 3, "green_dye": 2, "quartz": 3}, "gold_trajectory": [{"action": "craft", "target": ["dark_oak_planks", 2], "ingredients": {"dark_oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"dark_oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_sign", 1], "ingredients": {"dark_oak_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["ladder", 1], "ingredients": {"stick": 7}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x red_concrete_powder, 2x polished_blackstone_pressure_plate", "id": "textcraft.train.571", "max_steps": 50, "misc": {"target_items": {"red_concrete_powder": 1, "polished_blackstone_pressure_plate": 2}, "initial_inventory": {"rose_bush": 1, "sand": 6, "gravel": 4, "blackstone": 6, "nether_star": 3}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_concrete_powder", 1], "ingredients": {"red_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_pressure_plate", 2], "ingredients": {"polished_blackstone": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x granite_stairs", "id": "textcraft.train.572", "max_steps": 50, "misc": {"target_items": {"granite_stairs": 2}, "initial_inventory": {"cobblestone": 7, "quartz": 16, "obsidian": 3, "smooth_stone": 5, "red_tulip": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_stairs", 1], "ingredients": {"granite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x yellow_bed, 2x red_terracotta", "id": "textcraft.train.573", "max_steps": 50, "misc": {"target_items": {"yellow_bed": 1, "red_terracotta": 2}, "initial_inventory": {"dandelion": 4, "string": 15, "acacia_log": 2, "terracotta": 11, "rose_bush": 1, "snowball": 4, "sand": 3, "brown_mushroom": 4, "obsidian": 4, "nether_star": 4}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 3], "ingredients": {"dandelion": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["yellow_wool", 3], "ingredients": {"yellow_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["yellow_bed", 1], "ingredients": {"yellow_wool": 3, "acacia_planks": 3}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_terracotta", 1], "ingredients": {"terracotta": 8, "red_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x chiseled_nether_bricks", "id": "textcraft.train.574", "max_steps": 50, "misc": {"target_items": {"chiseled_nether_bricks": 3}, "initial_inventory": {"nether_brick": 17, "ice": 3, "nautilus_shell": 1, "stripped_dark_oak_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_nether_bricks", 3], "ingredients": {"nether_brick_slab": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x leather_helmet", "id": "textcraft.train.575", "max_steps": 50, "misc": {"target_items": {"leather_helmet": 2}, "initial_inventory": {"rabbit_hide": 46, "stripped_dark_oak_log": 1, "pumpkin": 4, "nautilus_shell": 5}, "gold_trajectory": [{"action": "craft", "target": ["leather", 10], "ingredients": {"rabbit_hide": 40}, "result_count": 10}, {"action": "craft", "target": ["leather_helmet", 2], "ingredients": {"leather": 10}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x light_gray_dye, 2x quartz_pillar, 1x purple_stained_glass", "id": "textcraft.train.576", "max_steps": 50, "misc": {"target_items": {"light_gray_dye": 1, "quartz_pillar": 2, "purple_stained_glass": 1}, "initial_inventory": {"oxeye_daisy": 1, "quartz": 10, "glass": 8, "cornflower": 1, "rose_bush": 2, "red_tulip": 2, "blue_orchid": 4, "sunflower": 2}, "gold_trajectory": [{"action": "craft", "target": ["light_gray_dye", 1], "ingredients": {"oxeye_daisy": 1}, "result_count": 1}, {"action": "craft", "target": ["quartz_block", 2], "ingredients": {"quartz": 8}, "result_count": 2}, {"action": "craft", "target": ["quartz_pillar", 1], "ingredients": {"quartz_block": 2}, "result_count": 2}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_stained_glass", 1], "ingredients": {"glass": 8, "purple_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x green_carpet", "id": "textcraft.train.577", "max_steps": 50, "misc": {"target_items": {"green_carpet": 1}, "initial_inventory": {"string": 33, "green_dye": 2, "pumpkin": 5, "vine": 3, "melon_slice": 3, "orange_tulip": 1, "nether_brick": 4}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["green_carpet", 1], "ingredients": {"white_carpet": 8, "green_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x nether_brick_fence, 2x mossy_cobblestone_slab", "id": "textcraft.train.578", "max_steps": 50, "misc": {"target_items": {"nether_brick_fence": 2, "mossy_cobblestone_slab": 2}, "initial_inventory": {"nether_brick": 27, "cobblestone": 3, "vine": 4, "pink_tulip": 4, "stripped_crimson_stem": 2}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 4], "ingredients": {"nether_brick": 16}, "result_count": 4}, {"action": "craft", "target": ["nether_brick_fence", 1], "ingredients": {"nether_bricks": 4, "nether_brick": 2}, "result_count": 6}, {"action": "craft", "target": ["mossy_cobblestone", 3], "ingredients": {"cobblestone": 3, "vine": 3}, "result_count": 3}, {"action": "craft", "target": ["mossy_cobblestone_slab", 1], "ingredients": {"mossy_cobblestone": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x pink_dye", "id": "textcraft.train.579", "max_steps": 50, "misc": {"target_items": {"pink_dye": 1}, "initial_inventory": {"pink_tulip": 1, "carrot": 1, "lilac": 5, "smooth_quartz": 2}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x yellow_stained_glass, 2x stone_pickaxe", "id": "textcraft.train.580", "max_steps": 50, "misc": {"target_items": {"yellow_stained_glass": 1, "stone_pickaxe": 2}, "initial_inventory": {"glass": 8, "dandelion": 1, "blackstone": 8, "acacia_log": 1, "stripped_warped_stem": 3, "ghast_tear": 1, "pumpkin": 1}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_stained_glass", 1], "ingredients": {"glass": 8, "yellow_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_pickaxe", 2], "ingredients": {"blackstone": 6, "stick": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x end_stone_brick_stairs, 1x painting, 3x polished_andesite_slab", "id": "textcraft.train.581", "max_steps": 50, "misc": {"target_items": {"end_stone_brick_stairs": 1, "painting": 1, "polished_andesite_slab": 3}, "initial_inventory": {"end_stone": 9, "acacia_log": 1, "wither_rose": 2, "string": 4, "cobblestone": 6, "quartz": 2, "beetroot": 5, "cornflower": 1, "white_tulip": 5, "bone": 1}, "gold_trajectory": [{"action": "craft", "target": ["end_stone_bricks", 2], "ingredients": {"end_stone": 8}, "result_count": 8}, {"action": "craft", "target": ["end_stone_brick_stairs", 1], "ingredients": {"end_stone_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["black_wool", 1], "ingredients": {"black_dye": 1, "white_wool": 1}, "result_count": 1}, {"action": "craft", "target": ["painting", 1], "ingredients": {"stick": 8, "black_wool": 1}, "result_count": 1}, {"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["andesite", 2], "ingredients": {"diorite": 2, "cobblestone": 2}, "result_count": 4}, {"action": "craft", "target": ["polished_andesite", 1], "ingredients": {"andesite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_andesite_slab", 1], "ingredients": {"polished_andesite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x crimson_fence_gate", "id": "textcraft.train.582", "max_steps": 50, "misc": {"target_items": {"crimson_fence_gate": 2}, "initial_inventory": {"acacia_log": 1, "crimson_stem": 2, "warped_fungus": 3, "melon_slice": 4, "nether_brick": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["crimson_planks", 1], "ingredients": {"crimson_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["crimson_fence_gate", 2], "ingredients": {"stick": 8, "crimson_planks": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x stone_shovel, 3x prismarine_wall", "id": "textcraft.train.583", "max_steps": 50, "misc": {"target_items": {"stone_shovel": 1, "prismarine_wall": 3}, "initial_inventory": {"blackstone": 1, "acacia_log": 1, "prismarine_shard": 27, "white_tulip": 2, "cobblestone": 5, "stripped_jungle_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_shovel", 1], "ingredients": {"cobblestone": 1, "stick": 2}, "result_count": 1}, {"action": "craft", "target": ["prismarine", 6], "ingredients": {"prismarine_shard": 24}, "result_count": 6}, {"action": "craft", "target": ["prismarine_wall", 1], "ingredients": {"prismarine": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x black_banner, 1x red_nether_brick_stairs, 2x polished_blackstone_brick_wall", "id": "textcraft.train.584", "max_steps": 50, "misc": {"target_items": {"black_banner": 2, "red_nether_brick_stairs": 1, "polished_blackstone_brick_wall": 2}, "initial_inventory": {"wither_rose": 13, "string": 63, "acacia_log": 1, "nether_brick": 16, "nether_wart": 17, "blackstone": 11, "ender_pearl": 5, "orange_tulip": 1, "popped_chorus_fruit": 2, "rose_bush": 5}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 12], "ingredients": {"wither_rose": 12}, "result_count": 12}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["black_wool", 12], "ingredients": {"black_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["black_banner", 2], "ingredients": {"black_wool": 12, "stick": 2}, "result_count": 2}, {"action": "craft", "target": ["red_nether_bricks", 6], "ingredients": {"nether_brick": 12, "nether_wart": 12}, "result_count": 6}, {"action": "craft", "target": ["red_nether_brick_stairs", 1], "ingredients": {"red_nether_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_bricks", 2], "ingredients": {"polished_blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_brick_wall", 1], "ingredients": {"polished_blackstone_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x blue_bed", "id": "textcraft.train.585", "max_steps": 50, "misc": {"target_items": {"blue_bed": 2}, "initial_inventory": {"string": 32, "acacia_log": 3, "cornflower": 2, "snowball": 2, "red_tulip": 5, "poppy": 2, "spruce_log": 5, "beetroot": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["white_bed", 2], "ingredients": {"white_wool": 6, "acacia_planks": 6}, "result_count": 2}, {"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["blue_bed", 2], "ingredients": {"white_bed": 2, "blue_dye": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x brown_stained_glass, 1x white_terracotta, 2x ladder", "id": "textcraft.train.586", "max_steps": 50, "misc": {"target_items": {"brown_stained_glass": 1, "white_terracotta": 1, "ladder": 2}, "initial_inventory": {"glass": 11, "cocoa_beans": 2, "terracotta": 11, "lily_of_the_valley": 1, "acacia_log": 1, "jungle_log": 5, "string": 2, "glowstone_dust": 1, "carrot": 5}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_stained_glass", 1], "ingredients": {"glass": 8, "brown_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_terracotta", 1], "ingredients": {"terracotta": 8, "white_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["ladder", 1], "ingredients": {"stick": 7}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x white_banner, 1x purple_concrete_powder", "id": "textcraft.train.587", "max_steps": 50, "misc": {"target_items": {"white_banner": 2, "purple_concrete_powder": 1}, "initial_inventory": {"string": 53, "acacia_log": 1, "cornflower": 2, "rose_bush": 2, "sand": 4, "gravel": 4, "stripped_oak_log": 3, "smooth_red_sandstone": 1}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["white_banner", 2], "ingredients": {"white_wool": 12, "stick": 2}, "result_count": 2}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_concrete_powder", 1], "ingredients": {"purple_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x grindstone, 2x warped_sign, 1x prismarine_stairs", "id": "textcraft.train.588", "max_steps": 50, "misc": {"target_items": {"grindstone": 3, "warped_sign": 2, "prismarine_stairs": 1}, "initial_inventory": {"acacia_log": 5, "stone": 4, "warped_stem": 2, "prismarine_shard": 32, "dandelion": 1, "carrot": 3, "cooked_rabbit": 1, "feather": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["stone_slab", 1], "ingredients": {"stone": 3}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["grindstone", 3], "ingredients": {"stick": 6, "stone_slab": 3, "acacia_planks": 6}, "result_count": 3}, {"action": "craft", "target": ["warped_planks", 2], "ingredients": {"warped_stem": 2}, "result_count": 8}, {"action": "craft", "target": ["warped_sign", 1], "ingredients": {"warped_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["prismarine", 6], "ingredients": {"prismarine_shard": 24}, "result_count": 6}, {"action": "craft", "target": ["prismarine_stairs", 1], "ingredients": {"prismarine": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x white_stained_glass, 2x yellow_banner, 1x red_terracotta", "id": "textcraft.train.589", "max_steps": 50, "misc": {"target_items": {"white_stained_glass": 2, "yellow_banner": 2, "red_terracotta": 1}, "initial_inventory": {"glass": 10, "lily_of_the_valley": 2, "dandelion": 17, "string": 50, "acacia_log": 2, "terracotta": 12, "rose_bush": 1, "clay_ball": 1, "nautilus_shell": 5, "warped_stem": 3}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_stained_glass", 1], "ingredients": {"glass": 8, "white_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["yellow_dye", 12], "ingredients": {"dandelion": 12}, "result_count": 12}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["yellow_wool", 12], "ingredients": {"yellow_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["yellow_banner", 2], "ingredients": {"yellow_wool": 12, "stick": 2}, "result_count": 2}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_terracotta", 1], "ingredients": {"terracotta": 8, "red_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x red_carpet, 2x red_banner", "id": "textcraft.train.590", "max_steps": 50, "misc": {"target_items": {"red_carpet": 2, "red_banner": 2}, "initial_inventory": {"rose_bush": 9, "string": 60, "acacia_log": 2, "stripped_warped_stem": 2, "carrot": 3, "spruce_log": 1, "glowstone_dust": 1}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["red_wool", 2], "ingredients": {"red_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["red_carpet", 1], "ingredients": {"red_wool": 2}, "result_count": 3}, {"action": "craft", "target": ["red_dye", 6], "ingredients": {"rose_bush": 6}, "result_count": 12}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["red_wool", 12], "ingredients": {"red_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["red_banner", 2], "ingredients": {"red_wool": 12, "stick": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x polished_blackstone_button", "id": "textcraft.train.591", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_button": 1}, "initial_inventory": {"blackstone": 6, "nautilus_shell": 3, "clay_ball": 1}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_button", 1], "ingredients": {"polished_blackstone": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x brown_carpet", "id": "textcraft.train.592", "max_steps": 50, "misc": {"target_items": {"brown_carpet": 1}, "initial_inventory": {"cocoa_beans": 3, "string": 9, "carved_pumpkin": 1, "red_tulip": 3, "warped_fungus": 5}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 2], "ingredients": {"cocoa_beans": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["brown_wool", 2], "ingredients": {"brown_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["brown_carpet", 1], "ingredients": {"brown_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x red_concrete_powder", "id": "textcraft.train.593", "max_steps": 50, "misc": {"target_items": {"red_concrete_powder": 1}, "initial_inventory": {"rose_bush": 2, "sand": 4, "gravel": 6, "pink_tulip": 1, "ink_sac": 1}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_concrete_powder", 1], "ingredients": {"red_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x dark_prismarine", "id": "textcraft.train.594", "max_steps": 50, "misc": {"target_items": {"dark_prismarine": 2}, "initial_inventory": {"prismarine_shard": 19, "wither_rose": 2, "stripped_oak_log": 5, "smooth_red_sandstone": 5, "orange_tulip": 5, "brick": 2}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["dark_prismarine", 2], "ingredients": {"prismarine_shard": 16, "black_dye": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x red_stained_glass", "id": "textcraft.train.595", "max_steps": 50, "misc": {"target_items": {"red_stained_glass": 1}, "initial_inventory": {"glass": 10, "rose_bush": 2, "white_tulip": 3, "cobblestone": 3}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_stained_glass", 1], "ingredients": {"glass": 8, "red_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x jungle_fence, 2x yellow_terracotta", "id": "textcraft.train.596", "max_steps": 50, "misc": {"target_items": {"jungle_fence": 2, "yellow_terracotta": 2}, "initial_inventory": {"jungle_log": 2, "acacia_log": 2, "terracotta": 10, "dandelion": 1, "cooked_rabbit": 1, "prismarine_shard": 3}, "gold_trajectory": [{"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"jungle_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["jungle_fence", 1], "ingredients": {"jungle_planks": 4, "stick": 2}, "result_count": 3}, {"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_terracotta", 1], "ingredients": {"terracotta": 8, "yellow_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x stone_axe, 2x green_wool", "id": "textcraft.train.597", "max_steps": 50, "misc": {"target_items": {"stone_axe": 2, "green_wool": 2}, "initial_inventory": {"blackstone": 9, "acacia_log": 2, "green_dye": 3, "string": 9, "nautilus_shell": 4, "nether_brick": 1, "baked_potato": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_axe", 2], "ingredients": {"blackstone": 6, "stick": 4}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["green_wool", 2], "ingredients": {"green_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x chiseled_polished_blackstone, 1x dark_prismarine_stairs, 1x gray_wool", "id": "textcraft.train.598", "max_steps": 50, "misc": {"target_items": {"chiseled_polished_blackstone": 1, "dark_prismarine_stairs": 1, "gray_wool": 1}, "initial_inventory": {"blackstone": 4, "prismarine_shard": 60, "wither_rose": 10, "lily_of_the_valley": 1, "string": 5, "popped_chorus_fruit": 1, "gunpowder": 4, "creeper_head": 3, "stripped_warped_stem": 3}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_slab", 1], "ingredients": {"polished_blackstone": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_polished_blackstone", 1], "ingredients": {"polished_blackstone_slab": 2}, "result_count": 1}, {"action": "craft", "target": ["black_dye", 6], "ingredients": {"wither_rose": 6}, "result_count": 6}, {"action": "craft", "target": ["dark_prismarine", 6], "ingredients": {"prismarine_shard": 48, "black_dye": 6}, "result_count": 6}, {"action": "craft", "target": ["dark_prismarine_stairs", 1], "ingredients": {"dark_prismarine": 6}, "result_count": 4}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["gray_wool", 1], "ingredients": {"gray_dye": 1, "white_wool": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x mossy_cobblestone_slab", "id": "textcraft.train.599", "max_steps": 50, "misc": {"target_items": {"mossy_cobblestone_slab": 2}, "initial_inventory": {"cobblestone": 4, "vine": 4, "creeper_head": 4, "poppy": 1, "gravel": 1, "terracotta": 3}, "gold_trajectory": [{"action": "craft", "target": ["mossy_cobblestone", 3], "ingredients": {"cobblestone": 3, "vine": 3}, "result_count": 3}, {"action": "craft", "target": ["mossy_cobblestone_slab", 1], "ingredients": {"mossy_cobblestone": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x armor_stand, 1x stone_brick_stairs", "id": "textcraft.train.600", "max_steps": 50, "misc": {"target_items": {"armor_stand": 1, "stone_brick_stairs": 1}, "initial_inventory": {"acacia_log": 2, "smooth_stone": 3, "stone": 11, "oak_log": 3, "warped_fungus": 2, "rose_bush": 3, "pumpkin": 5, "cocoa_beans": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["smooth_stone_slab", 1], "ingredients": {"smooth_stone": 3}, "result_count": 6}, {"action": "craft", "target": ["armor_stand", 1], "ingredients": {"stick": 6, "smooth_stone_slab": 1}, "result_count": 1}, {"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["stone_brick_stairs", 1], "ingredients": {"stone_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x green_carpet", "id": "textcraft.train.601", "max_steps": 50, "misc": {"target_items": {"green_carpet": 1}, "initial_inventory": {"string": 32, "green_dye": 2, "apple": 3, "prismarine_shard": 2, "blue_orchid": 5, "bamboo": 1}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["green_carpet", 1], "ingredients": {"white_carpet": 8, "green_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x prismarine_brick_stairs, 3x respawn_anchor", "id": "textcraft.train.602", "max_steps": 50, "misc": {"target_items": {"prismarine_brick_stairs": 2, "respawn_anchor": 3}, "initial_inventory": {"prismarine_shard": 61, "crying_obsidian": 23, "glowstone_dust": 51, "brown_mushroom": 3, "string": 3, "pink_tulip": 2, "stripped_crimson_stem": 3}, "gold_trajectory": [{"action": "craft", "target": ["prismarine_bricks", 6], "ingredients": {"prismarine_shard": 54}, "result_count": 6}, {"action": "craft", "target": ["prismarine_brick_stairs", 1], "ingredients": {"prismarine_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["glowstone", 9], "ingredients": {"glowstone_dust": 36}, "result_count": 9}, {"action": "craft", "target": ["respawn_anchor", 3], "ingredients": {"crying_obsidian": 18, "glowstone": 9}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x book, 1x bow, 1x gray_wool", "id": "textcraft.train.603", "max_steps": 50, "misc": {"target_items": {"book": 3, "bow": 1, "gray_wool": 1}, "initial_inventory": {"sugar_cane": 12, "rabbit_hide": 16, "acacia_log": 2, "string": 7, "wither_rose": 2, "lily_of_the_valley": 1, "prismarine_crystals": 2, "clay_ball": 3, "azure_bluet": 5, "carrot": 4, "red_sand": 3}, "gold_trajectory": [{"action": "craft", "target": ["paper", 3], "ingredients": {"sugar_cane": 9}, "result_count": 9}, {"action": "craft", "target": ["leather", 3], "ingredients": {"rabbit_hide": 12}, "result_count": 3}, {"action": "craft", "target": ["book", 3], "ingredients": {"paper": 9, "leather": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["bow", 1], "ingredients": {"stick": 3, "string": 3}, "result_count": 1}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["gray_wool", 1], "ingredients": {"gray_dye": 1, "white_wool": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x end_stone_brick_slab", "id": "textcraft.train.604", "max_steps": 50, "misc": {"target_items": {"end_stone_brick_slab": 2}, "initial_inventory": {"end_stone": 4, "stone": 2, "stripped_jungle_log": 1, "bamboo": 2, "cornflower": 1}, "gold_trajectory": [{"action": "craft", "target": ["end_stone_bricks", 1], "ingredients": {"end_stone": 4}, "result_count": 4}, {"action": "craft", "target": ["end_stone_brick_slab", 1], "ingredients": {"end_stone_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x stone_brick_wall, 3x sandstone_wall", "id": "textcraft.train.605", "max_steps": 50, "misc": {"target_items": {"stone_brick_wall": 2, "sandstone_wall": 3}, "initial_inventory": {"stone": 9, "sand": 36, "lily_of_the_valley": 4, "red_sand": 5, "popped_chorus_fruit": 2}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["stone_brick_wall", 1], "ingredients": {"stone_bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["sandstone", 6], "ingredients": {"sand": 24}, "result_count": 6}, {"action": "craft", "target": ["sandstone_wall", 1], "ingredients": {"sandstone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x polished_diorite", "id": "textcraft.train.606", "max_steps": 50, "misc": {"target_items": {"polished_diorite": 3}, "initial_inventory": {"cobblestone": 6, "quartz": 5, "blue_orchid": 4, "ender_pearl": 2}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x blue_wool, 1x andesite_wall", "id": "textcraft.train.607", "max_steps": 50, "misc": {"target_items": {"blue_wool": 2, "andesite_wall": 1}, "initial_inventory": {"cornflower": 3, "string": 11, "cobblestone": 7, "quartz": 6, "ice": 3, "glass": 2, "smooth_quartz": 5, "ink_sac": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["blue_wool", 2], "ingredients": {"blue_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 3], "ingredients": {"diorite": 3, "cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["andesite_wall", 1], "ingredients": {"andesite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x cartography_table, 1x mossy_cobblestone_wall", "id": "textcraft.train.608", "max_steps": 50, "misc": {"target_items": {"cartography_table": 3, "mossy_cobblestone_wall": 1}, "initial_inventory": {"sugar_cane": 6, "acacia_log": 3, "cobblestone": 9, "vine": 6, "baked_potato": 2, "sand": 5}, "gold_trajectory": [{"action": "craft", "target": ["paper", 2], "ingredients": {"sugar_cane": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["cartography_table", 3], "ingredients": {"paper": 6, "acacia_planks": 12}, "result_count": 3}, {"action": "craft", "target": ["mossy_cobblestone", 6], "ingredients": {"cobblestone": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_cobblestone_wall", 1], "ingredients": {"mossy_cobblestone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x yellow_stained_glass_pane", "id": "textcraft.train.609", "max_steps": 50, "misc": {"target_items": {"yellow_stained_glass_pane": 1}, "initial_inventory": {"glass": 8, "dandelion": 2, "azure_bluet": 4, "rose_bush": 1, "gunpowder": 4, "wither_skeleton_skull": 1}, "gold_trajectory": [{"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "yellow_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x polished_blackstone_brick_wall", "id": "textcraft.train.610", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_brick_wall": 3}, "initial_inventory": {"blackstone": 9, "sunflower": 1, "cornflower": 2, "basalt": 2, "stripped_spruce_log": 3, "smooth_quartz": 4}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_bricks", 2], "ingredients": {"polished_blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_brick_wall", 1], "ingredients": {"polished_blackstone_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x granite_slab, 2x pink_concrete_powder, 1x bow", "id": "textcraft.train.611", "max_steps": 50, "misc": {"target_items": {"granite_slab": 3, "pink_concrete_powder": 2, "bow": 1}, "initial_inventory": {"cobblestone": 5, "quartz": 7, "pink_tulip": 2, "sand": 6, "gravel": 4, "acacia_log": 2, "string": 3, "stripped_dark_oak_log": 1, "warped_fungus": 5, "brick": 3}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 3], "ingredients": {"diorite": 3, "quartz": 3}, "result_count": 3}, {"action": "craft", "target": ["granite_slab", 1], "ingredients": {"granite": 3}, "result_count": 6}, {"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_concrete_powder", 1], "ingredients": {"pink_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["bow", 1], "ingredients": {"stick": 3, "string": 3}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x red_nether_brick_stairs, 1x yellow_concrete_powder, 3x writable_book", "id": "textcraft.train.612", "max_steps": 50, "misc": {"target_items": {"red_nether_brick_stairs": 1, "yellow_concrete_powder": 1, "writable_book": 3}, "initial_inventory": {"nether_brick": 14, "nether_wart": 14, "dandelion": 1, "sand": 5, "gravel": 5, "sugar_cane": 12, "rabbit_hide": 12, "ink_sac": 4, "feather": 4, "glowstone_dust": 5}, "gold_trajectory": [{"action": "craft", "target": ["red_nether_bricks", 6], "ingredients": {"nether_brick": 12, "nether_wart": 12}, "result_count": 6}, {"action": "craft", "target": ["red_nether_brick_stairs", 1], "ingredients": {"red_nether_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_concrete_powder", 1], "ingredients": {"yellow_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["paper", 3], "ingredients": {"sugar_cane": 9}, "result_count": 9}, {"action": "craft", "target": ["leather", 3], "ingredients": {"rabbit_hide": 12}, "result_count": 3}, {"action": "craft", "target": ["book", 3], "ingredients": {"paper": 9, "leather": 3}, "result_count": 3}, {"action": "craft", "target": ["writable_book", 3], "ingredients": {"book": 3, "ink_sac": 3, "feather": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x yellow_carpet, 2x red_stained_glass, 2x diorite_stairs", "id": "textcraft.train.613", "max_steps": 50, "misc": {"target_items": {"yellow_carpet": 3, "red_stained_glass": 2, "diorite_stairs": 2}, "initial_inventory": {"dandelion": 3, "string": 8, "glass": 9, "rose_bush": 2, "cobblestone": 7, "quartz": 6, "oak_log": 2, "lilac": 3, "melon_slice": 4, "apple": 4}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 2], "ingredients": {"dandelion": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["yellow_wool", 2], "ingredients": {"yellow_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["yellow_carpet", 1], "ingredients": {"yellow_wool": 2}, "result_count": 3}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_stained_glass", 1], "ingredients": {"glass": 8, "red_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_stairs", 1], "ingredients": {"diorite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x orange_dye, 1x sugar, 2x crimson_sign", "id": "textcraft.train.614", "max_steps": 50, "misc": {"target_items": {"orange_dye": 3, "sugar": 1, "crimson_sign": 2}, "initial_inventory": {"orange_tulip": 4, "sugar_cane": 2, "crimson_stem": 2, "acacia_log": 1, "smooth_sandstone": 1, "clay_ball": 1}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 3], "ingredients": {"orange_tulip": 3}, "result_count": 3}, {"action": "craft", "target": ["sugar", 1], "ingredients": {"sugar_cane": 1}, "result_count": 1}, {"action": "craft", "target": ["crimson_planks", 2], "ingredients": {"crimson_stem": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"crimson_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["crimson_sign", 1], "ingredients": {"crimson_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x yellow_carpet", "id": "textcraft.train.615", "max_steps": 50, "misc": {"target_items": {"yellow_carpet": 1}, "initial_inventory": {"dandelion": 2, "string": 10, "stripped_birch_log": 4, "melon_slice": 1, "stripped_oak_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 2], "ingredients": {"dandelion": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["yellow_wool", 2], "ingredients": {"yellow_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["yellow_carpet", 1], "ingredients": {"yellow_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x leather_chestplate", "id": "textcraft.train.616", "max_steps": 50, "misc": {"target_items": {"leather_chestplate": 3}, "initial_inventory": {"rabbit_hide": 120, "crying_obsidian": 4, "blaze_rod": 4}, "gold_trajectory": [{"action": "craft", "target": ["leather", 24], "ingredients": {"rabbit_hide": 96}, "result_count": 24}, {"action": "craft", "target": ["leather_chestplate", 3], "ingredients": {"leather": 24}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x yellow_stained_glass_pane", "id": "textcraft.train.617", "max_steps": 50, "misc": {"target_items": {"yellow_stained_glass_pane": 3}, "initial_inventory": {"glass": 9, "dandelion": 1, "white_tulip": 4, "brown_mushroom": 4}, "gold_trajectory": [{"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "yellow_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x warped_fungus_on_a_stick, 2x green_carpet", "id": "textcraft.train.618", "max_steps": 50, "misc": {"target_items": {"warped_fungus_on_a_stick": 2, "green_carpet": 2}, "initial_inventory": {"acacia_log": 2, "string": 36, "warped_fungus": 2, "green_dye": 2, "apple": 5, "wither_skeleton_skull": 2, "smooth_quartz": 3, "orange_tulip": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["fishing_rod", 2], "ingredients": {"stick": 6, "string": 4}, "result_count": 2}, {"action": "craft", "target": ["warped_fungus_on_a_stick", 2], "ingredients": {"fishing_rod": 2, "warped_fungus": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["green_carpet", 1], "ingredients": {"white_carpet": 8, "green_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x snow, 3x leather_boots, 1x blue_stained_glass", "id": "textcraft.train.619", "max_steps": 50, "misc": {"target_items": {"snow": 1, "leather_boots": 3, "blue_stained_glass": 1}, "initial_inventory": {"snowball": 14, "rabbit_hide": 65, "glass": 9, "cornflower": 1, "carrot": 1, "smooth_quartz": 3, "stripped_warped_stem": 4, "dandelion": 4}, "gold_trajectory": [{"action": "craft", "target": ["snow_block", 3], "ingredients": {"snowball": 12}, "result_count": 3}, {"action": "craft", "target": ["snow", 1], "ingredients": {"snow_block": 3}, "result_count": 6}, {"action": "craft", "target": ["leather", 12], "ingredients": {"rabbit_hide": 48}, "result_count": 12}, {"action": "craft", "target": ["leather_boots", 3], "ingredients": {"leather": 12}, "result_count": 3}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_stained_glass", 1], "ingredients": {"glass": 8, "blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x cut_sandstone, 3x grindstone, 2x birch_sign", "id": "textcraft.train.620", "max_steps": 50, "misc": {"target_items": {"cut_sandstone": 1, "grindstone": 3, "birch_sign": 2}, "initial_inventory": {"sand": 19, "acacia_log": 5, "stone": 4, "birch_log": 2, "allium": 1, "warped_stem": 1}, "gold_trajectory": [{"action": "craft", "target": ["sandstone", 4], "ingredients": {"sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_sandstone", 1], "ingredients": {"sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["stone_slab", 1], "ingredients": {"stone": 3}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["grindstone", 3], "ingredients": {"stick": 6, "stone_slab": 3, "acacia_planks": 6}, "result_count": 3}, {"action": "craft", "target": ["birch_planks", 2], "ingredients": {"birch_log": 2}, "result_count": 8}, {"action": "craft", "target": ["birch_sign", 1], "ingredients": {"birch_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x mossy_stone_brick_slab", "id": "textcraft.train.621", "max_steps": 50, "misc": {"target_items": {"mossy_stone_brick_slab": 2}, "initial_inventory": {"stone": 5, "vine": 4, "melon_slice": 3, "cocoa_beans": 5, "acacia_log": 4, "stripped_oak_log": 5}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["mossy_stone_bricks", 3], "ingredients": {"stone_bricks": 3, "vine": 3}, "result_count": 3}, {"action": "craft", "target": ["mossy_stone_brick_slab", 1], "ingredients": {"mossy_stone_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x leather_boots, 2x leather_leggings, 2x blue_concrete_powder", "id": "textcraft.train.622", "max_steps": 50, "misc": {"target_items": {"leather_boots": 1, "leather_leggings": 2, "blue_concrete_powder": 2}, "initial_inventory": {"rabbit_hide": 94, "cornflower": 1, "sand": 5, "gravel": 6, "red_tulip": 5, "beetroot": 1, "cocoa_beans": 5, "clay_ball": 3, "pumpkin": 4}, "gold_trajectory": [{"action": "craft", "target": ["leather", 4], "ingredients": {"rabbit_hide": 16}, "result_count": 4}, {"action": "craft", "target": ["leather_boots", 1], "ingredients": {"leather": 4}, "result_count": 1}, {"action": "craft", "target": ["leather", 14], "ingredients": {"rabbit_hide": 56}, "result_count": 14}, {"action": "craft", "target": ["leather_leggings", 2], "ingredients": {"leather": 14}, "result_count": 2}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_concrete_powder", 1], "ingredients": {"blue_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x light_blue_terracotta", "id": "textcraft.train.623", "max_steps": 50, "misc": {"target_items": {"light_blue_terracotta": 3}, "initial_inventory": {"terracotta": 8, "cornflower": 2, "lily_of_the_valley": 2, "enchanted_golden_apple": 5, "bamboo": 1, "smooth_quartz": 3, "stripped_warped_stem": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_terracotta", 1], "ingredients": {"terracotta": 8, "light_blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x white_stained_glass_pane, 3x gray_wool, 2x red_stained_glass", "id": "textcraft.train.624", "max_steps": 50, "misc": {"target_items": {"white_stained_glass_pane": 1, "gray_wool": 3, "red_stained_glass": 2}, "initial_inventory": {"glass": 15, "lily_of_the_valley": 3, "wither_rose": 3, "string": 14, "rose_bush": 2, "blackstone": 5}, "gold_trajectory": [{"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "white_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_dye", 2], "ingredients": {"lily_of_the_valley": 2}, "result_count": 2}, {"action": "craft", "target": ["gray_dye", 2], "ingredients": {"black_dye": 2, "white_dye": 2}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["gray_wool", 3], "ingredients": {"gray_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_stained_glass", 1], "ingredients": {"glass": 8, "red_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x gray_dye, 1x wooden_pickaxe", "id": "textcraft.train.625", "max_steps": 50, "misc": {"target_items": {"gray_dye": 1, "wooden_pickaxe": 1}, "initial_inventory": {"wither_rose": 2, "lily_of_the_valley": 2, "acacia_log": 2, "warped_planks": 3, "cooked_rabbit": 2, "stripped_crimson_stem": 5}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["stick", 1], "ingredients": {"warped_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_pickaxe", 1], "ingredients": {"acacia_planks": 3, "stick": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x acacia_fence_gate, 2x brown_banner", "id": "textcraft.train.626", "max_steps": 50, "misc": {"target_items": {"acacia_fence_gate": 2, "brown_banner": 2}, "initial_inventory": {"acacia_log": 4, "cocoa_beans": 12, "string": 50, "stripped_birch_log": 3, "bamboo": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["acacia_fence_gate", 2], "ingredients": {"stick": 8, "acacia_planks": 4}, "result_count": 2}, {"action": "craft", "target": ["brown_dye", 12], "ingredients": {"cocoa_beans": 12}, "result_count": 12}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["brown_wool", 12], "ingredients": {"brown_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["brown_banner", 2], "ingredients": {"brown_wool": 12, "stick": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x andesite, 2x red_nether_brick_stairs, 1x brown_wool", "id": "textcraft.train.627", "max_steps": 50, "misc": {"target_items": {"andesite": 2, "red_nether_brick_stairs": 2, "brown_wool": 1}, "initial_inventory": {"cobblestone": 3, "quartz": 3, "nether_brick": 12, "nether_wart": 16, "cocoa_beans": 1, "string": 4, "flint": 3, "baked_potato": 4, "oak_log": 3}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["andesite", 1], "ingredients": {"diorite": 1, "cobblestone": 1}, "result_count": 2}, {"action": "craft", "target": ["red_nether_bricks", 6], "ingredients": {"nether_brick": 12, "nether_wart": 12}, "result_count": 6}, {"action": "craft", "target": ["red_nether_brick_stairs", 1], "ingredients": {"red_nether_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["brown_wool", 1], "ingredients": {"brown_dye": 1, "white_wool": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x yellow_concrete_powder", "id": "textcraft.train.628", "max_steps": 50, "misc": {"target_items": {"yellow_concrete_powder": 1}, "initial_inventory": {"dandelion": 1, "sand": 6, "gravel": 6, "shulker_shell": 5, "oak_log": 3, "baked_potato": 3, "honeycomb": 4}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_concrete_powder", 1], "ingredients": {"yellow_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x yellow_terracotta, 1x diorite_stairs", "id": "textcraft.train.629", "max_steps": 50, "misc": {"target_items": {"yellow_terracotta": 1, "diorite_stairs": 1}, "initial_inventory": {"terracotta": 11, "dandelion": 1, "cobblestone": 7, "quartz": 7, "ink_sac": 1, "red_mushroom": 5, "bone": 5}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_terracotta", 1], "ingredients": {"terracotta": 8, "yellow_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_stairs", 1], "ingredients": {"diorite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x prismarine_brick_stairs", "id": "textcraft.train.630", "max_steps": 50, "misc": {"target_items": {"prismarine_brick_stairs": 3}, "initial_inventory": {"prismarine_shard": 78, "warped_fungus": 3, "cornflower": 3, "orange_tulip": 1, "prismarine_crystals": 4, "sunflower": 3}, "gold_trajectory": [{"action": "craft", "target": ["prismarine_bricks", 6], "ingredients": {"prismarine_shard": 54}, "result_count": 6}, {"action": "craft", "target": ["prismarine_brick_stairs", 1], "ingredients": {"prismarine_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x polished_diorite, 3x white_concrete_powder", "id": "textcraft.train.631", "max_steps": 50, "misc": {"target_items": {"polished_diorite": 3, "white_concrete_powder": 3}, "initial_inventory": {"cobblestone": 5, "quartz": 5, "lily_of_the_valley": 2, "sand": 6, "gravel": 4, "red_mushroom": 5, "birch_log": 4, "ice": 2}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_concrete_powder", 1], "ingredients": {"white_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x green_carpet", "id": "textcraft.train.632", "max_steps": 50, "misc": {"target_items": {"green_carpet": 3}, "initial_inventory": {"string": 28, "green_dye": 2, "blaze_rod": 5, "snowball": 4}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["green_carpet", 1], "ingredients": {"white_carpet": 8, "green_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x nether_brick_stairs", "id": "textcraft.train.633", "max_steps": 50, "misc": {"target_items": {"nether_brick_stairs": 1}, "initial_inventory": {"nether_brick": 35, "beetroot": 1, "blue_orchid": 3, "glass": 3}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 6], "ingredients": {"nether_brick": 24}, "result_count": 6}, {"action": "craft", "target": ["nether_brick_stairs", 1], "ingredients": {"nether_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x mossy_cobblestone_wall", "id": "textcraft.train.634", "max_steps": 50, "misc": {"target_items": {"mossy_cobblestone_wall": 1}, "initial_inventory": {"cobblestone": 8, "vine": 8, "heart_of_the_sea": 5, "nether_wart": 4, "peony": 3}, "gold_trajectory": [{"action": "craft", "target": ["mossy_cobblestone", 6], "ingredients": {"cobblestone": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_cobblestone_wall", 1], "ingredients": {"mossy_cobblestone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x green_wool", "id": "textcraft.train.635", "max_steps": 50, "misc": {"target_items": {"green_wool": 3}, "initial_inventory": {"green_dye": 3, "string": 12, "stripped_oak_log": 2, "melon_slice": 5, "rose_bush": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["green_wool", 3], "ingredients": {"green_dye": 3, "white_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x red_bed", "id": "textcraft.train.636", "max_steps": 50, "misc": {"target_items": {"red_bed": 3}, "initial_inventory": {"rose_bush": 6, "string": 39, "acacia_log": 4, "red_tulip": 3, "wither_rose": 2, "lilac": 1, "stripped_jungle_log": 1, "sunflower": 1}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 5], "ingredients": {"rose_bush": 5}, "result_count": 10}, {"action": "craft", "target": ["white_wool", 9], "ingredients": {"string": 36}, "result_count": 9}, {"action": "craft", "target": ["red_wool", 9], "ingredients": {"red_dye": 9, "white_wool": 9}, "result_count": 9}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["red_bed", 3], "ingredients": {"red_wool": 9, "acacia_planks": 9}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x cut_sandstone, 2x red_nether_brick_wall", "id": "textcraft.train.637", "max_steps": 50, "misc": {"target_items": {"cut_sandstone": 3, "red_nether_brick_wall": 2}, "initial_inventory": {"sand": 18, "nether_brick": 18, "nether_wart": 12, "melon_slice": 1, "scute": 5, "ghast_tear": 1, "dirt": 3, "clay_ball": 3}, "gold_trajectory": [{"action": "craft", "target": ["sandstone", 4], "ingredients": {"sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_sandstone", 1], "ingredients": {"sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["red_nether_bricks", 6], "ingredients": {"nether_brick": 12, "nether_wart": 12}, "result_count": 6}, {"action": "craft", "target": ["red_nether_brick_wall", 1], "ingredients": {"red_nether_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x orange_wool", "id": "textcraft.train.638", "max_steps": 50, "misc": {"target_items": {"orange_wool": 3}, "initial_inventory": {"orange_tulip": 4, "string": 18, "cooked_rabbit": 4, "melon_slice": 5, "obsidian": 1}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 3], "ingredients": {"orange_tulip": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["orange_wool", 3], "ingredients": {"orange_dye": 3, "white_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x brown_carpet", "id": "textcraft.train.639", "max_steps": 50, "misc": {"target_items": {"brown_carpet": 3}, "initial_inventory": {"cocoa_beans": 3, "string": 11, "end_stone": 2, "orange_tulip": 2}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 2], "ingredients": {"cocoa_beans": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["brown_wool", 2], "ingredients": {"brown_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["brown_carpet", 1], "ingredients": {"brown_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x crimson_fence_gate", "id": "textcraft.train.640", "max_steps": 50, "misc": {"target_items": {"crimson_fence_gate": 3}, "initial_inventory": {"acacia_log": 2, "crimson_stem": 2, "peony": 1, "smooth_sandstone": 2, "poppy": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["crimson_planks", 2], "ingredients": {"crimson_stem": 2}, "result_count": 8}, {"action": "craft", "target": ["crimson_fence_gate", 3], "ingredients": {"stick": 12, "crimson_planks": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x end_stone_brick_stairs, 3x dark_oak_fence_gate", "id": "textcraft.train.641", "max_steps": 50, "misc": {"target_items": {"end_stone_brick_stairs": 2, "dark_oak_fence_gate": 3}, "initial_inventory": {"end_stone": 12, "acacia_log": 3, "dark_oak_log": 3, "blue_orchid": 2, "vine": 1, "milk_bucket": 4}, "gold_trajectory": [{"action": "craft", "target": ["end_stone_bricks", 2], "ingredients": {"end_stone": 8}, "result_count": 8}, {"action": "craft", "target": ["end_stone_brick_stairs", 1], "ingredients": {"end_stone_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["dark_oak_planks", 2], "ingredients": {"dark_oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["dark_oak_fence_gate", 3], "ingredients": {"stick": 12, "dark_oak_planks": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x polished_blackstone_bricks", "id": "textcraft.train.642", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_bricks": 1}, "initial_inventory": {"blackstone": 4, "gravel": 4, "peony": 2, "stone": 3, "quartz": 4}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_bricks", 1], "ingredients": {"polished_blackstone": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x cut_red_sandstone", "id": "textcraft.train.643", "max_steps": 50, "misc": {"target_items": {"cut_red_sandstone": 1}, "initial_inventory": {"red_sand": 24, "crying_obsidian": 4, "stripped_jungle_log": 1, "ink_sac": 2}, "gold_trajectory": [{"action": "craft", "target": ["red_sandstone", 4], "ingredients": {"red_sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone", 1], "ingredients": {"red_sandstone": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x end_crystal", "id": "textcraft.train.644", "max_steps": 50, "misc": {"target_items": {"end_crystal": 2}, "initial_inventory": {"glass": 16, "ender_pearl": 2, "blaze_rod": 2, "ghast_tear": 3, "dandelion": 1, "quartz": 1, "clay_ball": 1}, "gold_trajectory": [{"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["ender_eye", 2], "ingredients": {"ender_pearl": 2, "blaze_powder": 2}, "result_count": 2}, {"action": "craft", "target": ["end_crystal", 2], "ingredients": {"glass": 14, "ender_eye": 2, "ghast_tear": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x black_wool", "id": "textcraft.train.645", "max_steps": 50, "misc": {"target_items": {"black_wool": 3}, "initial_inventory": {"wither_rose": 3, "string": 15, "cooked_rabbit": 1, "bamboo": 2, "stripped_crimson_stem": 2}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 3], "ingredients": {"wither_rose": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["black_wool", 3], "ingredients": {"black_dye": 3, "white_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x light_gray_dye", "id": "textcraft.train.646", "max_steps": 50, "misc": {"target_items": {"light_gray_dye": 3}, "initial_inventory": {"oxeye_daisy": 3, "baked_potato": 1}, "gold_trajectory": [{"action": "craft", "target": ["light_gray_dye", 3], "ingredients": {"oxeye_daisy": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x granite", "id": "textcraft.train.647", "max_steps": 50, "misc": {"target_items": {"granite": 2}, "initial_inventory": {"cobblestone": 2, "quartz": 4, "bone": 5, "blue_orchid": 3, "dirt": 5}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["granite", 2], "ingredients": {"diorite": 2, "quartz": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x end_stone_brick_wall, 2x gray_stained_glass", "id": "textcraft.train.648", "max_steps": 50, "misc": {"target_items": {"end_stone_brick_wall": 2, "gray_stained_glass": 2}, "initial_inventory": {"end_stone": 8, "glass": 10, "wither_rose": 2, "lily_of_the_valley": 1, "spider_eye": 4, "ender_pearl": 2}, "gold_trajectory": [{"action": "craft", "target": ["end_stone_bricks", 2], "ingredients": {"end_stone": 8}, "result_count": 8}, {"action": "craft", "target": ["end_stone_brick_wall", 1], "ingredients": {"end_stone_bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_stained_glass", 1], "ingredients": {"glass": 8, "gray_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x warped_sign", "id": "textcraft.train.649", "max_steps": 50, "misc": {"target_items": {"warped_sign": 1}, "initial_inventory": {"warped_stem": 3, "acacia_log": 2, "green_dye": 4, "stone": 4, "blue_orchid": 2, "crimson_stem": 2, "nether_brick": 1}, "gold_trajectory": [{"action": "craft", "target": ["warped_planks", 2], "ingredients": {"warped_stem": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"warped_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["warped_sign", 1], "ingredients": {"warped_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x orange_banner, 3x acacia_sign", "id": "textcraft.train.650", "max_steps": 50, "misc": {"target_items": {"orange_banner": 1, "acacia_sign": 3}, "initial_inventory": {"orange_tulip": 8, "string": 29, "acacia_log": 6, "sunflower": 4, "terracotta": 3, "heart_of_the_sea": 2, "nether_star": 5, "cooked_rabbit": 1}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 6], "ingredients": {"orange_tulip": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["orange_wool", 6], "ingredients": {"orange_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["orange_banner", 1], "ingredients": {"orange_wool": 6, "stick": 1}, "result_count": 1}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["acacia_sign", 1], "ingredients": {"acacia_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x polished_blackstone_slab", "id": "textcraft.train.651", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_slab": 1}, "initial_inventory": {"blackstone": 6, "snowball": 4, "green_dye": 3, "obsidian": 4, "sugar_cane": 5}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_slab", 1], "ingredients": {"polished_blackstone": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x bookshelf", "id": "textcraft.train.652", "max_steps": 50, "misc": {"target_items": {"bookshelf": 1}, "initial_inventory": {"acacia_log": 2, "sugar_cane": 13, "rabbit_hide": 15, "glass": 2, "sunflower": 1, "netherite_scrap": 1, "baked_potato": 2}, "gold_trajectory": [{"action": "craft", "target": ["paper", 3], "ingredients": {"sugar_cane": 9}, "result_count": 9}, {"action": "craft", "target": ["leather", 3], "ingredients": {"rabbit_hide": 12}, "result_count": 3}, {"action": "craft", "target": ["book", 3], "ingredients": {"paper": 9, "leather": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["bookshelf", 1], "ingredients": {"acacia_planks": 6, "book": 3}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x black_stained_glass", "id": "textcraft.train.653", "max_steps": 50, "misc": {"target_items": {"black_stained_glass": 3}, "initial_inventory": {"glass": 11, "wither_rose": 1, "crimson_stem": 2, "nether_wart": 4, "dirt": 1}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_stained_glass", 1], "ingredients": {"glass": 8, "black_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x polished_blackstone_slab, 3x green_stained_glass_pane", "id": "textcraft.train.654", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_slab": 2, "green_stained_glass_pane": 3}, "initial_inventory": {"blackstone": 5, "glass": 6, "green_dye": 2, "sand": 2, "brown_mushroom": 2, "cornflower": 2, "crimson_stem": 2}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_slab", 1], "ingredients": {"polished_blackstone": 3}, "result_count": 6}, {"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["green_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "green_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x end_crystal", "id": "textcraft.train.655", "max_steps": 50, "misc": {"target_items": {"end_crystal": 2}, "initial_inventory": {"glass": 20, "ender_pearl": 2, "blaze_rod": 2, "ghast_tear": 3, "heart_of_the_sea": 3, "wither_rose": 3}, "gold_trajectory": [{"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["ender_eye", 2], "ingredients": {"ender_pearl": 2, "blaze_powder": 2}, "result_count": 2}, {"action": "craft", "target": ["end_crystal", 2], "ingredients": {"glass": 14, "ender_eye": 2, "ghast_tear": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x granite_wall", "id": "textcraft.train.656", "max_steps": 50, "misc": {"target_items": {"granite_wall": 2}, "initial_inventory": {"cobblestone": 9, "quartz": 16, "green_dye": 4, "enchanted_golden_apple": 3, "honeycomb": 5}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_wall", 1], "ingredients": {"granite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x wooden_hoe", "id": "textcraft.train.657", "max_steps": 50, "misc": {"target_items": {"wooden_hoe": 1}, "initial_inventory": {"acacia_log": 3, "azure_bluet": 1, "nautilus_shell": 1, "basalt": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["wooden_hoe", 1], "ingredients": {"acacia_planks": 2, "stick": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x brown_concrete_powder", "id": "textcraft.train.658", "max_steps": 50, "misc": {"target_items": {"brown_concrete_powder": 2}, "initial_inventory": {"cocoa_beans": 1, "sand": 4, "gravel": 4, "stripped_jungle_log": 3, "poppy": 5, "egg": 1, "cooked_rabbit": 3}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_concrete_powder", 1], "ingredients": {"brown_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x granite_stairs, 1x polished_andesite_slab", "id": "textcraft.train.659", "max_steps": 50, "misc": {"target_items": {"granite_stairs": 3, "polished_andesite_slab": 1}, "initial_inventory": {"cobblestone": 10, "quartz": 14, "cooked_rabbit": 4, "carrot": 1, "spruce_log": 5}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_stairs", 1], "ingredients": {"granite": 6}, "result_count": 4}, {"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["andesite", 2], "ingredients": {"diorite": 2, "cobblestone": 2}, "result_count": 4}, {"action": "craft", "target": ["polished_andesite", 1], "ingredients": {"andesite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_andesite_slab", 1], "ingredients": {"polished_andesite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x lime_concrete_powder, 3x light_blue_dye", "id": "textcraft.train.660", "max_steps": 50, "misc": {"target_items": {"lime_concrete_powder": 1, "light_blue_dye": 3}, "initial_inventory": {"green_dye": 2, "lily_of_the_valley": 3, "sand": 4, "gravel": 5, "cornflower": 3, "ice": 5, "end_stone": 4, "red_sand": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_concrete_powder", 1], "ingredients": {"lime_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["white_dye", 2], "ingredients": {"lily_of_the_valley": 2}, "result_count": 2}, {"action": "craft", "target": ["light_blue_dye", 2], "ingredients": {"blue_dye": 2, "white_dye": 2}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x white_bed, 3x polished_andesite, 1x purple_wool", "id": "textcraft.train.661", "max_steps": 50, "misc": {"target_items": {"white_bed": 2, "polished_andesite": 3, "purple_wool": 1}, "initial_inventory": {"string": 39, "acacia_log": 3, "cobblestone": 5, "quartz": 3, "cornflower": 2, "rose_bush": 2, "nether_brick": 2, "nether_star": 3, "melon_slice": 2, "crimson_stem": 2, "vine": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["white_bed", 2], "ingredients": {"white_wool": 6, "acacia_planks": 6}, "result_count": 2}, {"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["andesite", 2], "ingredients": {"diorite": 2, "cobblestone": 2}, "result_count": 4}, {"action": "craft", "target": ["polished_andesite", 1], "ingredients": {"andesite": 4}, "result_count": 4}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["purple_wool", 1], "ingredients": {"purple_dye": 1, "white_wool": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x green_banner, 2x dark_prismarine", "id": "textcraft.train.662", "max_steps": 50, "misc": {"target_items": {"green_banner": 2, "dark_prismarine": 2}, "initial_inventory": {"green_dye": 17, "string": 60, "acacia_log": 2, "prismarine_shard": 23, "wither_rose": 2, "dark_oak_log": 4, "scute": 3, "prismarine_crystals": 5, "pink_tulip": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["green_wool", 12], "ingredients": {"green_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["green_banner", 2], "ingredients": {"green_wool": 12, "stick": 2}, "result_count": 2}, {"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["dark_prismarine", 2], "ingredients": {"prismarine_shard": 16, "black_dye": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x blue_terracotta, 3x red_nether_brick_wall", "id": "textcraft.train.663", "max_steps": 50, "misc": {"target_items": {"blue_terracotta": 2, "red_nether_brick_wall": 3}, "initial_inventory": {"terracotta": 11, "cornflower": 1, "nether_brick": 14, "nether_wart": 14, "orange_tulip": 5, "warped_fungus": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_terracotta", 1], "ingredients": {"terracotta": 8, "blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["red_nether_bricks", 6], "ingredients": {"nether_brick": 12, "nether_wart": 12}, "result_count": 6}, {"action": "craft", "target": ["red_nether_brick_wall", 1], "ingredients": {"red_nether_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x red_nether_brick_slab", "id": "textcraft.train.664", "max_steps": 50, "misc": {"target_items": {"red_nether_brick_slab": 1}, "initial_inventory": {"nether_brick": 6, "nether_wart": 7, "enchanted_golden_apple": 4, "smooth_sandstone": 4, "carved_pumpkin": 1, "peony": 5, "wither_skeleton_skull": 4}, "gold_trajectory": [{"action": "craft", "target": ["red_nether_bricks", 3], "ingredients": {"nether_brick": 6, "nether_wart": 6}, "result_count": 3}, {"action": "craft", "target": ["red_nether_brick_slab", 1], "ingredients": {"red_nether_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x black_wool", "id": "textcraft.train.665", "max_steps": 50, "misc": {"target_items": {"black_wool": 3}, "initial_inventory": {"wither_rose": 4, "string": 18, "gunpowder": 5, "spider_eye": 5}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 3], "ingredients": {"wither_rose": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["black_wool", 3], "ingredients": {"black_dye": 3, "white_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x blue_wool, 2x oak_sign, 3x cut_sandstone_slab", "id": "textcraft.train.666", "max_steps": 50, "misc": {"target_items": {"blue_wool": 1, "oak_sign": 2, "cut_sandstone_slab": 3}, "initial_inventory": {"cornflower": 2, "string": 4, "oak_log": 2, "acacia_log": 1, "sand": 22, "heart_of_the_sea": 2, "red_mushroom": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["blue_wool", 1], "ingredients": {"blue_dye": 1, "white_wool": 1}, "result_count": 1}, {"action": "craft", "target": ["oak_planks", 2], "ingredients": {"oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["oak_sign", 1], "ingredients": {"oak_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["sandstone", 4], "ingredients": {"sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_sandstone", 1], "ingredients": {"sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["cut_sandstone_slab", 1], "ingredients": {"cut_sandstone": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x yellow_stained_glass", "id": "textcraft.train.667", "max_steps": 50, "misc": {"target_items": {"yellow_stained_glass": 2}, "initial_inventory": {"glass": 10, "dandelion": 2, "cocoa_beans": 2, "cobblestone": 2, "stripped_jungle_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_stained_glass", 1], "ingredients": {"glass": 8, "yellow_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x black_stained_glass_pane, 2x black_wool", "id": "textcraft.train.668", "max_steps": 50, "misc": {"target_items": {"black_stained_glass_pane": 3, "black_wool": 2}, "initial_inventory": {"glass": 12, "wither_rose": 3, "string": 11, "azure_bluet": 3, "egg": 3, "stripped_acacia_log": 4, "allium": 5}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_stained_glass", 1], "ingredients": {"glass": 8, "black_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["black_stained_glass_pane", 1], "ingredients": {"black_stained_glass": 6}, "result_count": 16}, {"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["black_wool", 2], "ingredients": {"black_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x jungle_sign", "id": "textcraft.train.669", "max_steps": 50, "misc": {"target_items": {"jungle_sign": 1}, "initial_inventory": {"jungle_log": 2, "acacia_log": 1, "gunpowder": 5, "stripped_warped_stem": 3, "wither_rose": 5, "crying_obsidian": 3, "honeycomb": 3}, "gold_trajectory": [{"action": "craft", "target": ["jungle_planks", 2], "ingredients": {"jungle_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"jungle_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_sign", 1], "ingredients": {"jungle_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x mossy_cobblestone_stairs, 1x jungle_fence_gate, 2x polished_andesite_slab", "id": "textcraft.train.670", "max_steps": 50, "misc": {"target_items": {"mossy_cobblestone_stairs": 1, "jungle_fence_gate": 1, "polished_andesite_slab": 2}, "initial_inventory": {"cobblestone": 15, "vine": 7, "acacia_log": 2, "jungle_log": 2, "quartz": 2, "rose_bush": 4, "bone": 5, "stripped_jungle_log": 1, "gunpowder": 3}, "gold_trajectory": [{"action": "craft", "target": ["mossy_cobblestone", 6], "ingredients": {"cobblestone": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_cobblestone_stairs", 1], "ingredients": {"mossy_cobblestone": 6}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["jungle_fence_gate", 1], "ingredients": {"stick": 4, "jungle_planks": 2}, "result_count": 1}, {"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["andesite", 2], "ingredients": {"diorite": 2, "cobblestone": 2}, "result_count": 4}, {"action": "craft", "target": ["polished_andesite", 1], "ingredients": {"andesite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_andesite_slab", 1], "ingredients": {"polished_andesite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x orange_bed", "id": "textcraft.train.671", "max_steps": 50, "misc": {"target_items": {"orange_bed": 2}, "initial_inventory": {"orange_tulip": 6, "string": 36, "acacia_log": 3, "end_stone": 4, "prismarine_crystals": 1, "nether_star": 4, "egg": 3}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 6], "ingredients": {"orange_tulip": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["orange_wool", 6], "ingredients": {"orange_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["orange_bed", 2], "ingredients": {"orange_wool": 6, "acacia_planks": 6}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x purple_terracotta, 2x quartz_pillar", "id": "textcraft.train.672", "max_steps": 50, "misc": {"target_items": {"purple_terracotta": 3, "quartz_pillar": 2}, "initial_inventory": {"terracotta": 9, "cornflower": 2, "rose_bush": 2, "quartz": 9, "acacia_log": 4, "shulker_shell": 3, "spruce_log": 2, "obsidian": 1, "vine": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_terracotta", 1], "ingredients": {"terracotta": 8, "purple_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["quartz_block", 2], "ingredients": {"quartz": 8}, "result_count": 2}, {"action": "craft", "target": ["quartz_pillar", 1], "ingredients": {"quartz_block": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x orange_stained_glass", "id": "textcraft.train.673", "max_steps": 50, "misc": {"target_items": {"orange_stained_glass": 1}, "initial_inventory": {"glass": 9, "orange_tulip": 2, "allium": 2, "carrot": 4, "peony": 4, "carved_pumpkin": 3}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_stained_glass", 1], "ingredients": {"glass": 8, "orange_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x acacia_sign", "id": "textcraft.train.674", "max_steps": 50, "misc": {"target_items": {"acacia_sign": 2}, "initial_inventory": {"acacia_log": 3, "ghast_tear": 4, "rabbit_hide": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_sign", 1], "ingredients": {"acacia_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x bookshelf, 1x white_bed", "id": "textcraft.train.675", "max_steps": 50, "misc": {"target_items": {"bookshelf": 2, "white_bed": 1}, "initial_inventory": {"acacia_log": 5, "sugar_cane": 18, "rabbit_hide": 31, "string": 18, "smooth_stone": 3}, "gold_trajectory": [{"action": "craft", "target": ["paper", 6], "ingredients": {"sugar_cane": 18}, "result_count": 18}, {"action": "craft", "target": ["leather", 6], "ingredients": {"rabbit_hide": 24}, "result_count": 6}, {"action": "craft", "target": ["book", 6], "ingredients": {"paper": 18, "leather": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["bookshelf", 2], "ingredients": {"acacia_planks": 12, "book": 6}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["white_bed", 1], "ingredients": {"white_wool": 3, "acacia_planks": 3}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x green_banner, 2x polished_blackstone_brick_slab", "id": "textcraft.train.676", "max_steps": 50, "misc": {"target_items": {"green_banner": 1, "polished_blackstone_brick_slab": 2}, "initial_inventory": {"green_dye": 7, "string": 31, "acacia_log": 1, "blackstone": 4, "ice": 4, "red_tulip": 2, "stripped_warped_stem": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["green_wool", 6], "ingredients": {"green_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["green_banner", 1], "ingredients": {"green_wool": 6, "stick": 1}, "result_count": 1}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_bricks", 1], "ingredients": {"polished_blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_brick_slab", 1], "ingredients": {"polished_blackstone_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x dark_prismarine", "id": "textcraft.train.677", "max_steps": 50, "misc": {"target_items": {"dark_prismarine": 1}, "initial_inventory": {"prismarine_shard": 10, "wither_rose": 2, "pink_tulip": 3, "acacia_log": 2, "warped_fungus": 4, "poppy": 5}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["dark_prismarine", 1], "ingredients": {"prismarine_shard": 8, "black_dye": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x mossy_cobblestone_wall", "id": "textcraft.train.678", "max_steps": 50, "misc": {"target_items": {"mossy_cobblestone_wall": 1}, "initial_inventory": {"cobblestone": 7, "vine": 9, "melon_slice": 4, "orange_tulip": 5}, "gold_trajectory": [{"action": "craft", "target": ["mossy_cobblestone", 6], "ingredients": {"cobblestone": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_cobblestone_wall", 1], "ingredients": {"mossy_cobblestone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x painting", "id": "textcraft.train.679", "max_steps": 50, "misc": {"target_items": {"painting": 1}, "initial_inventory": {"acacia_log": 1, "wither_rose": 2, "string": 4, "peony": 5, "glowstone_dust": 2, "egg": 3, "enchanted_golden_apple": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["black_wool", 1], "ingredients": {"black_dye": 1, "white_wool": 1}, "result_count": 1}, {"action": "craft", "target": ["painting", 1], "ingredients": {"stick": 8, "black_wool": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x mossy_stone_bricks", "id": "textcraft.train.680", "max_steps": 50, "misc": {"target_items": {"mossy_stone_bricks": 2}, "initial_inventory": {"stone": 4, "vine": 2, "quartz": 1, "cobblestone": 2, "popped_chorus_fruit": 2}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["mossy_stone_bricks", 2], "ingredients": {"stone_bricks": 2, "vine": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x light_blue_stained_glass", "id": "textcraft.train.681", "max_steps": 50, "misc": {"target_items": {"light_blue_stained_glass": 2}, "initial_inventory": {"glass": 11, "cornflower": 1, "lily_of_the_valley": 2, "clay_ball": 2, "crying_obsidian": 1, "apple": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_stained_glass", 1], "ingredients": {"glass": 8, "light_blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x acacia_fence_gate", "id": "textcraft.train.682", "max_steps": 50, "misc": {"target_items": {"acacia_fence_gate": 2}, "initial_inventory": {"acacia_log": 2, "blue_orchid": 1, "stripped_dark_oak_log": 2, "pumpkin": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["acacia_fence_gate", 2], "ingredients": {"stick": 8, "acacia_planks": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x purple_concrete_powder", "id": "textcraft.train.683", "max_steps": 50, "misc": {"target_items": {"purple_concrete_powder": 1}, "initial_inventory": {"cornflower": 1, "rose_bush": 1, "sand": 4, "gravel": 5, "blaze_rod": 2, "pink_tulip": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_concrete_powder", 1], "ingredients": {"purple_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x blue_stained_glass, 3x polished_diorite_slab", "id": "textcraft.train.684", "max_steps": 50, "misc": {"target_items": {"blue_stained_glass": 3, "polished_diorite_slab": 3}, "initial_inventory": {"glass": 12, "cornflower": 2, "cobblestone": 5, "quartz": 4, "glowstone_dust": 4, "stripped_acacia_log": 5, "jungle_log": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_stained_glass", 1], "ingredients": {"glass": 8, "blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite_slab", 1], "ingredients": {"polished_diorite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x wooden_sword, 2x gray_stained_glass", "id": "textcraft.train.685", "max_steps": 50, "misc": {"target_items": {"wooden_sword": 3, "gray_stained_glass": 2}, "initial_inventory": {"acacia_log": 3, "glass": 12, "wither_rose": 1, "lily_of_the_valley": 1, "quartz": 5, "dirt": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_sword", 3], "ingredients": {"acacia_planks": 6, "stick": 3}, "result_count": 3}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_stained_glass", 1], "ingredients": {"glass": 8, "gray_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x polished_blackstone_wall", "id": "textcraft.train.686", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_wall": 1}, "initial_inventory": {"blackstone": 9, "carved_pumpkin": 5, "red_sand": 5, "bone": 2}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_wall", 1], "ingredients": {"polished_blackstone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x blue_wool, 3x cyan_stained_glass, 1x white_banner", "id": "textcraft.train.687", "max_steps": 50, "misc": {"target_items": {"blue_wool": 3, "cyan_stained_glass": 3, "white_banner": 1}, "initial_inventory": {"cornflower": 5, "string": 44, "glass": 10, "green_dye": 1, "acacia_log": 1, "cocoa_beans": 4, "melon_slice": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 3], "ingredients": {"cornflower": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["blue_wool", 3], "ingredients": {"blue_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_stained_glass", 1], "ingredients": {"glass": 8, "cyan_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["white_banner", 1], "ingredients": {"white_wool": 6, "stick": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x orange_stained_glass", "id": "textcraft.train.688", "max_steps": 50, "misc": {"target_items": {"orange_stained_glass": 1}, "initial_inventory": {"glass": 12, "orange_tulip": 1, "bone": 4, "apple": 5, "azure_bluet": 3, "smooth_stone": 2, "pumpkin": 3}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_stained_glass", 1], "ingredients": {"glass": 8, "orange_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x stone_pickaxe", "id": "textcraft.train.689", "max_steps": 50, "misc": {"target_items": {"stone_pickaxe": 3}, "initial_inventory": {"blackstone": 11, "acacia_log": 1, "apple": 2, "gravel": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["stone_pickaxe", 3], "ingredients": {"blackstone": 9, "stick": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x oak_sign", "id": "textcraft.train.690", "max_steps": 50, "misc": {"target_items": {"oak_sign": 3}, "initial_inventory": {"oak_log": 2, "acacia_log": 2, "bamboo": 1, "stripped_spruce_log": 4, "crimson_stem": 1, "sunflower": 5, "carved_pumpkin": 1}, "gold_trajectory": [{"action": "craft", "target": ["oak_planks", 2], "ingredients": {"oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["oak_sign", 1], "ingredients": {"oak_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x cyan_dye, 3x red_carpet, 2x light_blue_concrete_powder", "id": "textcraft.train.691", "max_steps": 50, "misc": {"target_items": {"cyan_dye": 1, "red_carpet": 3, "light_blue_concrete_powder": 2}, "initial_inventory": {"cornflower": 2, "green_dye": 1, "rose_bush": 2, "string": 8, "lily_of_the_valley": 2, "sand": 4, "gravel": 4, "red_sand": 5, "brown_mushroom": 4, "clay_ball": 3, "warped_stem": 5, "ender_pearl": 5}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["red_wool", 2], "ingredients": {"red_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["red_carpet", 1], "ingredients": {"red_wool": 2}, "result_count": 3}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_concrete_powder", 1], "ingredients": {"light_blue_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x blue_ice", "id": "textcraft.train.692", "max_steps": 50, "misc": {"target_items": {"blue_ice": 1}, "initial_inventory": {"ice": 84, "carved_pumpkin": 1, "glass": 3, "rabbit_hide": 1, "brown_mushroom": 5}, "gold_trajectory": [{"action": "craft", "target": ["packed_ice", 9], "ingredients": {"ice": 81}, "result_count": 9}, {"action": "craft", "target": ["blue_ice", 1], "ingredients": {"packed_ice": 9}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x black_bed", "id": "textcraft.train.693", "max_steps": 50, "misc": {"target_items": {"black_bed": 2}, "initial_inventory": {"wither_rose": 8, "string": 24, "acacia_log": 2, "quartz": 3, "rose_bush": 5, "pumpkin": 2, "smooth_red_sandstone": 2, "cobblestone": 1}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 6], "ingredients": {"wither_rose": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["black_wool", 6], "ingredients": {"black_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["black_bed", 2], "ingredients": {"black_wool": 6, "acacia_planks": 6}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x pink_concrete_powder", "id": "textcraft.train.694", "max_steps": 50, "misc": {"target_items": {"pink_concrete_powder": 2}, "initial_inventory": {"pink_tulip": 1, "sand": 6, "gravel": 5, "vine": 1, "glass": 2, "flint": 1, "egg": 1}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_concrete_powder", 1], "ingredients": {"pink_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x dark_prismarine_slab, 3x prismarine_slab, 1x light_blue_dye", "id": "textcraft.train.695", "max_steps": 50, "misc": {"target_items": {"dark_prismarine_slab": 2, "prismarine_slab": 3, "light_blue_dye": 1}, "initial_inventory": {"prismarine_shard": 53, "wither_rose": 3, "cornflower": 1, "lily_of_the_valley": 1, "warped_fungus": 2, "gunpowder": 2}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 3], "ingredients": {"wither_rose": 3}, "result_count": 3}, {"action": "craft", "target": ["dark_prismarine", 3], "ingredients": {"prismarine_shard": 24, "black_dye": 3}, "result_count": 3}, {"action": "craft", "target": ["dark_prismarine_slab", 1], "ingredients": {"dark_prismarine": 3}, "result_count": 6}, {"action": "craft", "target": ["prismarine", 3], "ingredients": {"prismarine_shard": 12}, "result_count": 3}, {"action": "craft", "target": ["prismarine_slab", 1], "ingredients": {"prismarine": 3}, "result_count": 6}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x quartz_pillar", "id": "textcraft.train.696", "max_steps": 50, "misc": {"target_items": {"quartz_pillar": 3}, "initial_inventory": {"quartz": 23, "red_tulip": 1, "crimson_stem": 5, "orange_tulip": 5, "apple": 5}, "gold_trajectory": [{"action": "craft", "target": ["quartz_block", 4], "ingredients": {"quartz": 16}, "result_count": 4}, {"action": "craft", "target": ["quartz_pillar", 2], "ingredients": {"quartz_block": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x spectral_arrow", "id": "textcraft.train.697", "max_steps": 50, "misc": {"target_items": {"spectral_arrow": 1}, "initial_inventory": {"glowstone_dust": 6, "flint": 1, "acacia_log": 2, "feather": 2, "stripped_warped_stem": 2, "milk_bucket": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}, {"action": "craft", "target": ["spectral_arrow", 1], "ingredients": {"glowstone_dust": 4, "arrow": 1}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x light_blue_terracotta", "id": "textcraft.train.698", "max_steps": 50, "misc": {"target_items": {"light_blue_terracotta": 3}, "initial_inventory": {"terracotta": 11, "cornflower": 2, "lily_of_the_valley": 2, "stripped_birch_log": 3, "milk_bucket": 1, "apple": 4, "smooth_sandstone": 5, "pumpkin": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_terracotta", 1], "ingredients": {"terracotta": 8, "light_blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x ender_chest, 3x pumpkin_pie, 2x light_blue_dye", "id": "textcraft.train.699", "max_steps": 50, "misc": {"target_items": {"ender_chest": 3, "pumpkin_pie": 3, "light_blue_dye": 2}, "initial_inventory": {"obsidian": 25, "ender_pearl": 4, "blaze_rod": 2, "pumpkin": 3, "sugar_cane": 4, "egg": 4, "cornflower": 2, "lily_of_the_valley": 1, "prismarine_crystals": 4, "allium": 2, "apple": 2}, "gold_trajectory": [{"action": "craft", "target": ["blaze_powder", 2], "ingredients": {"blaze_rod": 2}, "result_count": 4}, {"action": "craft", "target": ["ender_eye", 3], "ingredients": {"ender_pearl": 3, "blaze_powder": 3}, "result_count": 3}, {"action": "craft", "target": ["ender_chest", 3], "ingredients": {"obsidian": 24, "ender_eye": 3}, "result_count": 3}, {"action": "craft", "target": ["sugar", 3], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["pumpkin_pie", 3], "ingredients": {"pumpkin": 3, "sugar": 3, "egg": 3}, "result_count": 3}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x wooden_hoe, 1x cyan_terracotta", "id": "textcraft.train.700", "max_steps": 50, "misc": {"target_items": {"wooden_hoe": 1, "cyan_terracotta": 1}, "initial_inventory": {"acacia_log": 3, "terracotta": 8, "cornflower": 2, "green_dye": 1, "dark_oak_log": 1, "stripped_jungle_log": 1, "ender_pearl": 3, "enchanted_golden_apple": 4, "glass": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["wooden_hoe", 1], "ingredients": {"acacia_planks": 2, "stick": 2}, "result_count": 1}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_terracotta", 1], "ingredients": {"terracotta": 8, "cyan_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x red_bed", "id": "textcraft.train.701", "max_steps": 50, "misc": {"target_items": {"red_bed": 1}, "initial_inventory": {"rose_bush": 2, "string": 13, "acacia_log": 1, "stripped_jungle_log": 4, "glass": 5, "egg": 1}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 2], "ingredients": {"rose_bush": 2}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["red_wool", 3], "ingredients": {"red_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["red_bed", 1], "ingredients": {"red_wool": 3, "acacia_planks": 3}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x dark_oak_sign, 2x end_crystal, 3x brown_stained_glass_pane", "id": "textcraft.train.702", "max_steps": 50, "misc": {"target_items": {"dark_oak_sign": 1, "end_crystal": 2, "brown_stained_glass_pane": 3}, "initial_inventory": {"dark_oak_log": 3, "acacia_log": 2, "glass": 30, "ender_pearl": 2, "blaze_rod": 1, "ghast_tear": 3, "cocoa_beans": 2, "dirt": 2, "netherite_scrap": 5}, "gold_trajectory": [{"action": "craft", "target": ["dark_oak_planks", 2], "ingredients": {"dark_oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"dark_oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_sign", 1], "ingredients": {"dark_oak_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["ender_eye", 2], "ingredients": {"ender_pearl": 2, "blaze_powder": 2}, "result_count": 2}, {"action": "craft", "target": ["end_crystal", 2], "ingredients": {"glass": 14, "ender_eye": 2, "ghast_tear": 2}, "result_count": 2}, {"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_stained_glass", 1], "ingredients": {"glass": 8, "brown_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["brown_stained_glass_pane", 1], "ingredients": {"brown_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 2x yellow_carpet, 3x lime_dye", "id": "textcraft.train.703", "max_steps": 50, "misc": {"target_items": {"yellow_carpet": 2, "lime_dye": 3}, "initial_inventory": {"dandelion": 2, "string": 11, "green_dye": 2, "lily_of_the_valley": 2, "ice": 3, "obsidian": 1, "carved_pumpkin": 1}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 2], "ingredients": {"dandelion": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["yellow_wool", 2], "ingredients": {"yellow_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["yellow_carpet", 1], "ingredients": {"yellow_wool": 2}, "result_count": 3}, {"action": "craft", "target": ["white_dye", 2], "ingredients": {"lily_of_the_valley": 2}, "result_count": 2}, {"action": "craft", "target": ["lime_dye", 2], "ingredients": {"green_dye": 2, "white_dye": 2}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x book, 3x dark_oak_sign", "id": "textcraft.train.704", "max_steps": 50, "misc": {"target_items": {"book": 1, "dark_oak_sign": 3}, "initial_inventory": {"sugar_cane": 4, "rabbit_hide": 5, "dark_oak_log": 2, "acacia_log": 2, "beetroot": 5, "string": 4, "ender_pearl": 3, "stripped_warped_stem": 5, "ink_sac": 5}, "gold_trajectory": [{"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["leather", 1], "ingredients": {"rabbit_hide": 4}, "result_count": 1}, {"action": "craft", "target": ["book", 1], "ingredients": {"paper": 3, "leather": 1}, "result_count": 1}, {"action": "craft", "target": ["dark_oak_planks", 2], "ingredients": {"dark_oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"dark_oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_sign", 1], "ingredients": {"dark_oak_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x brick_slab, 1x pink_dye, 2x birch_fence", "id": "textcraft.train.705", "max_steps": 50, "misc": {"target_items": {"brick_slab": 1, "pink_dye": 1, "birch_fence": 2}, "initial_inventory": {"brick": 16, "pink_tulip": 1, "birch_log": 2, "acacia_log": 1, "white_tulip": 5, "allium": 2, "sand": 2}, "gold_trajectory": [{"action": "craft", "target": ["bricks", 3], "ingredients": {"brick": 12}, "result_count": 3}, {"action": "craft", "target": ["brick_slab", 1], "ingredients": {"bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["birch_planks", 1], "ingredients": {"birch_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"birch_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["birch_planks", 1], "ingredients": {"birch_log": 1}, "result_count": 4}, {"action": "craft", "target": ["birch_fence", 1], "ingredients": {"birch_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x jungle_fence_gate", "id": "textcraft.train.706", "max_steps": 50, "misc": {"target_items": {"jungle_fence_gate": 1}, "initial_inventory": {"acacia_log": 2, "jungle_log": 2, "orange_tulip": 5, "pink_tulip": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["jungle_fence_gate", 1], "ingredients": {"stick": 4, "jungle_planks": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x yellow_stained_glass", "id": "textcraft.train.707", "max_steps": 50, "misc": {"target_items": {"yellow_stained_glass": 3}, "initial_inventory": {"glass": 8, "dandelion": 2, "sugar_cane": 4, "scute": 1}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_stained_glass", 1], "ingredients": {"glass": 8, "yellow_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x mossy_cobblestone_wall", "id": "textcraft.train.708", "max_steps": 50, "misc": {"target_items": {"mossy_cobblestone_wall": 3}, "initial_inventory": {"cobblestone": 9, "vine": 8, "stripped_warped_stem": 2, "green_dye": 5}, "gold_trajectory": [{"action": "craft", "target": ["mossy_cobblestone", 6], "ingredients": {"cobblestone": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_cobblestone_wall", 1], "ingredients": {"mossy_cobblestone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x snow, 2x white_dye", "id": "textcraft.train.709", "max_steps": 50, "misc": {"target_items": {"snow": 1, "white_dye": 2}, "initial_inventory": {"snowball": 17, "lily_of_the_valley": 3, "stripped_warped_stem": 4, "string": 4}, "gold_trajectory": [{"action": "craft", "target": ["snow_block", 3], "ingredients": {"snowball": 12}, "result_count": 3}, {"action": "craft", "target": ["snow", 1], "ingredients": {"snow_block": 3}, "result_count": 6}, {"action": "craft", "target": ["white_dye", 2], "ingredients": {"lily_of_the_valley": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x spruce_sign, 1x purple_dye", "id": "textcraft.train.710", "max_steps": 50, "misc": {"target_items": {"spruce_sign": 1, "purple_dye": 1}, "initial_inventory": {"spruce_log": 2, "acacia_log": 2, "cornflower": 2, "rose_bush": 1, "beetroot": 2, "rabbit_hide": 3, "string": 3}, "gold_trajectory": [{"action": "craft", "target": ["spruce_planks", 2], "ingredients": {"spruce_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"spruce_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["spruce_sign", 1], "ingredients": {"spruce_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x quartz_pillar", "id": "textcraft.train.711", "max_steps": 50, "misc": {"target_items": {"quartz_pillar": 2}, "initial_inventory": {"quartz": 8, "terracotta": 4, "rabbit_hide": 1}, "gold_trajectory": [{"action": "craft", "target": ["quartz_block", 2], "ingredients": {"quartz": 8}, "result_count": 2}, {"action": "craft", "target": ["quartz_pillar", 1], "ingredients": {"quartz_block": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x end_stone_brick_stairs, 1x pink_stained_glass, 3x prismarine_slab", "id": "textcraft.train.712", "max_steps": 50, "misc": {"target_items": {"end_stone_brick_stairs": 2, "pink_stained_glass": 1, "prismarine_slab": 3}, "initial_inventory": {"end_stone": 12, "glass": 9, "pink_tulip": 2, "prismarine_shard": 17, "warped_fungus": 2, "carved_pumpkin": 3, "cornflower": 3, "spruce_log": 1, "gunpowder": 4}, "gold_trajectory": [{"action": "craft", "target": ["end_stone_bricks", 2], "ingredients": {"end_stone": 8}, "result_count": 8}, {"action": "craft", "target": ["end_stone_brick_stairs", 1], "ingredients": {"end_stone_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_stained_glass", 1], "ingredients": {"glass": 8, "pink_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["prismarine", 3], "ingredients": {"prismarine_shard": 12}, "result_count": 3}, {"action": "craft", "target": ["prismarine_slab", 1], "ingredients": {"prismarine": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x red_stained_glass, 1x wooden_axe, 1x yellow_banner", "id": "textcraft.train.713", "max_steps": 50, "misc": {"target_items": {"red_stained_glass": 1, "wooden_axe": 1, "yellow_banner": 1}, "initial_inventory": {"glass": 9, "rose_bush": 2, "acacia_log": 3, "dandelion": 6, "string": 26, "oak_planks": 4, "popped_chorus_fruit": 3, "green_dye": 1, "crimson_stem": 5}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_stained_glass", 1], "ingredients": {"glass": 8, "red_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_axe", 1], "ingredients": {"acacia_planks": 3, "stick": 2}, "result_count": 1}, {"action": "craft", "target": ["yellow_dye", 6], "ingredients": {"dandelion": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["yellow_wool", 6], "ingredients": {"yellow_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["yellow_banner", 1], "ingredients": {"yellow_wool": 6, "stick": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x brick_stairs, 1x birch_fence_gate", "id": "textcraft.train.714", "max_steps": 50, "misc": {"target_items": {"brick_stairs": 2, "birch_fence_gate": 1}, "initial_inventory": {"brick": 32, "acacia_log": 2, "birch_log": 1, "gunpowder": 5, "string": 3, "oxeye_daisy": 1, "allium": 2, "glowstone_dust": 1}, "gold_trajectory": [{"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_stairs", 1], "ingredients": {"bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["birch_planks", 1], "ingredients": {"birch_log": 1}, "result_count": 4}, {"action": "craft", "target": ["birch_fence_gate", 1], "ingredients": {"stick": 4, "birch_planks": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x andesite, 3x wooden_sword, 1x chiseled_nether_bricks", "id": "textcraft.train.715", "max_steps": 50, "misc": {"target_items": {"andesite": 2, "wooden_sword": 3, "chiseled_nether_bricks": 1}, "initial_inventory": {"cobblestone": 3, "quartz": 3, "acacia_log": 3, "nether_brick": 13, "smooth_red_sandstone": 5, "sunflower": 1, "blaze_rod": 3, "brick": 1, "enchanted_golden_apple": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["andesite", 1], "ingredients": {"diorite": 1, "cobblestone": 1}, "result_count": 2}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_sword", 3], "ingredients": {"acacia_planks": 6, "stick": 3}, "result_count": 3}, {"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_nether_bricks", 1], "ingredients": {"nether_brick_slab": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x leather_chestplate", "id": "textcraft.train.716", "max_steps": 50, "misc": {"target_items": {"leather_chestplate": 2}, "initial_inventory": {"rabbit_hide": 70, "crimson_stem": 4, "poppy": 5, "cooked_rabbit": 2}, "gold_trajectory": [{"action": "craft", "target": ["leather", 16], "ingredients": {"rabbit_hide": 64}, "result_count": 16}, {"action": "craft", "target": ["leather_chestplate", 2], "ingredients": {"leather": 16}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x purple_stained_glass", "id": "textcraft.train.717", "max_steps": 50, "misc": {"target_items": {"purple_stained_glass": 1}, "initial_inventory": {"glass": 8, "cornflower": 2, "rose_bush": 1, "warped_fungus": 2, "stripped_birch_log": 5}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_stained_glass", 1], "ingredients": {"glass": 8, "purple_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x andesite_stairs, 2x book", "id": "textcraft.train.718", "max_steps": 50, "misc": {"target_items": {"andesite_stairs": 3, "book": 2}, "initial_inventory": {"cobblestone": 10, "quartz": 6, "sugar_cane": 9, "rabbit_hide": 9, "wither_skeleton_skull": 2, "dirt": 5, "stripped_acacia_log": 5, "pumpkin": 3}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 3], "ingredients": {"diorite": 3, "cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["andesite_stairs", 1], "ingredients": {"andesite": 6}, "result_count": 4}, {"action": "craft", "target": ["paper", 2], "ingredients": {"sugar_cane": 6}, "result_count": 6}, {"action": "craft", "target": ["leather", 2], "ingredients": {"rabbit_hide": 8}, "result_count": 2}, {"action": "craft", "target": ["book", 2], "ingredients": {"paper": 6, "leather": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x polished_diorite, 3x white_banner", "id": "textcraft.train.719", "max_steps": 50, "misc": {"target_items": {"polished_diorite": 1, "white_banner": 3}, "initial_inventory": {"cobblestone": 5, "quartz": 6, "string": 73, "acacia_log": 2, "green_dye": 1, "smooth_stone": 4, "pink_tulip": 1, "gunpowder": 2}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["white_banner", 3], "ingredients": {"white_wool": 18, "stick": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x blue_bed", "id": "textcraft.train.720", "max_steps": 50, "misc": {"target_items": {"blue_bed": 1}, "initial_inventory": {"string": 13, "acacia_log": 1, "cornflower": 2, "nether_wart": 2, "egg": 4, "scute": 3}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["white_bed", 1], "ingredients": {"white_wool": 3, "acacia_planks": 3}, "result_count": 1}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_bed", 1], "ingredients": {"white_bed": 1, "blue_dye": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x granite_slab, 1x polished_granite_slab", "id": "textcraft.train.721", "max_steps": 50, "misc": {"target_items": {"granite_slab": 2, "polished_granite_slab": 1}, "initial_inventory": {"cobblestone": 10, "quartz": 17, "wither_skeleton_skull": 4, "glowstone_dust": 4, "red_mushroom": 2}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 3], "ingredients": {"diorite": 3, "quartz": 3}, "result_count": 3}, {"action": "craft", "target": ["granite_slab", 1], "ingredients": {"granite": 3}, "result_count": 6}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 4], "ingredients": {"diorite": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite", 1], "ingredients": {"granite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite_slab", 1], "ingredients": {"polished_granite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x yellow_stained_glass, 2x dark_prismarine, 2x spectral_arrow", "id": "textcraft.train.722", "max_steps": 50, "misc": {"target_items": {"yellow_stained_glass": 3, "dark_prismarine": 2, "spectral_arrow": 2}, "initial_inventory": {"glass": 11, "dandelion": 1, "prismarine_shard": 17, "wither_rose": 3, "glowstone_dust": 5, "flint": 2, "acacia_log": 2, "feather": 1, "stripped_spruce_log": 4, "stone": 2, "stripped_crimson_stem": 3, "string": 2}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_stained_glass", 1], "ingredients": {"glass": 8, "yellow_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["dark_prismarine", 2], "ingredients": {"prismarine_shard": 16, "black_dye": 2}, "result_count": 2}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}, {"action": "craft", "target": ["spectral_arrow", 1], "ingredients": {"glowstone_dust": 4, "arrow": 1}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x polished_andesite_slab, 2x polished_blackstone_brick_wall", "id": "textcraft.train.723", "max_steps": 50, "misc": {"target_items": {"polished_andesite_slab": 3, "polished_blackstone_brick_wall": 2}, "initial_inventory": {"cobblestone": 6, "quartz": 2, "blackstone": 11, "pumpkin": 2, "blue_orchid": 1, "pink_tulip": 3}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["andesite", 2], "ingredients": {"diorite": 2, "cobblestone": 2}, "result_count": 4}, {"action": "craft", "target": ["polished_andesite", 1], "ingredients": {"andesite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_andesite_slab", 1], "ingredients": {"polished_andesite": 3}, "result_count": 6}, {"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_bricks", 2], "ingredients": {"polished_blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_brick_wall", 1], "ingredients": {"polished_blackstone_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x warped_fence", "id": "textcraft.train.724", "max_steps": 50, "misc": {"target_items": {"warped_fence": 2}, "initial_inventory": {"warped_stem": 2, "acacia_log": 2, "pumpkin": 4, "white_tulip": 1, "snowball": 1, "cooked_rabbit": 3}, "gold_trajectory": [{"action": "craft", "target": ["warped_planks", 1], "ingredients": {"warped_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"warped_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["warped_planks", 1], "ingredients": {"warped_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["warped_fence", 1], "ingredients": {"warped_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x quartz_pillar, 3x jungle_fence_gate", "id": "textcraft.train.725", "max_steps": 50, "misc": {"target_items": {"quartz_pillar": 1, "jungle_fence_gate": 3}, "initial_inventory": {"quartz": 9, "acacia_log": 2, "jungle_log": 3, "cornflower": 2, "wither_skeleton_skull": 5, "sand": 3, "green_dye": 2, "stripped_birch_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["quartz_block", 2], "ingredients": {"quartz": 8}, "result_count": 2}, {"action": "craft", "target": ["quartz_pillar", 1], "ingredients": {"quartz_block": 2}, "result_count": 2}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["jungle_planks", 2], "ingredients": {"jungle_log": 2}, "result_count": 8}, {"action": "craft", "target": ["jungle_fence_gate", 3], "ingredients": {"stick": 12, "jungle_planks": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x stone_hoe", "id": "textcraft.train.726", "max_steps": 50, "misc": {"target_items": {"stone_hoe": 2}, "initial_inventory": {"blackstone": 6, "acacia_log": 2, "cornflower": 5, "sand": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_hoe", 2], "ingredients": {"blackstone": 4, "stick": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x crimson_sign, 3x painting, 2x red_carpet", "id": "textcraft.train.727", "max_steps": 50, "misc": {"target_items": {"crimson_sign": 1, "painting": 3, "red_carpet": 2}, "initial_inventory": {"crimson_stem": 3, "acacia_log": 5, "wither_rose": 4, "string": 20, "rose_bush": 2, "beetroot": 3, "stripped_birch_log": 2, "smooth_sandstone": 2, "nether_star": 5}, "gold_trajectory": [{"action": "craft", "target": ["crimson_planks", 2], "ingredients": {"crimson_stem": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"crimson_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["crimson_sign", 1], "ingredients": {"crimson_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["stick", 6], "ingredients": {"acacia_planks": 12}, "result_count": 24}, {"action": "craft", "target": ["black_dye", 3], "ingredients": {"wither_rose": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["black_wool", 3], "ingredients": {"black_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["painting", 3], "ingredients": {"stick": 24, "black_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["red_wool", 2], "ingredients": {"red_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["red_carpet", 1], "ingredients": {"red_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x red_banner, 2x spruce_fence, 3x polished_blackstone_button", "id": "textcraft.train.728", "max_steps": 50, "misc": {"target_items": {"red_banner": 1, "spruce_fence": 2, "polished_blackstone_button": 3}, "initial_inventory": {"rose_bush": 4, "string": 26, "acacia_log": 2, "spruce_log": 1, "blackstone": 6, "shulker_shell": 2, "crying_obsidian": 1, "stripped_jungle_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 3], "ingredients": {"rose_bush": 3}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["red_wool", 6], "ingredients": {"red_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["red_banner", 1], "ingredients": {"red_wool": 6, "stick": 1}, "result_count": 1}, {"action": "craft", "target": ["spruce_planks", 1], "ingredients": {"spruce_log": 1}, "result_count": 4}, {"action": "craft", "target": ["spruce_fence", 1], "ingredients": {"spruce_planks": 4, "stick": 2}, "result_count": 3}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_button", 3], "ingredients": {"polished_blackstone": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x chiseled_nether_bricks, 2x warped_fungus_on_a_stick", "id": "textcraft.train.729", "max_steps": 50, "misc": {"target_items": {"chiseled_nether_bricks": 2, "warped_fungus_on_a_stick": 2}, "initial_inventory": {"nether_brick": 15, "acacia_log": 1, "string": 5, "warped_fungus": 3, "sand": 2, "cobblestone": 2, "stripped_jungle_log": 5}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_nether_bricks", 2], "ingredients": {"nether_brick_slab": 4}, "result_count": 2}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["fishing_rod", 2], "ingredients": {"stick": 6, "string": 4}, "result_count": 2}, {"action": "craft", "target": ["warped_fungus_on_a_stick", 2], "ingredients": {"fishing_rod": 2, "warped_fungus": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x cyan_terracotta", "id": "textcraft.train.730", "max_steps": 50, "misc": {"target_items": {"cyan_terracotta": 2}, "initial_inventory": {"terracotta": 12, "cornflower": 1, "green_dye": 1, "glowstone_dust": 3, "sunflower": 1, "clay_ball": 3, "basalt": 1, "brick": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_terracotta", 1], "ingredients": {"terracotta": 8, "cyan_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x black_bed", "id": "textcraft.train.731", "max_steps": 50, "misc": {"target_items": {"black_bed": 1}, "initial_inventory": {"wither_rose": 4, "string": 15, "acacia_log": 1, "brown_mushroom": 1, "red_sand": 2, "prismarine_crystals": 4, "smooth_sandstone": 3, "stripped_jungle_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 3], "ingredients": {"wither_rose": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["black_wool", 3], "ingredients": {"black_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["black_bed", 1], "ingredients": {"black_wool": 3, "acacia_planks": 3}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x oak_fence_gate", "id": "textcraft.train.732", "max_steps": 50, "misc": {"target_items": {"oak_fence_gate": 3}, "initial_inventory": {"acacia_log": 3, "oak_log": 3, "baked_potato": 3, "brown_mushroom": 4, "nether_brick": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["oak_planks", 2], "ingredients": {"oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["oak_fence_gate", 3], "ingredients": {"stick": 12, "oak_planks": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x chiseled_nether_bricks", "id": "textcraft.train.733", "max_steps": 50, "misc": {"target_items": {"chiseled_nether_bricks": 2}, "initial_inventory": {"nether_brick": 17, "acacia_log": 2, "bone": 2, "stripped_crimson_stem": 1}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_nether_bricks", 2], "ingredients": {"nether_brick_slab": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x granite_stairs, 3x white_bed, 3x leather_helmet", "id": "textcraft.train.734", "max_steps": 50, "misc": {"target_items": {"granite_stairs": 2, "white_bed": 3, "leather_helmet": 3}, "initial_inventory": {"cobblestone": 9, "quartz": 15, "string": 54, "acacia_log": 4, "rabbit_hide": 64, "prismarine_shard": 2, "cocoa_beans": 4, "stripped_oak_log": 4, "apple": 3, "ice": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_stairs", 1], "ingredients": {"granite": 6}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 9], "ingredients": {"string": 36}, "result_count": 9}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["white_bed", 3], "ingredients": {"white_wool": 9, "acacia_planks": 9}, "result_count": 3}, {"action": "craft", "target": ["leather", 15], "ingredients": {"rabbit_hide": 60}, "result_count": 15}, {"action": "craft", "target": ["leather_helmet", 3], "ingredients": {"leather": 15}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x stone_sword", "id": "textcraft.train.735", "max_steps": 50, "misc": {"target_items": {"stone_sword": 1}, "initial_inventory": {"blackstone": 2, "acacia_log": 1, "warped_fungus": 3, "clay_ball": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_sword", 1], "ingredients": {"blackstone": 2, "stick": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x gray_concrete_powder", "id": "textcraft.train.736", "max_steps": 50, "misc": {"target_items": {"gray_concrete_powder": 2}, "initial_inventory": {"wither_rose": 1, "lily_of_the_valley": 2, "sand": 4, "gravel": 4, "red_mushroom": 4, "smooth_quartz": 3, "dark_oak_log": 3, "brown_mushroom": 3}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_concrete_powder", 1], "ingredients": {"gray_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x chiseled_stone_bricks, 2x birch_fence_gate, 1x mossy_stone_brick_stairs", "id": "textcraft.train.737", "max_steps": 50, "misc": {"target_items": {"chiseled_stone_bricks": 2, "birch_fence_gate": 2, "mossy_stone_brick_stairs": 1}, "initial_inventory": {"stone": 12, "acacia_log": 2, "birch_log": 2, "vine": 8, "obsidian": 1, "lilac": 4, "red_sand": 5, "jungle_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["stone_brick_slab", 1], "ingredients": {"stone_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_stone_bricks", 2], "ingredients": {"stone_brick_slab": 4}, "result_count": 2}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["birch_planks", 1], "ingredients": {"birch_log": 1}, "result_count": 4}, {"action": "craft", "target": ["birch_fence_gate", 2], "ingredients": {"stick": 8, "birch_planks": 4}, "result_count": 2}, {"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["mossy_stone_bricks", 6], "ingredients": {"stone_bricks": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_stone_brick_stairs", 1], "ingredients": {"mossy_stone_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x brick_stairs, 2x diorite_stairs, 1x blue_concrete_powder", "id": "textcraft.train.738", "max_steps": 50, "misc": {"target_items": {"brick_stairs": 3, "diorite_stairs": 2, "blue_concrete_powder": 1}, "initial_inventory": {"brick": 33, "cobblestone": 7, "quartz": 7, "cornflower": 1, "sand": 4, "gravel": 6, "baked_potato": 3, "glass": 1}, "gold_trajectory": [{"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_stairs", 1], "ingredients": {"bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_stairs", 1], "ingredients": {"diorite": 6}, "result_count": 4}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_concrete_powder", 1], "ingredients": {"blue_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x granite, 2x polished_blackstone_pressure_plate, 3x birch_fence", "id": "textcraft.train.739", "max_steps": 50, "misc": {"target_items": {"granite": 2, "polished_blackstone_pressure_plate": 2, "birch_fence": 3}, "initial_inventory": {"cobblestone": 2, "quartz": 6, "blackstone": 6, "birch_log": 2, "acacia_log": 2, "enchanted_golden_apple": 5, "glass": 1, "prismarine_crystals": 1}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["granite", 2], "ingredients": {"diorite": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_pressure_plate", 2], "ingredients": {"polished_blackstone": 4}, "result_count": 2}, {"action": "craft", "target": ["birch_planks", 1], "ingredients": {"birch_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"birch_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["birch_planks", 1], "ingredients": {"birch_log": 1}, "result_count": 4}, {"action": "craft", "target": ["birch_fence", 1], "ingredients": {"birch_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x warped_sign", "id": "textcraft.train.740", "max_steps": 50, "misc": {"target_items": {"warped_sign": 2}, "initial_inventory": {"warped_stem": 3, "acacia_log": 1, "ice": 1, "string": 5, "smooth_quartz": 1, "smooth_stone": 1, "sugar_cane": 2}, "gold_trajectory": [{"action": "craft", "target": ["warped_planks", 2], "ingredients": {"warped_stem": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"warped_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["warped_sign", 1], "ingredients": {"warped_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x brown_stained_glass_pane", "id": "textcraft.train.741", "max_steps": 50, "misc": {"target_items": {"brown_stained_glass_pane": 1}, "initial_inventory": {"glass": 8, "cocoa_beans": 1, "ender_pearl": 5, "dark_oak_log": 3, "scute": 1}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_stained_glass", 1], "ingredients": {"glass": 8, "brown_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["brown_stained_glass_pane", 1], "ingredients": {"brown_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 1x leather_helmet", "id": "textcraft.train.742", "max_steps": 50, "misc": {"target_items": {"leather_helmet": 1}, "initial_inventory": {"rabbit_hide": 27, "feather": 5, "allium": 1, "obsidian": 2, "smooth_sandstone": 5}, "gold_trajectory": [{"action": "craft", "target": ["leather", 5], "ingredients": {"rabbit_hide": 20}, "result_count": 5}, {"action": "craft", "target": ["leather_helmet", 1], "ingredients": {"leather": 5}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x blue_stained_glass_pane", "id": "textcraft.train.743", "max_steps": 50, "misc": {"target_items": {"blue_stained_glass_pane": 3}, "initial_inventory": {"glass": 11, "cornflower": 2, "prismarine_crystals": 2, "carved_pumpkin": 1, "red_sand": 1, "dirt": 1, "oxeye_daisy": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_stained_glass", 1], "ingredients": {"glass": 8, "blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["blue_stained_glass_pane", 1], "ingredients": {"blue_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 3x stone_brick_slab", "id": "textcraft.train.744", "max_steps": 50, "misc": {"target_items": {"stone_brick_slab": 3}, "initial_inventory": {"stone": 4, "baked_potato": 3, "scute": 5, "ink_sac": 4, "honeycomb": 2, "clay_ball": 2}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["stone_brick_slab", 1], "ingredients": {"stone_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x jungle_fence_gate", "id": "textcraft.train.745", "max_steps": 50, "misc": {"target_items": {"jungle_fence_gate": 3}, "initial_inventory": {"acacia_log": 2, "jungle_log": 3, "rose_bush": 2, "stripped_dark_oak_log": 1, "scute": 2, "smooth_stone": 3, "ender_pearl": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["jungle_planks", 2], "ingredients": {"jungle_log": 2}, "result_count": 8}, {"action": "craft", "target": ["jungle_fence_gate", 3], "ingredients": {"stick": 12, "jungle_planks": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x brown_carpet", "id": "textcraft.train.746", "max_steps": 50, "misc": {"target_items": {"brown_carpet": 2}, "initial_inventory": {"cocoa_beans": 2, "string": 12, "warped_fungus": 5, "baked_potato": 3, "oak_log": 5, "poppy": 3}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 2], "ingredients": {"cocoa_beans": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["brown_wool", 2], "ingredients": {"brown_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["brown_carpet", 1], "ingredients": {"brown_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x mossy_stone_brick_slab", "id": "textcraft.train.747", "max_steps": 50, "misc": {"target_items": {"mossy_stone_brick_slab": 2}, "initial_inventory": {"stone": 5, "vine": 3, "acacia_log": 2, "pink_tulip": 3}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["mossy_stone_bricks", 3], "ingredients": {"stone_bricks": 3, "vine": 3}, "result_count": 3}, {"action": "craft", "target": ["mossy_stone_brick_slab", 1], "ingredients": {"mossy_stone_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x mossy_stone_bricks", "id": "textcraft.train.748", "max_steps": 50, "misc": {"target_items": {"mossy_stone_bricks": 3}, "initial_inventory": {"stone": 6, "vine": 4, "ender_pearl": 5, "gunpowder": 1}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["mossy_stone_bricks", 3], "ingredients": {"stone_bricks": 3, "vine": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x bow", "id": "textcraft.train.749", "max_steps": 50, "misc": {"target_items": {"bow": 2}, "initial_inventory": {"acacia_log": 1, "string": 7, "allium": 4, "gravel": 5, "smooth_quartz": 5, "stripped_jungle_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["bow", 2], "ingredients": {"stick": 6, "string": 6}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x brown_wool", "id": "textcraft.train.750", "max_steps": 50, "misc": {"target_items": {"brown_wool": 2}, "initial_inventory": {"cocoa_beans": 3, "string": 8, "milk_bucket": 5, "ghast_tear": 4, "apple": 1}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 2], "ingredients": {"cocoa_beans": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["brown_wool", 2], "ingredients": {"brown_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x red_bed, 2x blue_terracotta", "id": "textcraft.train.751", "max_steps": 50, "misc": {"target_items": {"red_bed": 1, "blue_terracotta": 2}, "initial_inventory": {"rose_bush": 2, "string": 13, "acacia_log": 1, "terracotta": 10, "cornflower": 1, "lily_of_the_valley": 3, "creeper_head": 1, "pink_tulip": 3}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 2], "ingredients": {"rose_bush": 2}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["red_wool", 3], "ingredients": {"red_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["red_bed", 1], "ingredients": {"red_wool": 3, "acacia_planks": 3}, "result_count": 1}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_terracotta", 1], "ingredients": {"terracotta": 8, "blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x fire_charge", "id": "textcraft.train.752", "max_steps": 50, "misc": {"target_items": {"fire_charge": 1}, "initial_inventory": {"gunpowder": 1, "blaze_rod": 1, "green_dye": 4, "white_tulip": 4, "blue_orchid": 4, "nether_star": 5}, "gold_trajectory": [{"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["fire_charge", 1], "ingredients": {"gunpowder": 1, "blaze_powder": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x painting", "id": "textcraft.train.753", "max_steps": 50, "misc": {"target_items": {"painting": 2}, "initial_inventory": {"acacia_log": 3, "wither_rose": 3, "string": 10, "stripped_acacia_log": 2, "blackstone": 4, "sand": 2, "crimson_stem": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 4], "ingredients": {"acacia_planks": 8}, "result_count": 16}, {"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["black_wool", 2], "ingredients": {"black_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["painting", 2], "ingredients": {"stick": 16, "black_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x oak_fence_gate", "id": "textcraft.train.754", "max_steps": 50, "misc": {"target_items": {"oak_fence_gate": 1}, "initial_inventory": {"acacia_log": 1, "oak_log": 1, "nautilus_shell": 4, "stripped_warped_stem": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["oak_planks", 1], "ingredients": {"oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["oak_fence_gate", 1], "ingredients": {"stick": 4, "oak_planks": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x end_stone_brick_slab", "id": "textcraft.train.755", "max_steps": 50, "misc": {"target_items": {"end_stone_brick_slab": 2}, "initial_inventory": {"end_stone": 5, "carrot": 2, "cocoa_beans": 5}, "gold_trajectory": [{"action": "craft", "target": ["end_stone_bricks", 1], "ingredients": {"end_stone": 4}, "result_count": 4}, {"action": "craft", "target": ["end_stone_brick_slab", 1], "ingredients": {"end_stone_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x snow", "id": "textcraft.train.756", "max_steps": 50, "misc": {"target_items": {"snow": 1}, "initial_inventory": {"snowball": 16, "cobblestone": 3, "glowstone_dust": 1}, "gold_trajectory": [{"action": "craft", "target": ["snow_block", 3], "ingredients": {"snowball": 12}, "result_count": 3}, {"action": "craft", "target": ["snow", 1], "ingredients": {"snow_block": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x gray_wool", "id": "textcraft.train.757", "max_steps": 50, "misc": {"target_items": {"gray_wool": 1}, "initial_inventory": {"wither_rose": 1, "lily_of_the_valley": 2, "string": 6, "crimson_stem": 1, "popped_chorus_fruit": 5}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["gray_wool", 1], "ingredients": {"gray_dye": 1, "white_wool": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x black_banner", "id": "textcraft.train.758", "max_steps": 50, "misc": {"target_items": {"black_banner": 2}, "initial_inventory": {"wither_rose": 12, "string": 55, "acacia_log": 1, "stone": 2, "heart_of_the_sea": 1, "carved_pumpkin": 3, "stripped_jungle_log": 5, "peony": 4}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 12], "ingredients": {"wither_rose": 12}, "result_count": 12}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["black_wool", 12], "ingredients": {"black_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["black_banner", 2], "ingredients": {"black_wool": 12, "stick": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x light_blue_wool, 1x nether_brick_slab", "id": "textcraft.train.759", "max_steps": 50, "misc": {"target_items": {"light_blue_wool": 1, "nether_brick_slab": 1}, "initial_inventory": {"cornflower": 1, "lily_of_the_valley": 1, "string": 4, "nether_brick": 16, "lilac": 3, "stripped_dark_oak_log": 5, "nether_wart": 3, "glowstone_dust": 4, "vine": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["light_blue_wool", 1], "ingredients": {"light_blue_dye": 1, "white_wool": 1}, "result_count": 1}, {"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x prismarine_brick_slab", "id": "textcraft.train.760", "max_steps": 50, "misc": {"target_items": {"prismarine_brick_slab": 1}, "initial_inventory": {"prismarine_shard": 36, "creeper_head": 4, "blackstone": 4, "glass": 4, "basalt": 1, "gravel": 5}, "gold_trajectory": [{"action": "craft", "target": ["prismarine_bricks", 3], "ingredients": {"prismarine_shard": 27}, "result_count": 3}, {"action": "craft", "target": ["prismarine_brick_slab", 1], "ingredients": {"prismarine_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x torch, 2x mossy_stone_bricks, 1x cyan_wool", "id": "textcraft.train.761", "max_steps": 50, "misc": {"target_items": {"torch": 1, "mossy_stone_bricks": 2, "cyan_wool": 1}, "initial_inventory": {"acacia_log": 1, "stone": 6, "vine": 3, "cornflower": 1, "green_dye": 1, "string": 6, "smooth_sandstone": 3, "honeycomb": 1, "lily_of_the_valley": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}, {"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["mossy_stone_bricks", 2], "ingredients": {"stone_bricks": 2, "vine": 2}, "result_count": 2}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["cyan_wool", 1], "ingredients": {"cyan_dye": 1, "white_wool": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x black_wool, 3x polished_andesite_slab, 3x lime_wool", "id": "textcraft.train.762", "max_steps": 50, "misc": {"target_items": {"black_wool": 2, "polished_andesite_slab": 3, "lime_wool": 3}, "initial_inventory": {"wither_rose": 3, "string": 26, "cobblestone": 6, "quartz": 3, "green_dye": 2, "lily_of_the_valley": 2, "crimson_stem": 5, "jungle_log": 1, "nether_brick": 4}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["black_wool", 2], "ingredients": {"black_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["andesite", 2], "ingredients": {"diorite": 2, "cobblestone": 2}, "result_count": 4}, {"action": "craft", "target": ["polished_andesite", 1], "ingredients": {"andesite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_andesite_slab", 1], "ingredients": {"polished_andesite": 3}, "result_count": 6}, {"action": "craft", "target": ["white_dye", 2], "ingredients": {"lily_of_the_valley": 2}, "result_count": 2}, {"action": "craft", "target": ["lime_dye", 2], "ingredients": {"green_dye": 2, "white_dye": 2}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["lime_wool", 3], "ingredients": {"lime_dye": 3, "white_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x yellow_terracotta, 1x brown_stained_glass_pane", "id": "textcraft.train.763", "max_steps": 50, "misc": {"target_items": {"yellow_terracotta": 2, "brown_stained_glass_pane": 1}, "initial_inventory": {"terracotta": 9, "dandelion": 1, "glass": 10, "cocoa_beans": 2, "melon_slice": 5, "poppy": 5, "milk_bucket": 3}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_terracotta", 1], "ingredients": {"terracotta": 8, "yellow_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_stained_glass", 1], "ingredients": {"glass": 8, "brown_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["brown_stained_glass_pane", 1], "ingredients": {"brown_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 2x diorite_stairs", "id": "textcraft.train.764", "max_steps": 50, "misc": {"target_items": {"diorite_stairs": 2}, "initial_inventory": {"cobblestone": 6, "quartz": 9, "sand": 1, "orange_tulip": 1, "creeper_head": 1}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_stairs", 1], "ingredients": {"diorite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x crimson_fence, 3x brown_stained_glass_pane, 3x red_banner", "id": "textcraft.train.765", "max_steps": 50, "misc": {"target_items": {"crimson_fence": 3, "brown_stained_glass_pane": 3, "red_banner": 3}, "initial_inventory": {"crimson_stem": 2, "acacia_log": 2, "glass": 8, "cocoa_beans": 1, "rose_bush": 12, "string": 73, "scute": 5, "snowball": 1, "wither_skeleton_skull": 4, "stripped_birch_log": 3}, "gold_trajectory": [{"action": "craft", "target": ["crimson_planks", 1], "ingredients": {"crimson_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"crimson_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["crimson_planks", 1], "ingredients": {"crimson_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["crimson_fence", 1], "ingredients": {"crimson_planks": 4, "stick": 2}, "result_count": 3}, {"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_stained_glass", 1], "ingredients": {"glass": 8, "brown_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["brown_stained_glass_pane", 1], "ingredients": {"brown_stained_glass": 6}, "result_count": 16}, {"action": "craft", "target": ["red_dye", 9], "ingredients": {"rose_bush": 9}, "result_count": 18}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["red_wool", 18], "ingredients": {"red_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["stick", 1], "ingredients": {"crimson_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["red_banner", 3], "ingredients": {"red_wool": 18, "stick": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x polished_diorite_stairs", "id": "textcraft.train.766", "max_steps": 50, "misc": {"target_items": {"polished_diorite_stairs": 3}, "initial_inventory": {"cobblestone": 8, "quartz": 11, "lily_of_the_valley": 4, "poppy": 1, "lilac": 2, "oxeye_daisy": 5, "azure_bluet": 3}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 4], "ingredients": {"cobblestone": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_diorite", 2], "ingredients": {"diorite": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_diorite_stairs", 1], "ingredients": {"polished_diorite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x ender_eye, 2x dark_prismarine_slab", "id": "textcraft.train.767", "max_steps": 50, "misc": {"target_items": {"ender_eye": 3, "dark_prismarine_slab": 2}, "initial_inventory": {"ender_pearl": 3, "blaze_rod": 3, "prismarine_shard": 35, "wither_rose": 4, "poppy": 1, "spruce_log": 1, "acacia_log": 3, "quartz": 1, "stripped_birch_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["blaze_powder", 2], "ingredients": {"blaze_rod": 2}, "result_count": 4}, {"action": "craft", "target": ["ender_eye", 3], "ingredients": {"ender_pearl": 3, "blaze_powder": 3}, "result_count": 3}, {"action": "craft", "target": ["black_dye", 3], "ingredients": {"wither_rose": 3}, "result_count": 3}, {"action": "craft", "target": ["dark_prismarine", 3], "ingredients": {"prismarine_shard": 24, "black_dye": 3}, "result_count": 3}, {"action": "craft", "target": ["dark_prismarine_slab", 1], "ingredients": {"dark_prismarine": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x lever, 3x blue_bed", "id": "textcraft.train.768", "max_steps": 50, "misc": {"target_items": {"lever": 3, "blue_bed": 3}, "initial_inventory": {"acacia_log": 5, "cobblestone": 3, "string": 45, "cornflower": 3, "pink_tulip": 3, "obsidian": 4, "red_tulip": 5, "honeycomb": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["lever", 3], "ingredients": {"stick": 3, "cobblestone": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 9], "ingredients": {"string": 36}, "result_count": 9}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["white_bed", 3], "ingredients": {"white_wool": 9, "acacia_planks": 9}, "result_count": 3}, {"action": "craft", "target": ["blue_dye", 3], "ingredients": {"cornflower": 3}, "result_count": 3}, {"action": "craft", "target": ["blue_bed", 3], "ingredients": {"white_bed": 3, "blue_dye": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x spectral_arrow, 3x polished_granite", "id": "textcraft.train.769", "max_steps": 50, "misc": {"target_items": {"spectral_arrow": 2, "polished_granite": 3}, "initial_inventory": {"glowstone_dust": 5, "flint": 1, "acacia_log": 1, "feather": 2, "cobblestone": 4, "quartz": 9, "sand": 4, "creeper_head": 3, "shulker_shell": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}, {"action": "craft", "target": ["spectral_arrow", 1], "ingredients": {"glowstone_dust": 4, "arrow": 1}, "result_count": 2}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 4], "ingredients": {"diorite": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite", 1], "ingredients": {"granite": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x leather_boots, 2x end_crystal, 2x polished_blackstone_brick_stairs", "id": "textcraft.train.770", "max_steps": 50, "misc": {"target_items": {"leather_boots": 2, "end_crystal": 2, "polished_blackstone_brick_stairs": 2}, "initial_inventory": {"rabbit_hide": 36, "glass": 21, "ender_pearl": 2, "blaze_rod": 2, "ghast_tear": 2, "blackstone": 12, "egg": 3, "bone": 2}, "gold_trajectory": [{"action": "craft", "target": ["leather", 8], "ingredients": {"rabbit_hide": 32}, "result_count": 8}, {"action": "craft", "target": ["leather_boots", 2], "ingredients": {"leather": 8}, "result_count": 2}, {"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["ender_eye", 2], "ingredients": {"ender_pearl": 2, "blaze_powder": 2}, "result_count": 2}, {"action": "craft", "target": ["end_crystal", 2], "ingredients": {"glass": 14, "ender_eye": 2, "ghast_tear": 2}, "result_count": 2}, {"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_bricks", 2], "ingredients": {"polished_blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_brick_stairs", 1], "ingredients": {"polished_blackstone_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x polished_diorite, 2x brick_wall", "id": "textcraft.train.771", "max_steps": 50, "misc": {"target_items": {"polished_diorite": 2, "brick_wall": 2}, "initial_inventory": {"cobblestone": 4, "quartz": 5, "brick": 36, "dark_oak_log": 1, "beetroot": 5, "stripped_crimson_stem": 3, "milk_bucket": 5, "string": 5}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}, {"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_wall", 1], "ingredients": {"bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x end_stone_brick_wall, 1x brick_wall, 2x mojang_banner_pattern", "id": "textcraft.train.772", "max_steps": 50, "misc": {"target_items": {"end_stone_brick_wall": 3, "brick_wall": 1, "mojang_banner_pattern": 2}, "initial_inventory": {"end_stone": 10, "brick": 33, "sugar_cane": 4, "enchanted_golden_apple": 3, "dirt": 1, "obsidian": 2}, "gold_trajectory": [{"action": "craft", "target": ["end_stone_bricks", 2], "ingredients": {"end_stone": 8}, "result_count": 8}, {"action": "craft", "target": ["end_stone_brick_wall", 1], "ingredients": {"end_stone_bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_wall", 1], "ingredients": {"bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["mojang_banner_pattern", 2], "ingredients": {"paper": 2, "enchanted_golden_apple": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x mossy_stone_brick_slab", "id": "textcraft.train.773", "max_steps": 50, "misc": {"target_items": {"mossy_stone_brick_slab": 3}, "initial_inventory": {"stone": 6, "vine": 4, "nether_brick": 3, "honeycomb": 4}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["mossy_stone_bricks", 3], "ingredients": {"stone_bricks": 3, "vine": 3}, "result_count": 3}, {"action": "craft", "target": ["mossy_stone_brick_slab", 1], "ingredients": {"mossy_stone_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x blue_ice, 2x granite_stairs, 2x oak_fence_gate", "id": "textcraft.train.774", "max_steps": 50, "misc": {"target_items": {"blue_ice": 3, "granite_stairs": 2, "oak_fence_gate": 2}, "initial_inventory": {"ice": 290, "cobblestone": 6, "quartz": 15, "acacia_log": 2, "oak_log": 1, "snowball": 5, "feather": 5}, "gold_trajectory": [{"action": "craft", "target": ["packed_ice", 27], "ingredients": {"ice": 243}, "result_count": 27}, {"action": "craft", "target": ["blue_ice", 3], "ingredients": {"packed_ice": 27}, "result_count": 3}, {"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_stairs", 1], "ingredients": {"granite": 6}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["oak_planks", 1], "ingredients": {"oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["oak_fence_gate", 2], "ingredients": {"stick": 8, "oak_planks": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x yellow_bed, 3x yellow_carpet", "id": "textcraft.train.775", "max_steps": 50, "misc": {"target_items": {"yellow_bed": 3, "yellow_carpet": 3}, "initial_inventory": {"dandelion": 13, "string": 49, "acacia_log": 3, "oxeye_daisy": 4, "pumpkin": 3, "nautilus_shell": 5, "obsidian": 4}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 9], "ingredients": {"dandelion": 9}, "result_count": 9}, {"action": "craft", "target": ["white_wool", 9], "ingredients": {"string": 36}, "result_count": 9}, {"action": "craft", "target": ["yellow_wool", 9], "ingredients": {"yellow_dye": 9, "white_wool": 9}, "result_count": 9}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["yellow_bed", 3], "ingredients": {"yellow_wool": 9, "acacia_planks": 9}, "result_count": 3}, {"action": "craft", "target": ["yellow_dye", 2], "ingredients": {"dandelion": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["yellow_wool", 2], "ingredients": {"yellow_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["yellow_carpet", 1], "ingredients": {"yellow_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x white_concrete_powder", "id": "textcraft.train.776", "max_steps": 50, "misc": {"target_items": {"white_concrete_powder": 3}, "initial_inventory": {"lily_of_the_valley": 1, "sand": 5, "gravel": 4, "blue_orchid": 3, "green_dye": 4, "stripped_crimson_stem": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_concrete_powder", 1], "ingredients": {"white_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x jungle_fence_gate", "id": "textcraft.train.777", "max_steps": 50, "misc": {"target_items": {"jungle_fence_gate": 1}, "initial_inventory": {"acacia_log": 2, "jungle_log": 2, "prismarine_shard": 4, "nether_star": 4, "baked_potato": 3, "obsidian": 1, "red_tulip": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["jungle_fence_gate", 1], "ingredients": {"stick": 4, "jungle_planks": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x yellow_bed, 1x black_banner", "id": "textcraft.train.778", "max_steps": 50, "misc": {"target_items": {"yellow_bed": 2, "black_banner": 1}, "initial_inventory": {"dandelion": 9, "string": 50, "acacia_log": 3, "wither_rose": 6, "carved_pumpkin": 2, "rabbit_hide": 3, "quartz": 4}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 6], "ingredients": {"dandelion": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["yellow_wool", 6], "ingredients": {"yellow_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["yellow_bed", 2], "ingredients": {"yellow_wool": 6, "acacia_planks": 6}, "result_count": 2}, {"action": "craft", "target": ["black_dye", 6], "ingredients": {"wither_rose": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["black_wool", 6], "ingredients": {"black_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["black_banner", 1], "ingredients": {"black_wool": 6, "stick": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x leather_chestplate, 3x diorite_slab", "id": "textcraft.train.779", "max_steps": 50, "misc": {"target_items": {"leather_chestplate": 1, "diorite_slab": 3}, "initial_inventory": {"rabbit_hide": 41, "cobblestone": 6, "quartz": 6, "carrot": 2, "snowball": 2, "brown_mushroom": 5}, "gold_trajectory": [{"action": "craft", "target": ["leather", 8], "ingredients": {"rabbit_hide": 32}, "result_count": 8}, {"action": "craft", "target": ["leather_chestplate", 1], "ingredients": {"leather": 8}, "result_count": 1}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["diorite_slab", 1], "ingredients": {"diorite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x white_carpet, 2x cut_red_sandstone", "id": "textcraft.train.780", "max_steps": 50, "misc": {"target_items": {"white_carpet": 1, "cut_red_sandstone": 2}, "initial_inventory": {"string": 10, "red_sand": 16, "terracotta": 5, "red_tulip": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["white_carpet", 1], "ingredients": {"white_wool": 2}, "result_count": 3}, {"action": "craft", "target": ["red_sandstone", 4], "ingredients": {"red_sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone", 1], "ingredients": {"red_sandstone": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x bow, 1x white_stained_glass", "id": "textcraft.train.781", "max_steps": 50, "misc": {"target_items": {"bow": 1, "white_stained_glass": 1}, "initial_inventory": {"acacia_log": 1, "string": 3, "glass": 11, "lily_of_the_valley": 2, "stripped_spruce_log": 3, "birch_log": 1, "cocoa_beans": 3, "stripped_acacia_log": 3, "blackstone": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["bow", 1], "ingredients": {"stick": 3, "string": 3}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_stained_glass", 1], "ingredients": {"glass": 8, "white_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x warped_fungus_on_a_stick", "id": "textcraft.train.782", "max_steps": 50, "misc": {"target_items": {"warped_fungus_on_a_stick": 3}, "initial_inventory": {"acacia_log": 3, "string": 8, "warped_fungus": 3, "stripped_crimson_stem": 2, "brown_mushroom": 2, "glowstone_dust": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["fishing_rod", 3], "ingredients": {"stick": 9, "string": 6}, "result_count": 3}, {"action": "craft", "target": ["warped_fungus_on_a_stick", 3], "ingredients": {"fishing_rod": 3, "warped_fungus": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x yellow_stained_glass_pane, 1x lime_dye, 1x brick_wall", "id": "textcraft.train.783", "max_steps": 50, "misc": {"target_items": {"yellow_stained_glass_pane": 1, "lime_dye": 1, "brick_wall": 1}, "initial_inventory": {"glass": 9, "dandelion": 1, "green_dye": 2, "lily_of_the_valley": 1, "brick": 33, "stripped_acacia_log": 5, "birch_log": 1, "stone": 5}, "gold_trajectory": [{"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "yellow_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_wall", 1], "ingredients": {"bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x oak_fence, 3x mossy_stone_brick_slab, 2x prismarine_brick_slab", "id": "textcraft.train.784", "max_steps": 50, "misc": {"target_items": {"oak_fence": 3, "mossy_stone_brick_slab": 3, "prismarine_brick_slab": 2}, "initial_inventory": {"oak_log": 2, "acacia_log": 1, "stone": 4, "vine": 3, "prismarine_shard": 40, "allium": 3, "red_tulip": 1, "brick": 1, "apple": 2}, "gold_trajectory": [{"action": "craft", "target": ["oak_planks", 1], "ingredients": {"oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["oak_planks", 1], "ingredients": {"oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["oak_fence", 1], "ingredients": {"oak_planks": 4, "stick": 2}, "result_count": 3}, {"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["mossy_stone_bricks", 3], "ingredients": {"stone_bricks": 3, "vine": 3}, "result_count": 3}, {"action": "craft", "target": ["mossy_stone_brick_slab", 1], "ingredients": {"mossy_stone_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["prismarine_bricks", 3], "ingredients": {"prismarine_shard": 27}, "result_count": 3}, {"action": "craft", "target": ["prismarine_brick_slab", 1], "ingredients": {"prismarine_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x orange_bed, 3x lime_terracotta", "id": "textcraft.train.785", "max_steps": 50, "misc": {"target_items": {"orange_bed": 3, "lime_terracotta": 3}, "initial_inventory": {"orange_tulip": 10, "string": 42, "acacia_log": 4, "terracotta": 10, "green_dye": 2, "lily_of_the_valley": 2, "crying_obsidian": 1, "popped_chorus_fruit": 1}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 9], "ingredients": {"orange_tulip": 9}, "result_count": 9}, {"action": "craft", "target": ["white_wool", 9], "ingredients": {"string": 36}, "result_count": 9}, {"action": "craft", "target": ["orange_wool", 9], "ingredients": {"orange_dye": 9, "white_wool": 9}, "result_count": 9}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["orange_bed", 3], "ingredients": {"orange_wool": 9, "acacia_planks": 9}, "result_count": 3}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_terracotta", 1], "ingredients": {"terracotta": 8, "lime_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x polished_blackstone_bricks, 2x dark_oak_sign", "id": "textcraft.train.786", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_bricks": 1, "dark_oak_sign": 2}, "initial_inventory": {"blackstone": 5, "dark_oak_log": 3, "acacia_log": 2, "bone": 3, "warped_stem": 1, "blaze_rod": 4, "poppy": 4, "cocoa_beans": 3}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_bricks", 1], "ingredients": {"polished_blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_planks", 2], "ingredients": {"dark_oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"dark_oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_sign", 1], "ingredients": {"dark_oak_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x dark_oak_fence", "id": "textcraft.train.787", "max_steps": 50, "misc": {"target_items": {"dark_oak_fence": 1}, "initial_inventory": {"dark_oak_log": 2, "acacia_log": 2, "egg": 1, "vine": 2, "brick": 1, "glowstone_dust": 5}, "gold_trajectory": [{"action": "craft", "target": ["dark_oak_planks", 1], "ingredients": {"dark_oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"dark_oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_planks", 1], "ingredients": {"dark_oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_fence", 1], "ingredients": {"dark_oak_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x granite_stairs, 3x prismarine_wall", "id": "textcraft.train.788", "max_steps": 50, "misc": {"target_items": {"granite_stairs": 3, "prismarine_wall": 3}, "initial_inventory": {"cobblestone": 8, "quartz": 18, "prismarine_shard": 33, "sunflower": 5, "obsidian": 1, "blue_orchid": 5, "ink_sac": 2, "blaze_rod": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_stairs", 1], "ingredients": {"granite": 6}, "result_count": 4}, {"action": "craft", "target": ["prismarine", 6], "ingredients": {"prismarine_shard": 24}, "result_count": 6}, {"action": "craft", "target": ["prismarine_wall", 1], "ingredients": {"prismarine": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x orange_wool", "id": "textcraft.train.789", "max_steps": 50, "misc": {"target_items": {"orange_wool": 1}, "initial_inventory": {"orange_tulip": 1, "string": 5, "smooth_stone": 5, "brown_mushroom": 2, "oxeye_daisy": 1}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["orange_wool", 1], "ingredients": {"orange_dye": 1, "white_wool": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x dark_oak_fence", "id": "textcraft.train.790", "max_steps": 50, "misc": {"target_items": {"dark_oak_fence": 2}, "initial_inventory": {"dark_oak_log": 2, "acacia_log": 2, "wither_rose": 4, "carrot": 4, "smooth_red_sandstone": 1, "poppy": 2}, "gold_trajectory": [{"action": "craft", "target": ["dark_oak_planks", 1], "ingredients": {"dark_oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"dark_oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_planks", 1], "ingredients": {"dark_oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_fence", 1], "ingredients": {"dark_oak_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x gray_terracotta, 3x polished_blackstone_button, 2x end_stone_brick_slab", "id": "textcraft.train.791", "max_steps": 50, "misc": {"target_items": {"gray_terracotta": 1, "polished_blackstone_button": 3, "end_stone_brick_slab": 2}, "initial_inventory": {"terracotta": 10, "wither_rose": 2, "lily_of_the_valley": 1, "blackstone": 4, "end_stone": 6, "pumpkin": 3, "blue_orchid": 4, "sunflower": 3, "blaze_rod": 5}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_terracotta", 1], "ingredients": {"terracotta": 8, "gray_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_button", 3], "ingredients": {"polished_blackstone": 3}, "result_count": 3}, {"action": "craft", "target": ["end_stone_bricks", 1], "ingredients": {"end_stone": 4}, "result_count": 4}, {"action": "craft", "target": ["end_stone_brick_slab", 1], "ingredients": {"end_stone_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x brown_concrete_powder", "id": "textcraft.train.792", "max_steps": 50, "misc": {"target_items": {"brown_concrete_powder": 3}, "initial_inventory": {"cocoa_beans": 1, "sand": 4, "gravel": 5, "smooth_sandstone": 5, "warped_stem": 1, "terracotta": 4, "cornflower": 3, "orange_tulip": 3}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_concrete_powder", 1], "ingredients": {"brown_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x crimson_fence_gate", "id": "textcraft.train.793", "max_steps": 50, "misc": {"target_items": {"crimson_fence_gate": 1}, "initial_inventory": {"acacia_log": 1, "crimson_stem": 1, "bamboo": 2, "stripped_spruce_log": 2, "brown_mushroom": 5, "smooth_quartz": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["crimson_planks", 1], "ingredients": {"crimson_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["crimson_fence_gate", 1], "ingredients": {"stick": 4, "crimson_planks": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x blue_banner", "id": "textcraft.train.794", "max_steps": 50, "misc": {"target_items": {"blue_banner": 1}, "initial_inventory": {"cornflower": 9, "string": 32, "acacia_log": 1, "prismarine_shard": 3, "stone": 4, "enchanted_golden_apple": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 6], "ingredients": {"cornflower": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["blue_wool", 6], "ingredients": {"blue_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["blue_banner", 1], "ingredients": {"blue_wool": 6, "stick": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x black_terracotta", "id": "textcraft.train.795", "max_steps": 50, "misc": {"target_items": {"black_terracotta": 1}, "initial_inventory": {"terracotta": 11, "wither_rose": 1, "lily_of_the_valley": 2, "cocoa_beans": 1}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_terracotta", 1], "ingredients": {"terracotta": 8, "black_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x ender_chest, 2x fermented_spider_eye", "id": "textcraft.train.796", "max_steps": 50, "misc": {"target_items": {"ender_chest": 3, "fermented_spider_eye": 2}, "initial_inventory": {"obsidian": 34, "ender_pearl": 3, "blaze_rod": 2, "spider_eye": 3, "brown_mushroom": 3, "sugar_cane": 2, "stone": 3, "pink_tulip": 3, "quartz": 2}, "gold_trajectory": [{"action": "craft", "target": ["blaze_powder", 2], "ingredients": {"blaze_rod": 2}, "result_count": 4}, {"action": "craft", "target": ["ender_eye", 3], "ingredients": {"ender_pearl": 3, "blaze_powder": 3}, "result_count": 3}, {"action": "craft", "target": ["ender_chest", 3], "ingredients": {"obsidian": 24, "ender_eye": 3}, "result_count": 3}, {"action": "craft", "target": ["sugar", 2], "ingredients": {"sugar_cane": 2}, "result_count": 2}, {"action": "craft", "target": ["fermented_spider_eye", 2], "ingredients": {"spider_eye": 2, "brown_mushroom": 2, "sugar": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x cyan_dye, 2x purple_wool", "id": "textcraft.train.797", "max_steps": 50, "misc": {"target_items": {"cyan_dye": 2, "purple_wool": 2}, "initial_inventory": {"cornflower": 3, "green_dye": 2, "rose_bush": 1, "string": 10, "creeper_head": 2, "white_tulip": 2, "cobblestone": 1, "milk_bucket": 1, "wither_skeleton_skull": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["purple_wool", 2], "ingredients": {"purple_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x polished_diorite, 1x mossy_stone_bricks", "id": "textcraft.train.798", "max_steps": 50, "misc": {"target_items": {"polished_diorite": 3, "mossy_stone_bricks": 1}, "initial_inventory": {"cobblestone": 4, "quartz": 4, "stone": 4, "vine": 1, "ender_pearl": 5, "red_tulip": 1, "milk_bucket": 1, "flint": 3, "smooth_red_sandstone": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}, {"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["mossy_stone_bricks", 1], "ingredients": {"stone_bricks": 1, "vine": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x green_banner, 1x pink_stained_glass, 1x blue_stained_glass_pane", "id": "textcraft.train.799", "max_steps": 50, "misc": {"target_items": {"green_banner": 3, "pink_stained_glass": 1, "blue_stained_glass_pane": 1}, "initial_inventory": {"green_dye": 18, "string": 97, "acacia_log": 2, "glass": 19, "pink_tulip": 2, "cornflower": 2, "pumpkin": 2, "smooth_sandstone": 1}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["green_wool", 18], "ingredients": {"green_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["green_banner", 3], "ingredients": {"green_wool": 18, "stick": 3}, "result_count": 3}, {"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_stained_glass", 1], "ingredients": {"glass": 8, "pink_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_stained_glass", 1], "ingredients": {"glass": 8, "blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["blue_stained_glass_pane", 1], "ingredients": {"blue_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 2x yellow_bed, 3x dark_oak_sign, 2x stone_pickaxe", "id": "textcraft.train.800", "max_steps": 50, "misc": {"target_items": {"yellow_bed": 2, "dark_oak_sign": 3, "stone_pickaxe": 2}, "initial_inventory": {"dandelion": 6, "string": 24, "acacia_log": 4, "dark_oak_log": 3, "blackstone": 6, "lily_of_the_valley": 1, "rose_bush": 2}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 6], "ingredients": {"dandelion": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["yellow_wool", 6], "ingredients": {"yellow_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["yellow_bed", 2], "ingredients": {"yellow_wool": 6, "acacia_planks": 6}, "result_count": 2}, {"action": "craft", "target": ["dark_oak_planks", 2], "ingredients": {"dark_oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"dark_oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_sign", 1], "ingredients": {"dark_oak_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_pickaxe", 2], "ingredients": {"blackstone": 6, "stick": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x dark_oak_sign, 3x polished_blackstone_stairs, 3x polished_granite_slab", "id": "textcraft.train.801", "max_steps": 50, "misc": {"target_items": {"dark_oak_sign": 3, "polished_blackstone_stairs": 3, "polished_granite_slab": 3}, "initial_inventory": {"dark_oak_log": 3, "acacia_log": 2, "blackstone": 12, "cobblestone": 5, "quartz": 8, "brick": 1, "gunpowder": 1, "ink_sac": 4, "vine": 2, "stripped_crimson_stem": 4}, "gold_trajectory": [{"action": "craft", "target": ["dark_oak_planks", 2], "ingredients": {"dark_oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"dark_oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_sign", 1], "ingredients": {"dark_oak_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_stairs", 1], "ingredients": {"polished_blackstone": 6}, "result_count": 4}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 4], "ingredients": {"diorite": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite", 1], "ingredients": {"granite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite_slab", 1], "ingredients": {"polished_granite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x arrow, 3x cyan_dye, 3x black_bed", "id": "textcraft.train.802", "max_steps": 50, "misc": {"target_items": {"arrow": 3, "cyan_dye": 3, "black_bed": 3}, "initial_inventory": {"flint": 2, "acacia_log": 6, "feather": 1, "cornflower": 2, "green_dye": 2, "wither_rose": 9, "string": 36, "brick": 5, "spider_eye": 3, "beetroot": 1, "melon_slice": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}, {"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["cyan_dye", 2], "ingredients": {"blue_dye": 2, "green_dye": 2}, "result_count": 4}, {"action": "craft", "target": ["black_dye", 9], "ingredients": {"wither_rose": 9}, "result_count": 9}, {"action": "craft", "target": ["white_wool", 9], "ingredients": {"string": 36}, "result_count": 9}, {"action": "craft", "target": ["black_wool", 9], "ingredients": {"black_dye": 9, "white_wool": 9}, "result_count": 9}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["black_bed", 3], "ingredients": {"black_wool": 9, "acacia_planks": 9}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x nether_brick_fence", "id": "textcraft.train.803", "max_steps": 50, "misc": {"target_items": {"nether_brick_fence": 2}, "initial_inventory": {"nether_brick": 20, "spider_eye": 4, "sunflower": 5}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 4], "ingredients": {"nether_brick": 16}, "result_count": 4}, {"action": "craft", "target": ["nether_brick_fence", 1], "ingredients": {"nether_bricks": 4, "nether_brick": 2}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x white_bed, 2x stone_sword, 3x ender_chest", "id": "textcraft.train.804", "max_steps": 50, "misc": {"target_items": {"white_bed": 3, "stone_sword": 2, "ender_chest": 3}, "initial_inventory": {"string": 39, "acacia_log": 4, "blackstone": 6, "obsidian": 29, "ender_pearl": 3, "blaze_rod": 3, "ink_sac": 2, "blue_orchid": 5, "rose_bush": 2, "sunflower": 3}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 9], "ingredients": {"string": 36}, "result_count": 9}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["white_bed", 3], "ingredients": {"white_wool": 9, "acacia_planks": 9}, "result_count": 3}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_sword", 2], "ingredients": {"blackstone": 4, "stick": 2}, "result_count": 2}, {"action": "craft", "target": ["blaze_powder", 2], "ingredients": {"blaze_rod": 2}, "result_count": 4}, {"action": "craft", "target": ["ender_eye", 3], "ingredients": {"ender_pearl": 3, "blaze_powder": 3}, "result_count": 3}, {"action": "craft", "target": ["ender_chest", 3], "ingredients": {"obsidian": 24, "ender_eye": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x ender_chest, 2x brown_banner", "id": "textcraft.train.805", "max_steps": 50, "misc": {"target_items": {"ender_chest": 1, "brown_banner": 2}, "initial_inventory": {"obsidian": 11, "ender_pearl": 1, "blaze_rod": 1, "cocoa_beans": 15, "string": 66, "acacia_log": 2, "bone": 5, "red_tulip": 4}, "gold_trajectory": [{"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["ender_eye", 1], "ingredients": {"ender_pearl": 1, "blaze_powder": 1}, "result_count": 1}, {"action": "craft", "target": ["ender_chest", 1], "ingredients": {"obsidian": 8, "ender_eye": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_dye", 12], "ingredients": {"cocoa_beans": 12}, "result_count": 12}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["brown_wool", 12], "ingredients": {"brown_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["brown_banner", 2], "ingredients": {"brown_wool": 12, "stick": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x yellow_banner, 1x gray_dye", "id": "textcraft.train.806", "max_steps": 50, "misc": {"target_items": {"yellow_banner": 3, "gray_dye": 1}, "initial_inventory": {"dandelion": 25, "string": 104, "acacia_log": 2, "wither_rose": 1, "lily_of_the_valley": 1, "white_tulip": 3, "nether_star": 5, "pink_tulip": 3}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 18], "ingredients": {"dandelion": 18}, "result_count": 18}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["yellow_wool", 18], "ingredients": {"yellow_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["yellow_banner", 3], "ingredients": {"yellow_wool": 18, "stick": 3}, "result_count": 3}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x dark_oak_fence_gate", "id": "textcraft.train.807", "max_steps": 50, "misc": {"target_items": {"dark_oak_fence_gate": 1}, "initial_inventory": {"acacia_log": 2, "dark_oak_log": 2, "oxeye_daisy": 2, "heart_of_the_sea": 3, "oak_log": 2, "creeper_head": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_planks", 1], "ingredients": {"dark_oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_fence_gate", 1], "ingredients": {"stick": 4, "dark_oak_planks": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x chiseled_stone_bricks", "id": "textcraft.train.808", "max_steps": 50, "misc": {"target_items": {"chiseled_stone_bricks": 1}, "initial_inventory": {"stone": 5, "blackstone": 2, "glass": 2, "brick": 1, "smooth_stone": 5}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["stone_brick_slab", 1], "ingredients": {"stone_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_stone_bricks", 1], "ingredients": {"stone_brick_slab": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x chiseled_nether_bricks", "id": "textcraft.train.809", "max_steps": 50, "misc": {"target_items": {"chiseled_nether_bricks": 2}, "initial_inventory": {"nether_brick": 18, "terracotta": 1, "nautilus_shell": 1}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_nether_bricks", 2], "ingredients": {"nether_brick_slab": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x black_concrete_powder, 1x polished_blackstone_brick_wall, 2x lime_terracotta", "id": "textcraft.train.810", "max_steps": 50, "misc": {"target_items": {"black_concrete_powder": 3, "polished_blackstone_brick_wall": 1, "lime_terracotta": 2}, "initial_inventory": {"wither_rose": 1, "sand": 4, "gravel": 6, "blackstone": 12, "terracotta": 12, "green_dye": 2, "lily_of_the_valley": 2, "oak_log": 2, "dirt": 1, "red_tulip": 4}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_concrete_powder", 1], "ingredients": {"black_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_bricks", 2], "ingredients": {"polished_blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_brick_wall", 1], "ingredients": {"polished_blackstone_bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_terracotta", 1], "ingredients": {"terracotta": 8, "lime_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x birch_fence_gate, 1x yellow_bed", "id": "textcraft.train.811", "max_steps": 50, "misc": {"target_items": {"birch_fence_gate": 3, "yellow_bed": 1}, "initial_inventory": {"acacia_log": 4, "birch_log": 3, "dandelion": 4, "string": 14, "warped_planks": 4, "egg": 2, "nautilus_shell": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 3], "ingredients": {"tag:planks": 6}, "result_count": 12}, {"action": "craft", "target": ["birch_planks", 2], "ingredients": {"birch_log": 2}, "result_count": 8}, {"action": "craft", "target": ["birch_fence_gate", 3], "ingredients": {"stick": 12, "birch_planks": 6}, "result_count": 3}, {"action": "craft", "target": ["yellow_dye", 3], "ingredients": {"dandelion": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["yellow_wool", 3], "ingredients": {"yellow_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["yellow_bed", 1], "ingredients": {"yellow_wool": 3, "acacia_planks": 3}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x mossy_stone_brick_slab", "id": "textcraft.train.812", "max_steps": 50, "misc": {"target_items": {"mossy_stone_brick_slab": 1}, "initial_inventory": {"stone": 4, "vine": 4, "egg": 3, "creeper_head": 2}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["mossy_stone_bricks", 3], "ingredients": {"stone_bricks": 3, "vine": 3}, "result_count": 3}, {"action": "craft", "target": ["mossy_stone_brick_slab", 1], "ingredients": {"mossy_stone_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x nether_brick_wall", "id": "textcraft.train.813", "max_steps": 50, "misc": {"target_items": {"nether_brick_wall": 3}, "initial_inventory": {"nether_brick": 36, "dandelion": 5, "carrot": 1}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 6], "ingredients": {"nether_brick": 24}, "result_count": 6}, {"action": "craft", "target": ["nether_brick_wall", 1], "ingredients": {"nether_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x red_carpet, 1x mossy_cobblestone_wall, 1x cyan_concrete_powder", "id": "textcraft.train.814", "max_steps": 50, "misc": {"target_items": {"red_carpet": 2, "mossy_cobblestone_wall": 1, "cyan_concrete_powder": 1}, "initial_inventory": {"rose_bush": 2, "string": 9, "cobblestone": 8, "vine": 8, "cornflower": 1, "green_dye": 2, "sand": 6, "gravel": 6, "prismarine_shard": 4, "cooked_rabbit": 1, "oxeye_daisy": 5, "dandelion": 1}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["red_wool", 2], "ingredients": {"red_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["red_carpet", 1], "ingredients": {"red_wool": 2}, "result_count": 3}, {"action": "craft", "target": ["mossy_cobblestone", 6], "ingredients": {"cobblestone": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_cobblestone_wall", 1], "ingredients": {"mossy_cobblestone": 6}, "result_count": 6}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_concrete_powder", 1], "ingredients": {"cyan_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x white_banner", "id": "textcraft.train.815", "max_steps": 50, "misc": {"target_items": {"white_banner": 1}, "initial_inventory": {"string": 31, "acacia_log": 1, "stripped_warped_stem": 4, "red_sand": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["white_banner", 1], "ingredients": {"white_wool": 6, "stick": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x lever, 2x yellow_terracotta, 2x chiseled_polished_blackstone", "id": "textcraft.train.816", "max_steps": 50, "misc": {"target_items": {"lever": 3, "yellow_terracotta": 2, "chiseled_polished_blackstone": 2}, "initial_inventory": {"acacia_log": 2, "cobblestone": 3, "terracotta": 8, "dandelion": 1, "blackstone": 4, "creeper_head": 1, "carved_pumpkin": 2, "stripped_warped_stem": 2, "obsidian": 3, "stripped_dark_oak_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["lever", 3], "ingredients": {"stick": 3, "cobblestone": 3}, "result_count": 3}, {"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_terracotta", 1], "ingredients": {"terracotta": 8, "yellow_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_slab", 1], "ingredients": {"polished_blackstone": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_polished_blackstone", 2], "ingredients": {"polished_blackstone_slab": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x bow, 1x yellow_bed, 2x warped_fence", "id": "textcraft.train.817", "max_steps": 50, "misc": {"target_items": {"bow": 1, "yellow_bed": 1, "warped_fence": 2}, "initial_inventory": {"acacia_log": 3, "string": 19, "dandelion": 4, "warped_stem": 2, "jungle_planks": 3, "dark_oak_log": 5, "dirt": 1}, "gold_trajectory": [{"action": "craft", "target": ["stick", 1], "ingredients": {"jungle_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["bow", 1], "ingredients": {"stick": 3, "string": 3}, "result_count": 1}, {"action": "craft", "target": ["yellow_dye", 3], "ingredients": {"dandelion": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["yellow_wool", 3], "ingredients": {"yellow_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["yellow_bed", 1], "ingredients": {"yellow_wool": 3, "acacia_planks": 3}, "result_count": 1}, {"action": "craft", "target": ["warped_planks", 1], "ingredients": {"warped_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"warped_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["warped_planks", 1], "ingredients": {"warped_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["warped_fence", 1], "ingredients": {"warped_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x leather_boots", "id": "textcraft.train.818", "max_steps": 50, "misc": {"target_items": {"leather_boots": 1}, "initial_inventory": {"rabbit_hide": 24, "nether_brick": 3, "carved_pumpkin": 4}, "gold_trajectory": [{"action": "craft", "target": ["leather", 4], "ingredients": {"rabbit_hide": 16}, "result_count": 4}, {"action": "craft", "target": ["leather_boots", 1], "ingredients": {"leather": 4}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x orange_concrete_powder, 3x polished_granite_stairs", "id": "textcraft.train.819", "max_steps": 50, "misc": {"target_items": {"orange_concrete_powder": 1, "polished_granite_stairs": 3}, "initial_inventory": {"orange_tulip": 1, "sand": 5, "gravel": 6, "cobblestone": 12, "quartz": 19, "smooth_stone": 4, "glass": 5, "end_stone": 5, "stripped_dark_oak_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_concrete_powder", 1], "ingredients": {"orange_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["diorite", 4], "ingredients": {"cobblestone": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["granite", 8], "ingredients": {"diorite": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_granite", 2], "ingredients": {"granite": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_granite_stairs", 1], "ingredients": {"polished_granite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x ender_chest", "id": "textcraft.train.820", "max_steps": 50, "misc": {"target_items": {"ender_chest": 3}, "initial_inventory": {"obsidian": 24, "ender_pearl": 3, "blaze_rod": 2, "pumpkin": 1, "bamboo": 3, "oxeye_daisy": 5, "sunflower": 2, "shulker_shell": 5}, "gold_trajectory": [{"action": "craft", "target": ["blaze_powder", 2], "ingredients": {"blaze_rod": 2}, "result_count": 4}, {"action": "craft", "target": ["ender_eye", 3], "ingredients": {"ender_pearl": 3, "blaze_powder": 3}, "result_count": 3}, {"action": "craft", "target": ["ender_chest", 3], "ingredients": {"obsidian": 24, "ender_eye": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x sandstone_wall", "id": "textcraft.train.821", "max_steps": 50, "misc": {"target_items": {"sandstone_wall": 2}, "initial_inventory": {"sand": 30, "basalt": 5, "azure_bluet": 2, "wither_rose": 4}, "gold_trajectory": [{"action": "craft", "target": ["sandstone", 6], "ingredients": {"sand": 24}, "result_count": 6}, {"action": "craft", "target": ["sandstone_wall", 1], "ingredients": {"sandstone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x purple_stained_glass, 2x black_wool", "id": "textcraft.train.822", "max_steps": 50, "misc": {"target_items": {"purple_stained_glass": 1, "black_wool": 2}, "initial_inventory": {"glass": 11, "cornflower": 2, "rose_bush": 2, "wither_rose": 3, "string": 11, "red_tulip": 2, "pink_tulip": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_stained_glass", 1], "ingredients": {"glass": 8, "purple_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["black_wool", 2], "ingredients": {"black_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x purple_concrete_powder", "id": "textcraft.train.823", "max_steps": 50, "misc": {"target_items": {"purple_concrete_powder": 3}, "initial_inventory": {"cornflower": 2, "rose_bush": 2, "sand": 5, "gravel": 4, "shulker_shell": 3, "ender_pearl": 3, "netherite_scrap": 1, "jungle_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_concrete_powder", 1], "ingredients": {"purple_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x polished_granite_stairs, 3x white_carpet", "id": "textcraft.train.824", "max_steps": 50, "misc": {"target_items": {"polished_granite_stairs": 2, "white_carpet": 3}, "initial_inventory": {"cobblestone": 9, "quartz": 19, "string": 12, "sugar_cane": 1, "netherite_scrap": 5, "oxeye_daisy": 2, "smooth_stone": 2, "stripped_crimson_stem": 2}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 4], "ingredients": {"cobblestone": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["granite", 8], "ingredients": {"diorite": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_granite", 2], "ingredients": {"granite": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_granite_stairs", 1], "ingredients": {"polished_granite": 6}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["white_carpet", 1], "ingredients": {"white_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x wooden_shovel, 3x dark_prismarine_stairs", "id": "textcraft.train.825", "max_steps": 50, "misc": {"target_items": {"wooden_shovel": 1, "dark_prismarine_stairs": 3}, "initial_inventory": {"acacia_log": 2, "prismarine_shard": 65, "wither_rose": 9, "nautilus_shell": 5, "orange_tulip": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["wooden_shovel", 1], "ingredients": {"acacia_planks": 1, "stick": 2}, "result_count": 1}, {"action": "craft", "target": ["black_dye", 6], "ingredients": {"wither_rose": 6}, "result_count": 6}, {"action": "craft", "target": ["dark_prismarine", 6], "ingredients": {"prismarine_shard": 48, "black_dye": 6}, "result_count": 6}, {"action": "craft", "target": ["dark_prismarine_stairs", 1], "ingredients": {"dark_prismarine": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x jungle_sign", "id": "textcraft.train.826", "max_steps": 50, "misc": {"target_items": {"jungle_sign": 3}, "initial_inventory": {"jungle_log": 3, "acacia_log": 2, "stripped_jungle_log": 1, "stripped_dark_oak_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["jungle_planks", 2], "ingredients": {"jungle_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"jungle_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_sign", 1], "ingredients": {"jungle_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x black_carpet, 3x polished_diorite", "id": "textcraft.train.827", "max_steps": 50, "misc": {"target_items": {"black_carpet": 2, "polished_diorite": 3}, "initial_inventory": {"wither_rose": 3, "string": 10, "cobblestone": 5, "quartz": 6, "prismarine_shard": 5, "nether_wart": 3, "gunpowder": 3, "smooth_stone": 4, "acacia_log": 3}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["black_wool", 2], "ingredients": {"black_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["black_carpet", 1], "ingredients": {"black_wool": 2}, "result_count": 3}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x flower_banner_pattern, 3x painting", "id": "textcraft.train.828", "max_steps": 50, "misc": {"target_items": {"flower_banner_pattern": 1, "painting": 3}, "initial_inventory": {"sugar_cane": 3, "oxeye_daisy": 2, "acacia_log": 4, "wither_rose": 3, "string": 18, "lilac": 4, "milk_bucket": 2, "smooth_quartz": 3}, "gold_trajectory": [{"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["flower_banner_pattern", 1], "ingredients": {"paper": 1, "oxeye_daisy": 1}, "result_count": 1}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["stick", 6], "ingredients": {"acacia_planks": 12}, "result_count": 24}, {"action": "craft", "target": ["black_dye", 3], "ingredients": {"wither_rose": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["black_wool", 3], "ingredients": {"black_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["painting", 3], "ingredients": {"stick": 24, "black_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x leather_chestplate, 1x wooden_pickaxe", "id": "textcraft.train.829", "max_steps": 50, "misc": {"target_items": {"leather_chestplate": 2, "wooden_pickaxe": 1}, "initial_inventory": {"rabbit_hide": 71, "acacia_log": 2, "acacia_planks": 4, "baked_potato": 2, "blue_orchid": 5, "wither_rose": 3, "lilac": 4}, "gold_trajectory": [{"action": "craft", "target": ["leather", 16], "ingredients": {"rabbit_hide": 64}, "result_count": 16}, {"action": "craft", "target": ["leather_chestplate", 2], "ingredients": {"leather": 16}, "result_count": 2}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["wooden_pickaxe", 1], "ingredients": {"tag:planks": 3, "stick": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x flower_banner_pattern", "id": "textcraft.train.830", "max_steps": 50, "misc": {"target_items": {"flower_banner_pattern": 1}, "initial_inventory": {"sugar_cane": 4, "oxeye_daisy": 1, "creeper_head": 4, "dirt": 3, "ender_pearl": 3}, "gold_trajectory": [{"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["flower_banner_pattern", 1], "ingredients": {"paper": 1, "oxeye_daisy": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x bookshelf", "id": "textcraft.train.831", "max_steps": 50, "misc": {"target_items": {"bookshelf": 1}, "initial_inventory": {"acacia_log": 2, "sugar_cane": 11, "rabbit_hide": 17, "egg": 5, "peony": 3, "creeper_head": 2, "stripped_jungle_log": 3, "nautilus_shell": 2}, "gold_trajectory": [{"action": "craft", "target": ["paper", 3], "ingredients": {"sugar_cane": 9}, "result_count": 9}, {"action": "craft", "target": ["leather", 3], "ingredients": {"rabbit_hide": 12}, "result_count": 3}, {"action": "craft", "target": ["book", 3], "ingredients": {"paper": 9, "leather": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["bookshelf", 1], "ingredients": {"acacia_planks": 6, "book": 3}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x stone_pickaxe", "id": "textcraft.train.832", "max_steps": 50, "misc": {"target_items": {"stone_pickaxe": 3}, "initial_inventory": {"blackstone": 9, "acacia_log": 1, "smooth_quartz": 5, "scute": 1, "crying_obsidian": 1, "basalt": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["stone_pickaxe", 3], "ingredients": {"blackstone": 9, "stick": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x brown_banner", "id": "textcraft.train.833", "max_steps": 50, "misc": {"target_items": {"brown_banner": 1}, "initial_inventory": {"cocoa_beans": 6, "string": 27, "acacia_log": 2, "sugar_cane": 2, "dandelion": 4, "stripped_acacia_log": 1, "milk_bucket": 2}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 6], "ingredients": {"cocoa_beans": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["brown_wool", 6], "ingredients": {"brown_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["brown_banner", 1], "ingredients": {"brown_wool": 6, "stick": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x oak_fence, 1x torch, 3x prismarine_brick_stairs", "id": "textcraft.train.834", "max_steps": 50, "misc": {"target_items": {"oak_fence": 2, "torch": 1, "prismarine_brick_stairs": 3}, "initial_inventory": {"oak_log": 2, "acacia_log": 3, "prismarine_shard": 80, "enchanted_golden_apple": 2, "cooked_rabbit": 2, "stripped_oak_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["oak_planks", 1], "ingredients": {"oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["oak_planks", 1], "ingredients": {"oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["oak_fence", 1], "ingredients": {"oak_planks": 4, "stick": 2}, "result_count": 3}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}, {"action": "craft", "target": ["prismarine_bricks", 6], "ingredients": {"prismarine_shard": 54}, "result_count": 6}, {"action": "craft", "target": ["prismarine_brick_stairs", 1], "ingredients": {"prismarine_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x lime_concrete_powder", "id": "textcraft.train.835", "max_steps": 50, "misc": {"target_items": {"lime_concrete_powder": 1}, "initial_inventory": {"green_dye": 1, "lily_of_the_valley": 1, "sand": 5, "gravel": 5, "prismarine_shard": 2, "cornflower": 2, "quartz": 4, "cocoa_beans": 1}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_concrete_powder", 1], "ingredients": {"lime_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x black_bed", "id": "textcraft.train.836", "max_steps": 50, "misc": {"target_items": {"black_bed": 3}, "initial_inventory": {"wither_rose": 13, "string": 43, "acacia_log": 3, "gunpowder": 4, "vine": 3}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 9], "ingredients": {"wither_rose": 9}, "result_count": 9}, {"action": "craft", "target": ["white_wool", 9], "ingredients": {"string": 36}, "result_count": 9}, {"action": "craft", "target": ["black_wool", 9], "ingredients": {"black_dye": 9, "white_wool": 9}, "result_count": 9}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["black_bed", 3], "ingredients": {"black_wool": 9, "acacia_planks": 9}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x polished_diorite_stairs, 2x polished_blackstone_bricks, 2x andesite_wall", "id": "textcraft.train.837", "max_steps": 50, "misc": {"target_items": {"polished_diorite_stairs": 1, "polished_blackstone_bricks": 2, "andesite_wall": 2}, "initial_inventory": {"cobblestone": 19, "quartz": 13, "blackstone": 4, "spider_eye": 2, "flint": 2, "stone": 5}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 4], "ingredients": {"cobblestone": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_diorite", 2], "ingredients": {"diorite": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_diorite_stairs", 1], "ingredients": {"polished_diorite": 6}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_bricks", 1], "ingredients": {"polished_blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 3], "ingredients": {"diorite": 3, "cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["andesite_wall", 1], "ingredients": {"andesite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x red_sandstone_wall", "id": "textcraft.train.838", "max_steps": 50, "misc": {"target_items": {"red_sandstone_wall": 1}, "initial_inventory": {"red_sand": 36, "blackstone": 2, "sugar_cane": 5, "poppy": 5, "basalt": 2}, "gold_trajectory": [{"action": "craft", "target": ["red_sandstone", 6], "ingredients": {"red_sand": 24}, "result_count": 6}, {"action": "craft", "target": ["red_sandstone_wall", 1], "ingredients": {"red_sandstone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x black_bed", "id": "textcraft.train.839", "max_steps": 50, "misc": {"target_items": {"black_bed": 2}, "initial_inventory": {"wither_rose": 6, "string": 30, "acacia_log": 2, "spider_eye": 3, "feather": 1, "red_tulip": 2, "stripped_oak_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 6], "ingredients": {"wither_rose": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["black_wool", 6], "ingredients": {"black_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["black_bed", 2], "ingredients": {"black_wool": 6, "acacia_planks": 6}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x blue_carpet", "id": "textcraft.train.840", "max_steps": 50, "misc": {"target_items": {"blue_carpet": 2}, "initial_inventory": {"string": 36, "cornflower": 1, "basalt": 1, "scute": 1, "ender_pearl": 4}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_carpet", 1], "ingredients": {"white_carpet": 8, "blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x nether_brick_slab", "id": "textcraft.train.841", "max_steps": 50, "misc": {"target_items": {"nether_brick_slab": 3}, "initial_inventory": {"nether_brick": 12, "scute": 4, "quartz": 5, "apple": 4}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x gray_stained_glass, 2x gray_wool, 2x purple_terracotta", "id": "textcraft.train.842", "max_steps": 50, "misc": {"target_items": {"gray_stained_glass": 3, "gray_wool": 2, "purple_terracotta": 2}, "initial_inventory": {"glass": 12, "wither_rose": 3, "lily_of_the_valley": 3, "string": 9, "terracotta": 8, "cornflower": 2, "rose_bush": 1, "warped_stem": 3, "cooked_rabbit": 4, "creeper_head": 1}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_stained_glass", 1], "ingredients": {"glass": 8, "gray_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["gray_wool", 2], "ingredients": {"gray_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_terracotta", 1], "ingredients": {"terracotta": 8, "purple_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x warped_fence_gate", "id": "textcraft.train.843", "max_steps": 50, "misc": {"target_items": {"warped_fence_gate": 3}, "initial_inventory": {"acacia_log": 2, "warped_stem": 3, "crimson_stem": 5, "white_tulip": 4, "green_dye": 1, "dandelion": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["warped_planks", 2], "ingredients": {"warped_stem": 2}, "result_count": 8}, {"action": "craft", "target": ["warped_fence_gate", 3], "ingredients": {"stick": 12, "warped_planks": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x dark_oak_fence", "id": "textcraft.train.844", "max_steps": 50, "misc": {"target_items": {"dark_oak_fence": 1}, "initial_inventory": {"dark_oak_log": 2, "acacia_log": 2, "quartz": 1, "red_sand": 2, "stripped_crimson_stem": 4, "feather": 4, "nether_wart": 1}, "gold_trajectory": [{"action": "craft", "target": ["dark_oak_planks", 1], "ingredients": {"dark_oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"dark_oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_planks", 1], "ingredients": {"dark_oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_fence", 1], "ingredients": {"dark_oak_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x cut_sandstone_slab", "id": "textcraft.train.845", "max_steps": 50, "misc": {"target_items": {"cut_sandstone_slab": 3}, "initial_inventory": {"sand": 17, "heart_of_the_sea": 3, "allium": 1, "birch_log": 5, "stripped_oak_log": 3, "lilac": 2}, "gold_trajectory": [{"action": "craft", "target": ["sandstone", 4], "ingredients": {"sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_sandstone", 1], "ingredients": {"sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["cut_sandstone_slab", 1], "ingredients": {"cut_sandstone": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x orange_carpet, 2x red_wool", "id": "textcraft.train.846", "max_steps": 50, "misc": {"target_items": {"orange_carpet": 2, "red_wool": 2}, "initial_inventory": {"string": 40, "orange_tulip": 2, "rose_bush": 2, "red_mushroom": 1, "stone": 1, "smooth_sandstone": 2, "nether_brick": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_carpet", 1], "ingredients": {"white_carpet": 8, "orange_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["red_wool", 2], "ingredients": {"red_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x orange_concrete_powder, 3x white_stained_glass", "id": "textcraft.train.847", "max_steps": 50, "misc": {"target_items": {"orange_concrete_powder": 2, "white_stained_glass": 3}, "initial_inventory": {"orange_tulip": 2, "sand": 5, "gravel": 5, "glass": 10, "lily_of_the_valley": 2, "nether_star": 1, "nether_brick": 2, "red_tulip": 3, "cocoa_beans": 1, "blackstone": 3}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_concrete_powder", 1], "ingredients": {"orange_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_stained_glass", 1], "ingredients": {"glass": 8, "white_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x orange_wool", "id": "textcraft.train.848", "max_steps": 50, "misc": {"target_items": {"orange_wool": 2}, "initial_inventory": {"orange_tulip": 2, "string": 10, "pink_tulip": 2, "bamboo": 2, "crying_obsidian": 5, "nautilus_shell": 4}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 2], "ingredients": {"orange_tulip": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["orange_wool", 2], "ingredients": {"orange_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x sandstone_wall, 3x blue_carpet, 2x birch_fence", "id": "textcraft.train.849", "max_steps": 50, "misc": {"target_items": {"sandstone_wall": 2, "blue_carpet": 3, "birch_fence": 2}, "initial_inventory": {"sand": 29, "string": 28, "cornflower": 2, "birch_log": 2, "acacia_log": 1, "heart_of_the_sea": 3, "smooth_red_sandstone": 2, "nether_star": 3, "bone": 3}, "gold_trajectory": [{"action": "craft", "target": ["sandstone", 6], "ingredients": {"sand": 24}, "result_count": 6}, {"action": "craft", "target": ["sandstone_wall", 1], "ingredients": {"sandstone": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_carpet", 1], "ingredients": {"white_carpet": 8, "blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["birch_planks", 1], "ingredients": {"birch_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"birch_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["birch_planks", 1], "ingredients": {"birch_log": 1}, "result_count": 4}, {"action": "craft", "target": ["birch_fence", 1], "ingredients": {"birch_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x black_stained_glass_pane, 3x orange_concrete_powder, 1x birch_fence", "id": "textcraft.train.850", "max_steps": 50, "misc": {"target_items": {"black_stained_glass_pane": 3, "orange_concrete_powder": 3, "birch_fence": 1}, "initial_inventory": {"glass": 12, "wither_rose": 1, "orange_tulip": 2, "sand": 5, "gravel": 6, "birch_log": 2, "acacia_log": 2, "string": 3, "stripped_birch_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_stained_glass", 1], "ingredients": {"glass": 8, "black_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["black_stained_glass_pane", 1], "ingredients": {"black_stained_glass": 6}, "result_count": 16}, {"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_concrete_powder", 1], "ingredients": {"orange_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["birch_planks", 1], "ingredients": {"birch_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"birch_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["birch_planks", 1], "ingredients": {"birch_log": 1}, "result_count": 4}, {"action": "craft", "target": ["birch_fence", 1], "ingredients": {"birch_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x white_dye, 1x yellow_stained_glass, 1x nether_brick_stairs", "id": "textcraft.train.851", "max_steps": 50, "misc": {"target_items": {"white_dye": 1, "yellow_stained_glass": 1, "nether_brick_stairs": 1}, "initial_inventory": {"lily_of_the_valley": 1, "glass": 12, "dandelion": 2, "nether_brick": 32, "stripped_crimson_stem": 5, "apple": 4, "spider_eye": 5, "poppy": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_stained_glass", 1], "ingredients": {"glass": 8, "yellow_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["nether_bricks", 6], "ingredients": {"nether_brick": 24}, "result_count": 6}, {"action": "craft", "target": ["nether_brick_stairs", 1], "ingredients": {"nether_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x orange_dye, 2x wooden_pickaxe", "id": "textcraft.train.852", "max_steps": 50, "misc": {"target_items": {"orange_dye": 3, "wooden_pickaxe": 2}, "initial_inventory": {"orange_tulip": 3, "acacia_log": 4, "blue_orchid": 3, "bamboo": 5, "stripped_crimson_stem": 2, "crying_obsidian": 2, "oak_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 3], "ingredients": {"orange_tulip": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_pickaxe", 2], "ingredients": {"acacia_planks": 6, "stick": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x nether_brick_fence, 2x brick_wall", "id": "textcraft.train.853", "max_steps": 50, "misc": {"target_items": {"nether_brick_fence": 2, "brick_wall": 2}, "initial_inventory": {"nether_brick": 24, "brick": 25, "apple": 5, "cornflower": 5, "carved_pumpkin": 1}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 4], "ingredients": {"nether_brick": 16}, "result_count": 4}, {"action": "craft", "target": ["nether_brick_fence", 1], "ingredients": {"nether_bricks": 4, "nether_brick": 2}, "result_count": 6}, {"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_wall", 1], "ingredients": {"bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x stone_brick_wall", "id": "textcraft.train.854", "max_steps": 50, "misc": {"target_items": {"stone_brick_wall": 1}, "initial_inventory": {"stone": 9, "melon_slice": 4, "heart_of_the_sea": 4}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["stone_brick_wall", 1], "ingredients": {"stone_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x white_dye, 2x gray_concrete_powder, 1x brown_concrete_powder", "id": "textcraft.train.855", "max_steps": 50, "misc": {"target_items": {"white_dye": 3, "gray_concrete_powder": 2, "brown_concrete_powder": 1}, "initial_inventory": {"lily_of_the_valley": 6, "wither_rose": 1, "sand": 8, "gravel": 10, "cocoa_beans": 2, "allium": 3, "pink_tulip": 3, "glass": 4, "cornflower": 1}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 3], "ingredients": {"lily_of_the_valley": 3}, "result_count": 3}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_concrete_powder", 1], "ingredients": {"gray_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_concrete_powder", 1], "ingredients": {"brown_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x fire_charge", "id": "textcraft.train.856", "max_steps": 50, "misc": {"target_items": {"fire_charge": 1}, "initial_inventory": {"gunpowder": 2, "blaze_rod": 2, "lilac": 3, "orange_tulip": 2, "feather": 1, "warped_stem": 3}, "gold_trajectory": [{"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["fire_charge", 1], "ingredients": {"gunpowder": 1, "blaze_powder": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x warped_fence", "id": "textcraft.train.857", "max_steps": 50, "misc": {"target_items": {"warped_fence": 2}, "initial_inventory": {"warped_stem": 2, "acacia_log": 2, "crying_obsidian": 5, "feather": 3}, "gold_trajectory": [{"action": "craft", "target": ["warped_planks", 1], "ingredients": {"warped_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"warped_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["warped_planks", 1], "ingredients": {"warped_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["warped_fence", 1], "ingredients": {"warped_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x flower_banner_pattern, 2x stone_sword", "id": "textcraft.train.858", "max_steps": 50, "misc": {"target_items": {"flower_banner_pattern": 2, "stone_sword": 2}, "initial_inventory": {"sugar_cane": 3, "oxeye_daisy": 2, "blackstone": 5, "acacia_log": 1, "ghast_tear": 2, "quartz": 5, "stripped_jungle_log": 1, "creeper_head": 2}, "gold_trajectory": [{"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["flower_banner_pattern", 2], "ingredients": {"paper": 2, "oxeye_daisy": 2}, "result_count": 2}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_sword", 2], "ingredients": {"blackstone": 4, "stick": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x light_blue_wool", "id": "textcraft.train.859", "max_steps": 50, "misc": {"target_items": {"light_blue_wool": 1}, "initial_inventory": {"cornflower": 1, "lily_of_the_valley": 1, "string": 4, "warped_stem": 2, "heart_of_the_sea": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["light_blue_wool", 1], "ingredients": {"light_blue_dye": 1, "white_wool": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x yellow_wool", "id": "textcraft.train.860", "max_steps": 50, "misc": {"target_items": {"yellow_wool": 1}, "initial_inventory": {"dandelion": 1, "string": 4, "cornflower": 2, "blackstone": 4}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["yellow_wool", 1], "ingredients": {"yellow_dye": 1, "white_wool": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x fire_charge, 2x blue_banner", "id": "textcraft.train.861", "max_steps": 50, "misc": {"target_items": {"fire_charge": 1, "blue_banner": 2}, "initial_inventory": {"gunpowder": 2, "blaze_rod": 1, "cornflower": 12, "string": 50, "acacia_log": 1, "nautilus_shell": 5, "brown_mushroom": 3, "carrot": 2}, "gold_trajectory": [{"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["fire_charge", 1], "ingredients": {"gunpowder": 1, "blaze_powder": 1}, "result_count": 3}, {"action": "craft", "target": ["blue_dye", 12], "ingredients": {"cornflower": 12}, "result_count": 12}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["blue_wool", 12], "ingredients": {"blue_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["blue_banner", 2], "ingredients": {"blue_wool": 12, "stick": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x polished_diorite", "id": "textcraft.train.862", "max_steps": 50, "misc": {"target_items": {"polished_diorite": 1}, "initial_inventory": {"cobblestone": 5, "quartz": 6, "sunflower": 2, "wither_skeleton_skull": 3, "smooth_stone": 1}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x warped_sign, 1x brown_carpet, 1x prismarine_slab", "id": "textcraft.train.863", "max_steps": 50, "misc": {"target_items": {"warped_sign": 3, "brown_carpet": 1, "prismarine_slab": 1}, "initial_inventory": {"warped_stem": 2, "acacia_log": 2, "cocoa_beans": 2, "string": 10, "prismarine_shard": 12, "apple": 4, "stripped_birch_log": 5, "crimson_stem": 1, "bamboo": 4, "smooth_quartz": 3}, "gold_trajectory": [{"action": "craft", "target": ["warped_planks", 2], "ingredients": {"warped_stem": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"warped_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["warped_sign", 1], "ingredients": {"warped_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["brown_dye", 2], "ingredients": {"cocoa_beans": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["brown_wool", 2], "ingredients": {"brown_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["brown_carpet", 1], "ingredients": {"brown_wool": 2}, "result_count": 3}, {"action": "craft", "target": ["prismarine", 3], "ingredients": {"prismarine_shard": 12}, "result_count": 3}, {"action": "craft", "target": ["prismarine_slab", 1], "ingredients": {"prismarine": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x brown_stained_glass, 3x prismarine_brick_stairs, 1x torch", "id": "textcraft.train.864", "max_steps": 50, "misc": {"target_items": {"brown_stained_glass": 1, "prismarine_brick_stairs": 3, "torch": 1}, "initial_inventory": {"glass": 11, "cocoa_beans": 1, "prismarine_shard": 79, "acacia_log": 1, "stripped_crimson_stem": 1, "egg": 1}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_stained_glass", 1], "ingredients": {"glass": 8, "brown_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["prismarine_bricks", 6], "ingredients": {"prismarine_shard": 54}, "result_count": 6}, {"action": "craft", "target": ["prismarine_brick_stairs", 1], "ingredients": {"prismarine_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x red_nether_brick_slab", "id": "textcraft.train.865", "max_steps": 50, "misc": {"target_items": {"red_nether_brick_slab": 2}, "initial_inventory": {"nether_brick": 6, "nether_wart": 7, "prismarine_shard": 5, "dark_oak_log": 5, "carved_pumpkin": 1}, "gold_trajectory": [{"action": "craft", "target": ["red_nether_bricks", 3], "ingredients": {"nether_brick": 6, "nether_wart": 6}, "result_count": 3}, {"action": "craft", "target": ["red_nether_brick_slab", 1], "ingredients": {"red_nether_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x cyan_dye, 3x torch", "id": "textcraft.train.866", "max_steps": 50, "misc": {"target_items": {"cyan_dye": 2, "torch": 3}, "initial_inventory": {"cornflower": 1, "green_dye": 1, "acacia_log": 1, "sand": 5, "clay_ball": 5, "blackstone": 3, "stripped_acacia_log": 5}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x leather_leggings, 2x end_stone_brick_stairs", "id": "textcraft.train.867", "max_steps": 50, "misc": {"target_items": {"leather_leggings": 3, "end_stone_brick_stairs": 2}, "initial_inventory": {"rabbit_hide": 121, "end_stone": 11, "allium": 1, "prismarine_shard": 5, "popped_chorus_fruit": 2}, "gold_trajectory": [{"action": "craft", "target": ["leather", 21], "ingredients": {"rabbit_hide": 84}, "result_count": 21}, {"action": "craft", "target": ["leather_leggings", 3], "ingredients": {"leather": 21}, "result_count": 3}, {"action": "craft", "target": ["end_stone_bricks", 2], "ingredients": {"end_stone": 8}, "result_count": 8}, {"action": "craft", "target": ["end_stone_brick_stairs", 1], "ingredients": {"end_stone_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x jungle_fence_gate, 1x wooden_pickaxe", "id": "textcraft.train.868", "max_steps": 50, "misc": {"target_items": {"jungle_fence_gate": 2, "wooden_pickaxe": 1}, "initial_inventory": {"acacia_log": 4, "jungle_log": 2, "oak_planks": 3, "crimson_stem": 1, "cooked_rabbit": 1, "blue_orchid": 5, "pumpkin": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["jungle_fence_gate", 2], "ingredients": {"stick": 8, "jungle_planks": 4}, "result_count": 2}, {"action": "craft", "target": ["stick", 1], "ingredients": {"oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_pickaxe", 1], "ingredients": {"acacia_planks": 3, "stick": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x white_carpet, 2x red_wool, 1x ender_chest", "id": "textcraft.train.869", "max_steps": 50, "misc": {"target_items": {"white_carpet": 3, "red_wool": 2, "ender_chest": 1}, "initial_inventory": {"string": 23, "rose_bush": 2, "obsidian": 10, "ender_pearl": 1, "blaze_rod": 2, "stripped_oak_log": 2, "creeper_head": 5, "nautilus_shell": 3, "nether_brick": 2, "spruce_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["white_carpet", 1], "ingredients": {"white_wool": 2}, "result_count": 3}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["red_wool", 2], "ingredients": {"red_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["ender_eye", 1], "ingredients": {"ender_pearl": 1, "blaze_powder": 1}, "result_count": 1}, {"action": "craft", "target": ["ender_chest", 1], "ingredients": {"obsidian": 8, "ender_eye": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x blue_terracotta", "id": "textcraft.train.870", "max_steps": 50, "misc": {"target_items": {"blue_terracotta": 2}, "initial_inventory": {"terracotta": 10, "cornflower": 2, "blaze_rod": 2, "crimson_stem": 2, "ice": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_terracotta", 1], "ingredients": {"terracotta": 8, "blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x polished_blackstone_wall, 3x black_concrete_powder, 3x gray_dye", "id": "textcraft.train.871", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_wall": 2, "black_concrete_powder": 3, "gray_dye": 3}, "initial_inventory": {"blackstone": 9, "wither_rose": 3, "sand": 4, "gravel": 6, "lily_of_the_valley": 2, "basalt": 1, "stripped_acacia_log": 1, "blue_orchid": 3}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_wall", 1], "ingredients": {"polished_blackstone": 6}, "result_count": 6}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_concrete_powder", 1], "ingredients": {"black_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_dye", 2], "ingredients": {"lily_of_the_valley": 2}, "result_count": 2}, {"action": "craft", "target": ["gray_dye", 2], "ingredients": {"black_dye": 2, "white_dye": 2}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x orange_dye, 1x yellow_banner, 2x polished_diorite_slab", "id": "textcraft.train.872", "max_steps": 50, "misc": {"target_items": {"orange_dye": 3, "yellow_banner": 1, "polished_diorite_slab": 2}, "initial_inventory": {"orange_tulip": 4, "dandelion": 8, "string": 36, "acacia_log": 1, "cobblestone": 6, "quartz": 4, "red_tulip": 2, "white_tulip": 5}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 3], "ingredients": {"orange_tulip": 3}, "result_count": 3}, {"action": "craft", "target": ["yellow_dye", 6], "ingredients": {"dandelion": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["yellow_wool", 6], "ingredients": {"yellow_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["yellow_banner", 1], "ingredients": {"yellow_wool": 6, "stick": 1}, "result_count": 1}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite_slab", 1], "ingredients": {"polished_diorite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x writable_book, 2x pink_dye, 3x nether_brick_slab", "id": "textcraft.train.873", "max_steps": 50, "misc": {"target_items": {"writable_book": 2, "pink_dye": 2, "nether_brick_slab": 3}, "initial_inventory": {"sugar_cane": 8, "rabbit_hide": 8, "ink_sac": 3, "feather": 2, "pink_tulip": 2, "nether_brick": 14, "dirt": 5, "flint": 4}, "gold_trajectory": [{"action": "craft", "target": ["paper", 2], "ingredients": {"sugar_cane": 6}, "result_count": 6}, {"action": "craft", "target": ["leather", 2], "ingredients": {"rabbit_hide": 8}, "result_count": 2}, {"action": "craft", "target": ["book", 2], "ingredients": {"paper": 6, "leather": 2}, "result_count": 2}, {"action": "craft", "target": ["writable_book", 2], "ingredients": {"book": 2, "ink_sac": 2, "feather": 2}, "result_count": 2}, {"action": "craft", "target": ["pink_dye", 2], "ingredients": {"pink_tulip": 2}, "result_count": 2}, {"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x polished_blackstone_button", "id": "textcraft.train.874", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_button": 1}, "initial_inventory": {"blackstone": 4, "nether_star": 1, "sunflower": 3}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_button", 1], "ingredients": {"polished_blackstone": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x quartz_pillar", "id": "textcraft.train.875", "max_steps": 50, "misc": {"target_items": {"quartz_pillar": 2}, "initial_inventory": {"quartz": 12, "dirt": 3, "cobblestone": 4, "birch_log": 5}, "gold_trajectory": [{"action": "craft", "target": ["quartz_block", 2], "ingredients": {"quartz": 8}, "result_count": 2}, {"action": "craft", "target": ["quartz_pillar", 1], "ingredients": {"quartz_block": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x brick_stairs, 2x brown_carpet, 1x gray_concrete_powder", "id": "textcraft.train.876", "max_steps": 50, "misc": {"target_items": {"brick_stairs": 3, "brown_carpet": 2, "gray_concrete_powder": 1}, "initial_inventory": {"brick": 36, "cocoa_beans": 3, "string": 12, "wither_rose": 2, "lily_of_the_valley": 1, "sand": 6, "gravel": 4, "dirt": 5, "warped_stem": 1, "cornflower": 4}, "gold_trajectory": [{"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_stairs", 1], "ingredients": {"bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["brown_dye", 2], "ingredients": {"cocoa_beans": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["brown_wool", 2], "ingredients": {"brown_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["brown_carpet", 1], "ingredients": {"brown_wool": 2}, "result_count": 3}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_concrete_powder", 1], "ingredients": {"gray_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x black_banner, 3x dark_oak_fence_gate", "id": "textcraft.train.877", "max_steps": 50, "misc": {"target_items": {"black_banner": 3, "dark_oak_fence_gate": 3}, "initial_inventory": {"wither_rose": 20, "string": 72, "acacia_log": 3, "dark_oak_log": 2, "popped_chorus_fruit": 2, "wither_skeleton_skull": 3, "allium": 5, "glass": 2}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 18], "ingredients": {"wither_rose": 18}, "result_count": 18}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["black_wool", 18], "ingredients": {"black_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["black_banner", 3], "ingredients": {"black_wool": 18, "stick": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["dark_oak_planks", 2], "ingredients": {"dark_oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["dark_oak_fence_gate", 3], "ingredients": {"stick": 12, "dark_oak_planks": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x brown_concrete_powder", "id": "textcraft.train.878", "max_steps": 50, "misc": {"target_items": {"brown_concrete_powder": 2}, "initial_inventory": {"cocoa_beans": 1, "sand": 5, "gravel": 4, "honeycomb": 5, "enchanted_golden_apple": 5, "vine": 1}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_concrete_powder", 1], "ingredients": {"brown_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x mossy_stone_brick_stairs, 3x orange_terracotta, 3x lime_concrete_powder", "id": "textcraft.train.879", "max_steps": 50, "misc": {"target_items": {"mossy_stone_brick_stairs": 1, "orange_terracotta": 3, "lime_concrete_powder": 3}, "initial_inventory": {"stone": 12, "vine": 6, "terracotta": 8, "orange_tulip": 2, "green_dye": 2, "lily_of_the_valley": 2, "sand": 4, "gravel": 5, "honeycomb": 2, "stripped_acacia_log": 5, "melon_slice": 5, "obsidian": 4, "nether_wart": 2}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["mossy_stone_bricks", 6], "ingredients": {"stone_bricks": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_stone_brick_stairs", 1], "ingredients": {"mossy_stone_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_terracotta", 1], "ingredients": {"terracotta": 8, "orange_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_concrete_powder", 1], "ingredients": {"lime_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x cut_red_sandstone_slab", "id": "textcraft.train.880", "max_steps": 50, "misc": {"target_items": {"cut_red_sandstone_slab": 2}, "initial_inventory": {"red_sand": 17, "stripped_oak_log": 1, "warped_fungus": 5, "prismarine_crystals": 4, "stripped_acacia_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["red_sandstone", 4], "ingredients": {"red_sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone", 1], "ingredients": {"red_sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone_slab", 1], "ingredients": {"cut_red_sandstone": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x armor_stand", "id": "textcraft.train.881", "max_steps": 50, "misc": {"target_items": {"armor_stand": 1}, "initial_inventory": {"acacia_log": 1, "smooth_stone": 3, "lilac": 4, "nautilus_shell": 5, "cobblestone": 1, "rabbit_hide": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["smooth_stone_slab", 1], "ingredients": {"smooth_stone": 3}, "result_count": 6}, {"action": "craft", "target": ["armor_stand", 1], "ingredients": {"stick": 6, "smooth_stone_slab": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x dark_oak_fence_gate, 2x black_carpet", "id": "textcraft.train.882", "max_steps": 50, "misc": {"target_items": {"dark_oak_fence_gate": 2, "black_carpet": 2}, "initial_inventory": {"acacia_log": 2, "dark_oak_log": 1, "wither_rose": 2, "string": 11, "shulker_shell": 2, "smooth_sandstone": 5, "dandelion": 1, "feather": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["dark_oak_planks", 1], "ingredients": {"dark_oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_fence_gate", 2], "ingredients": {"stick": 8, "dark_oak_planks": 4}, "result_count": 2}, {"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["black_wool", 2], "ingredients": {"black_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["black_carpet", 1], "ingredients": {"black_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x polished_blackstone_button", "id": "textcraft.train.883", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_button": 3}, "initial_inventory": {"blackstone": 4, "red_sand": 4, "orange_tulip": 1, "smooth_stone": 5, "prismarine_shard": 1, "gravel": 5}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_button", 3], "ingredients": {"polished_blackstone": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x brick_slab, 3x andesite_stairs, 1x quartz_pillar", "id": "textcraft.train.884", "max_steps": 50, "misc": {"target_items": {"brick_slab": 2, "andesite_stairs": 3, "quartz_pillar": 1}, "initial_inventory": {"brick": 13, "cobblestone": 9, "quartz": 15, "nether_star": 5, "stripped_spruce_log": 5, "white_tulip": 2}, "gold_trajectory": [{"action": "craft", "target": ["bricks", 3], "ingredients": {"brick": 12}, "result_count": 3}, {"action": "craft", "target": ["brick_slab", 1], "ingredients": {"bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 3], "ingredients": {"diorite": 3, "cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["andesite_stairs", 1], "ingredients": {"andesite": 6}, "result_count": 4}, {"action": "craft", "target": ["quartz_block", 2], "ingredients": {"quartz": 8}, "result_count": 2}, {"action": "craft", "target": ["quartz_pillar", 1], "ingredients": {"quartz_block": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x white_bed, 3x black_carpet, 1x orange_bed", "id": "textcraft.train.885", "max_steps": 50, "misc": {"target_items": {"white_bed": 1, "black_carpet": 3, "orange_bed": 1}, "initial_inventory": {"string": 48, "acacia_log": 3, "wither_rose": 2, "orange_tulip": 4, "honeycomb": 3, "smooth_stone": 5, "warped_fungus": 3, "melon_slice": 4, "cobblestone": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["white_bed", 1], "ingredients": {"white_wool": 3, "acacia_planks": 3}, "result_count": 1}, {"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["black_wool", 2], "ingredients": {"black_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["black_carpet", 1], "ingredients": {"black_wool": 2}, "result_count": 3}, {"action": "craft", "target": ["orange_dye", 3], "ingredients": {"orange_tulip": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["orange_wool", 3], "ingredients": {"orange_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["orange_bed", 1], "ingredients": {"orange_wool": 3, "acacia_planks": 3}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x stone_brick_stairs, 3x jack_o_lantern", "id": "textcraft.train.886", "max_steps": 50, "misc": {"target_items": {"stone_brick_stairs": 1, "jack_o_lantern": 3}, "initial_inventory": {"stone": 9, "carved_pumpkin": 4, "acacia_log": 1, "cooked_rabbit": 1, "crying_obsidian": 2, "green_dye": 2, "smooth_stone": 1}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["stone_brick_stairs", 1], "ingredients": {"stone_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}, {"action": "craft", "target": ["jack_o_lantern", 3], "ingredients": {"carved_pumpkin": 3, "torch": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x prismarine_wall, 3x stone_brick_stairs", "id": "textcraft.train.887", "max_steps": 50, "misc": {"target_items": {"prismarine_wall": 3, "stone_brick_stairs": 3}, "initial_inventory": {"prismarine_shard": 24, "stone": 8, "spruce_log": 5, "blackstone": 3, "dandelion": 1}, "gold_trajectory": [{"action": "craft", "target": ["prismarine", 6], "ingredients": {"prismarine_shard": 24}, "result_count": 6}, {"action": "craft", "target": ["prismarine_wall", 1], "ingredients": {"prismarine": 6}, "result_count": 6}, {"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["stone_brick_stairs", 1], "ingredients": {"stone_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x leather_boots, 3x mossy_stone_brick_wall, 3x cut_red_sandstone_slab", "id": "textcraft.train.888", "max_steps": 50, "misc": {"target_items": {"leather_boots": 2, "mossy_stone_brick_wall": 3, "cut_red_sandstone_slab": 3}, "initial_inventory": {"rabbit_hide": 39, "stone": 12, "vine": 9, "red_sand": 20, "stripped_warped_stem": 3, "nether_brick": 2}, "gold_trajectory": [{"action": "craft", "target": ["leather", 8], "ingredients": {"rabbit_hide": 32}, "result_count": 8}, {"action": "craft", "target": ["leather_boots", 2], "ingredients": {"leather": 8}, "result_count": 2}, {"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["mossy_stone_bricks", 6], "ingredients": {"stone_bricks": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_stone_brick_wall", 1], "ingredients": {"mossy_stone_bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["red_sandstone", 4], "ingredients": {"red_sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone", 1], "ingredients": {"red_sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone_slab", 1], "ingredients": {"cut_red_sandstone": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x leather_leggings, 3x polished_blackstone_bricks", "id": "textcraft.train.889", "max_steps": 50, "misc": {"target_items": {"leather_leggings": 1, "polished_blackstone_bricks": 3}, "initial_inventory": {"rabbit_hide": 42, "blackstone": 6, "ice": 2, "warped_stem": 3, "red_tulip": 3, "end_stone": 5}, "gold_trajectory": [{"action": "craft", "target": ["leather", 7], "ingredients": {"rabbit_hide": 28}, "result_count": 7}, {"action": "craft", "target": ["leather_leggings", 1], "ingredients": {"leather": 7}, "result_count": 1}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_bricks", 1], "ingredients": {"polished_blackstone": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x mossy_cobblestone_wall, 3x white_concrete_powder", "id": "textcraft.train.890", "max_steps": 50, "misc": {"target_items": {"mossy_cobblestone_wall": 2, "white_concrete_powder": 3}, "initial_inventory": {"cobblestone": 8, "vine": 9, "lily_of_the_valley": 2, "sand": 6, "gravel": 4, "apple": 1, "feather": 1, "rabbit_hide": 4, "creeper_head": 4, "ice": 1}, "gold_trajectory": [{"action": "craft", "target": ["mossy_cobblestone", 6], "ingredients": {"cobblestone": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_cobblestone_wall", 1], "ingredients": {"mossy_cobblestone": 6}, "result_count": 6}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_concrete_powder", 1], "ingredients": {"white_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x brick_stairs", "id": "textcraft.train.891", "max_steps": 50, "misc": {"target_items": {"brick_stairs": 3}, "initial_inventory": {"brick": 36, "cocoa_beans": 3, "prismarine_shard": 1, "carved_pumpkin": 2}, "gold_trajectory": [{"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_stairs", 1], "ingredients": {"bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x wooden_sword, 1x leather_helmet", "id": "textcraft.train.892", "max_steps": 50, "misc": {"target_items": {"wooden_sword": 2, "leather_helmet": 1}, "initial_inventory": {"acacia_log": 2, "rabbit_hide": 26, "warped_planks": 5, "cocoa_beans": 5, "green_dye": 3, "cooked_rabbit": 3, "crying_obsidian": 4}, "gold_trajectory": [{"action": "craft", "target": ["stick", 1], "ingredients": {"warped_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_sword", 2], "ingredients": {"acacia_planks": 4, "stick": 2}, "result_count": 2}, {"action": "craft", "target": ["leather", 5], "ingredients": {"rabbit_hide": 20}, "result_count": 5}, {"action": "craft", "target": ["leather_helmet", 1], "ingredients": {"leather": 5}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x blue_ice", "id": "textcraft.train.893", "max_steps": 50, "misc": {"target_items": {"blue_ice": 1}, "initial_inventory": {"ice": 101, "obsidian": 5, "blaze_rod": 4, "baked_potato": 3, "cocoa_beans": 2}, "gold_trajectory": [{"action": "craft", "target": ["packed_ice", 9], "ingredients": {"ice": 81}, "result_count": 9}, {"action": "craft", "target": ["blue_ice", 1], "ingredients": {"packed_ice": 9}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x chiseled_nether_bricks, 2x yellow_terracotta", "id": "textcraft.train.894", "max_steps": 50, "misc": {"target_items": {"chiseled_nether_bricks": 2, "yellow_terracotta": 2}, "initial_inventory": {"nether_brick": 16, "terracotta": 10, "dandelion": 2, "milk_bucket": 2, "blaze_rod": 3, "cooked_rabbit": 1}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_nether_bricks", 2], "ingredients": {"nether_brick_slab": 4}, "result_count": 2}, {"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_terracotta", 1], "ingredients": {"terracotta": 8, "yellow_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x wooden_axe", "id": "textcraft.train.895", "max_steps": 50, "misc": {"target_items": {"wooden_axe": 1}, "initial_inventory": {"acacia_log": 3, "acacia_planks": 4, "baked_potato": 3, "heart_of_the_sea": 3}, "gold_trajectory": [{"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["wooden_axe", 1], "ingredients": {"tag:planks": 3, "stick": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x chiseled_nether_bricks, 2x green_carpet", "id": "textcraft.train.896", "max_steps": 50, "misc": {"target_items": {"chiseled_nether_bricks": 1, "green_carpet": 2}, "initial_inventory": {"nether_brick": 15, "string": 31, "green_dye": 2, "bamboo": 2, "ink_sac": 3, "stripped_oak_log": 2, "gravel": 2}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_nether_bricks", 1], "ingredients": {"nether_brick_slab": 2}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["green_carpet", 1], "ingredients": {"white_carpet": 8, "green_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x yellow_concrete_powder, 1x wooden_axe", "id": "textcraft.train.897", "max_steps": 50, "misc": {"target_items": {"yellow_concrete_powder": 1, "wooden_axe": 1}, "initial_inventory": {"dandelion": 1, "sand": 4, "gravel": 6, "acacia_log": 2, "spruce_planks": 3, "prismarine_shard": 2, "enchanted_golden_apple": 5}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_concrete_powder", 1], "ingredients": {"yellow_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"spruce_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_axe", 1], "ingredients": {"acacia_planks": 3, "stick": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x dark_oak_sign, 2x red_bed, 3x polished_andesite_slab", "id": "textcraft.train.898", "max_steps": 50, "misc": {"target_items": {"dark_oak_sign": 3, "red_bed": 2, "polished_andesite_slab": 3}, "initial_inventory": {"dark_oak_log": 2, "acacia_log": 3, "rose_bush": 4, "string": 36, "cobblestone": 4, "quartz": 3, "popped_chorus_fruit": 1, "brick": 5, "blaze_rod": 2, "lily_of_the_valley": 1}, "gold_trajectory": [{"action": "craft", "target": ["dark_oak_planks", 2], "ingredients": {"dark_oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"dark_oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_sign", 1], "ingredients": {"dark_oak_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["red_dye", 3], "ingredients": {"rose_bush": 3}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["red_wool", 6], "ingredients": {"red_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["red_bed", 2], "ingredients": {"red_wool": 6, "acacia_planks": 6}, "result_count": 2}, {"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["andesite", 2], "ingredients": {"diorite": 2, "cobblestone": 2}, "result_count": 4}, {"action": "craft", "target": ["polished_andesite", 1], "ingredients": {"andesite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_andesite_slab", 1], "ingredients": {"polished_andesite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x black_stained_glass_pane", "id": "textcraft.train.899", "max_steps": 50, "misc": {"target_items": {"black_stained_glass_pane": 2}, "initial_inventory": {"glass": 10, "wither_rose": 2, "scute": 2, "smooth_quartz": 2, "red_mushroom": 5, "carved_pumpkin": 1}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_stained_glass", 1], "ingredients": {"glass": 8, "black_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["black_stained_glass_pane", 1], "ingredients": {"black_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 2x lime_stained_glass, 3x acacia_fence, 1x gray_wool", "id": "textcraft.train.900", "max_steps": 50, "misc": {"target_items": {"lime_stained_glass": 2, "acacia_fence": 3, "gray_wool": 1}, "initial_inventory": {"glass": 10, "green_dye": 1, "lily_of_the_valley": 2, "acacia_log": 3, "wither_rose": 1, "string": 6, "oxeye_daisy": 4, "stripped_birch_log": 3, "carved_pumpkin": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_stained_glass", 1], "ingredients": {"glass": 8, "lime_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["acacia_fence", 1], "ingredients": {"acacia_planks": 4, "stick": 2}, "result_count": 3}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["gray_wool", 1], "ingredients": {"gray_dye": 1, "white_wool": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x orange_bed, 2x oak_fence_gate", "id": "textcraft.train.901", "max_steps": 50, "misc": {"target_items": {"orange_bed": 3, "oak_fence_gate": 2}, "initial_inventory": {"orange_tulip": 13, "string": 50, "acacia_log": 6, "oak_log": 2, "warped_planks": 4, "ender_pearl": 4, "heart_of_the_sea": 5, "sugar_cane": 5, "stripped_crimson_stem": 5}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 9], "ingredients": {"orange_tulip": 9}, "result_count": 9}, {"action": "craft", "target": ["white_wool", 9], "ingredients": {"string": 36}, "result_count": 9}, {"action": "craft", "target": ["orange_wool", 9], "ingredients": {"orange_dye": 9, "white_wool": 9}, "result_count": 9}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["orange_bed", 3], "ingredients": {"orange_wool": 9, "tag:planks": 9}, "result_count": 3}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["oak_planks", 1], "ingredients": {"oak_log": 1}, "result_count": 4}, {"action": "craft", "target": ["oak_fence_gate", 2], "ingredients": {"stick": 8, "oak_planks": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x green_wool", "id": "textcraft.train.902", "max_steps": 50, "misc": {"target_items": {"green_wool": 1}, "initial_inventory": {"green_dye": 2, "string": 6, "stripped_birch_log": 3, "end_stone": 3, "melon_slice": 4, "gunpowder": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["green_wool", 1], "ingredients": {"green_dye": 1, "white_wool": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x blue_ice, 1x book, 3x acacia_fence_gate", "id": "textcraft.train.903", "max_steps": 50, "misc": {"target_items": {"blue_ice": 2, "book": 1, "acacia_fence_gate": 3}, "initial_inventory": {"ice": 202, "sugar_cane": 4, "rabbit_hide": 4, "acacia_log": 4, "sunflower": 5, "ghast_tear": 5, "smooth_quartz": 5, "end_stone": 5, "stone": 1}, "gold_trajectory": [{"action": "craft", "target": ["packed_ice", 18], "ingredients": {"ice": 162}, "result_count": 18}, {"action": "craft", "target": ["blue_ice", 2], "ingredients": {"packed_ice": 18}, "result_count": 2}, {"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["leather", 1], "ingredients": {"rabbit_hide": 4}, "result_count": 1}, {"action": "craft", "target": ["book", 1], "ingredients": {"paper": 3, "leather": 1}, "result_count": 1}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["acacia_fence_gate", 3], "ingredients": {"stick": 12, "acacia_planks": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x white_bed", "id": "textcraft.train.904", "max_steps": 50, "misc": {"target_items": {"white_bed": 2}, "initial_inventory": {"string": 24, "acacia_log": 2, "spider_eye": 4, "melon_slice": 4, "terracotta": 3, "pink_tulip": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["white_bed", 2], "ingredients": {"white_wool": 6, "acacia_planks": 6}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x prismarine_brick_stairs, 3x purple_wool", "id": "textcraft.train.905", "max_steps": 50, "misc": {"target_items": {"prismarine_brick_stairs": 3, "purple_wool": 3}, "initial_inventory": {"prismarine_shard": 55, "cornflower": 2, "rose_bush": 1, "string": 15, "lilac": 4, "snowball": 2, "wither_skeleton_skull": 5, "nether_brick": 4, "orange_tulip": 1}, "gold_trajectory": [{"action": "craft", "target": ["prismarine_bricks", 6], "ingredients": {"prismarine_shard": 54}, "result_count": 6}, {"action": "craft", "target": ["prismarine_brick_stairs", 1], "ingredients": {"prismarine_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 2], "ingredients": {"blue_dye": 2, "red_dye": 2}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["purple_wool", 3], "ingredients": {"purple_dye": 3, "white_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x fire_charge, 3x wooden_sword", "id": "textcraft.train.906", "max_steps": 50, "misc": {"target_items": {"fire_charge": 1, "wooden_sword": 3}, "initial_inventory": {"gunpowder": 1, "blaze_rod": 2, "acacia_log": 4, "terracotta": 4, "bone": 1, "sand": 5, "pink_tulip": 4}, "gold_trajectory": [{"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["fire_charge", 1], "ingredients": {"gunpowder": 1, "blaze_powder": 1}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_sword", 3], "ingredients": {"acacia_planks": 6, "stick": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x black_stained_glass, 1x leather_boots", "id": "textcraft.train.907", "max_steps": 50, "misc": {"target_items": {"black_stained_glass": 2, "leather_boots": 1}, "initial_inventory": {"glass": 8, "wither_rose": 1, "rabbit_hide": 24, "baked_potato": 4, "spider_eye": 1}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_stained_glass", 1], "ingredients": {"glass": 8, "black_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["leather", 4], "ingredients": {"rabbit_hide": 16}, "result_count": 4}, {"action": "craft", "target": ["leather_boots", 1], "ingredients": {"leather": 4}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x birch_sign, 1x granite_wall", "id": "textcraft.train.908", "max_steps": 50, "misc": {"target_items": {"birch_sign": 2, "granite_wall": 1}, "initial_inventory": {"birch_log": 3, "acacia_log": 1, "cobblestone": 6, "quartz": 14, "nether_wart": 3, "smooth_stone": 1, "rabbit_hide": 5}, "gold_trajectory": [{"action": "craft", "target": ["birch_planks", 2], "ingredients": {"birch_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"birch_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["birch_sign", 1], "ingredients": {"birch_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_wall", 1], "ingredients": {"granite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x fishing_rod, 2x purple_terracotta, 3x orange_wool", "id": "textcraft.train.909", "max_steps": 50, "misc": {"target_items": {"fishing_rod": 3, "purple_terracotta": 2, "orange_wool": 3}, "initial_inventory": {"acacia_log": 2, "string": 24, "terracotta": 11, "cornflower": 2, "rose_bush": 2, "orange_tulip": 3, "stripped_acacia_log": 5, "stripped_dark_oak_log": 3, "obsidian": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["fishing_rod", 3], "ingredients": {"stick": 9, "string": 6}, "result_count": 3}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_terracotta", 1], "ingredients": {"terracotta": 8, "purple_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["orange_dye", 3], "ingredients": {"orange_tulip": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["orange_wool", 3], "ingredients": {"orange_dye": 3, "white_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x prismarine_slab, 2x yellow_bed, 2x blue_concrete_powder", "id": "textcraft.train.910", "max_steps": 50, "misc": {"target_items": {"prismarine_slab": 1, "yellow_bed": 2, "blue_concrete_powder": 2}, "initial_inventory": {"prismarine_shard": 13, "dandelion": 6, "string": 34, "acacia_log": 3, "cornflower": 1, "sand": 4, "gravel": 5, "ender_pearl": 1, "popped_chorus_fruit": 3, "melon_slice": 5, "stripped_spruce_log": 5}, "gold_trajectory": [{"action": "craft", "target": ["prismarine", 3], "ingredients": {"prismarine_shard": 12}, "result_count": 3}, {"action": "craft", "target": ["prismarine_slab", 1], "ingredients": {"prismarine": 3}, "result_count": 6}, {"action": "craft", "target": ["yellow_dye", 6], "ingredients": {"dandelion": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["yellow_wool", 6], "ingredients": {"yellow_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["yellow_bed", 2], "ingredients": {"yellow_wool": 6, "acacia_planks": 6}, "result_count": 2}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_concrete_powder", 1], "ingredients": {"blue_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x polished_blackstone_pressure_plate", "id": "textcraft.train.911", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_pressure_plate": 2}, "initial_inventory": {"blackstone": 4, "jungle_log": 3, "birch_log": 2, "cobblestone": 2, "spider_eye": 4, "brick": 4}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_pressure_plate", 2], "ingredients": {"polished_blackstone": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x white_concrete_powder, 2x red_banner", "id": "textcraft.train.912", "max_steps": 50, "misc": {"target_items": {"white_concrete_powder": 3, "red_banner": 2}, "initial_inventory": {"lily_of_the_valley": 1, "sand": 4, "gravel": 6, "rose_bush": 7, "string": 60, "acacia_log": 1, "stripped_birch_log": 2, "sunflower": 3, "terracotta": 2, "quartz": 1}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_concrete_powder", 1], "ingredients": {"white_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["red_dye", 6], "ingredients": {"rose_bush": 6}, "result_count": 12}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["red_wool", 12], "ingredients": {"red_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["red_banner", 2], "ingredients": {"red_wool": 12, "stick": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x brown_banner, 2x orange_banner, 1x stone_brick_wall", "id": "textcraft.train.913", "max_steps": 50, "misc": {"target_items": {"brown_banner": 2, "orange_banner": 2, "stone_brick_wall": 1}, "initial_inventory": {"cocoa_beans": 12, "string": 113, "acacia_log": 3, "orange_tulip": 12, "stone": 8, "vine": 4, "prismarine_shard": 5}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 12], "ingredients": {"cocoa_beans": 12}, "result_count": 12}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["brown_wool", 12], "ingredients": {"brown_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["brown_banner", 2], "ingredients": {"brown_wool": 12, "stick": 2}, "result_count": 2}, {"action": "craft", "target": ["orange_dye", 12], "ingredients": {"orange_tulip": 12}, "result_count": 12}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["orange_wool", 12], "ingredients": {"orange_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["orange_banner", 2], "ingredients": {"orange_wool": 12, "stick": 2}, "result_count": 2}, {"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["stone_brick_wall", 1], "ingredients": {"stone_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x red_sandstone_wall", "id": "textcraft.train.914", "max_steps": 50, "misc": {"target_items": {"red_sandstone_wall": 1}, "initial_inventory": {"red_sand": 26, "wither_skeleton_skull": 4, "snowball": 5, "cobblestone": 5, "bamboo": 2}, "gold_trajectory": [{"action": "craft", "target": ["red_sandstone", 6], "ingredients": {"red_sand": 24}, "result_count": 6}, {"action": "craft", "target": ["red_sandstone_wall", 1], "ingredients": {"red_sandstone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x yellow_carpet, 2x birch_sign", "id": "textcraft.train.915", "max_steps": 50, "misc": {"target_items": {"yellow_carpet": 1, "birch_sign": 2}, "initial_inventory": {"dandelion": 2, "string": 10, "birch_log": 2, "acacia_log": 1, "end_stone": 1, "stripped_dark_oak_log": 5, "carved_pumpkin": 1, "allium": 3, "oxeye_daisy": 5}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 2], "ingredients": {"dandelion": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["yellow_wool", 2], "ingredients": {"yellow_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["yellow_carpet", 1], "ingredients": {"yellow_wool": 2}, "result_count": 3}, {"action": "craft", "target": ["birch_planks", 2], "ingredients": {"birch_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"birch_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["birch_sign", 1], "ingredients": {"birch_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x andesite", "id": "textcraft.train.916", "max_steps": 50, "misc": {"target_items": {"andesite": 2}, "initial_inventory": {"cobblestone": 4, "quartz": 2, "basalt": 1, "crying_obsidian": 5}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["andesite", 1], "ingredients": {"diorite": 1, "cobblestone": 1}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x lime_dye, 3x crimson_sign", "id": "textcraft.train.917", "max_steps": 50, "misc": {"target_items": {"lime_dye": 2, "crimson_sign": 3}, "initial_inventory": {"green_dye": 1, "lily_of_the_valley": 1, "crimson_stem": 3, "acacia_log": 1, "wither_skeleton_skull": 5, "snowball": 1, "rose_bush": 4, "bamboo": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["crimson_planks", 2], "ingredients": {"crimson_stem": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"crimson_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["crimson_sign", 1], "ingredients": {"crimson_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x yellow_bed", "id": "textcraft.train.918", "max_steps": 50, "misc": {"target_items": {"yellow_bed": 2}, "initial_inventory": {"dandelion": 6, "string": 24, "acacia_log": 3, "obsidian": 4, "egg": 2, "prismarine_crystals": 1}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 6], "ingredients": {"dandelion": 6}, "result_count": 6}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["yellow_wool", 6], "ingredients": {"yellow_dye": 6, "white_wool": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["yellow_bed", 2], "ingredients": {"yellow_wool": 6, "acacia_planks": 6}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x polished_granite_slab", "id": "textcraft.train.919", "max_steps": 50, "misc": {"target_items": {"polished_granite_slab": 2}, "initial_inventory": {"cobblestone": 5, "quartz": 9, "wither_rose": 1, "blackstone": 3, "vine": 3}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 4], "ingredients": {"diorite": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite", 1], "ingredients": {"granite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite_slab", 1], "ingredients": {"polished_granite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x spruce_sign, 3x brick_stairs, 1x grindstone", "id": "textcraft.train.920", "max_steps": 50, "misc": {"target_items": {"spruce_sign": 1, "brick_stairs": 3, "grindstone": 1}, "initial_inventory": {"spruce_log": 2, "acacia_log": 4, "brick": 24, "stone": 4, "nether_star": 2, "orange_tulip": 1, "flint": 2, "ink_sac": 3}, "gold_trajectory": [{"action": "craft", "target": ["spruce_planks", 2], "ingredients": {"spruce_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"spruce_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["spruce_sign", 1], "ingredients": {"spruce_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_stairs", 1], "ingredients": {"bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["stone_slab", 1], "ingredients": {"stone": 3}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["grindstone", 1], "ingredients": {"stick": 2, "stone_slab": 1, "acacia_planks": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x light_blue_stained_glass, 1x skull_banner_pattern", "id": "textcraft.train.921", "max_steps": 50, "misc": {"target_items": {"light_blue_stained_glass": 2, "skull_banner_pattern": 1}, "initial_inventory": {"glass": 8, "cornflower": 2, "lily_of_the_valley": 1, "sugar_cane": 3, "wither_skeleton_skull": 2, "spider_eye": 5, "spruce_log": 1, "flint": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_stained_glass", 1], "ingredients": {"glass": 8, "light_blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["skull_banner_pattern", 1], "ingredients": {"paper": 1, "wither_skeleton_skull": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x red_stained_glass", "id": "textcraft.train.922", "max_steps": 50, "misc": {"target_items": {"red_stained_glass": 1}, "initial_inventory": {"glass": 11, "rose_bush": 2, "end_stone": 2, "stripped_crimson_stem": 4, "orange_tulip": 1, "feather": 4}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_stained_glass", 1], "ingredients": {"glass": 8, "red_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x green_stained_glass_pane, 1x brown_wool, 2x orange_carpet", "id": "textcraft.train.923", "max_steps": 50, "misc": {"target_items": {"green_stained_glass_pane": 3, "brown_wool": 1, "orange_carpet": 2}, "initial_inventory": {"glass": 8, "green_dye": 2, "cocoa_beans": 2, "string": 29, "orange_tulip": 2, "stripped_crimson_stem": 1, "sand": 5}, "gold_trajectory": [{"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["green_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "green_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["brown_wool", 1], "ingredients": {"brown_dye": 1, "white_wool": 1}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_carpet", 1], "ingredients": {"white_carpet": 8, "orange_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x lime_terracotta, 2x blue_ice, 1x diorite_stairs", "id": "textcraft.train.924", "max_steps": 50, "misc": {"target_items": {"lime_terracotta": 2, "blue_ice": 2, "diorite_stairs": 1}, "initial_inventory": {"terracotta": 8, "green_dye": 2, "lily_of_the_valley": 2, "ice": 220, "cobblestone": 8, "quartz": 6, "jungle_log": 5, "egg": 5, "dirt": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_terracotta", 1], "ingredients": {"terracotta": 8, "lime_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["packed_ice", 18], "ingredients": {"ice": 162}, "result_count": 18}, {"action": "craft", "target": ["blue_ice", 2], "ingredients": {"packed_ice": 18}, "result_count": 2}, {"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_stairs", 1], "ingredients": {"diorite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x blue_concrete_powder", "id": "textcraft.train.925", "max_steps": 50, "misc": {"target_items": {"blue_concrete_powder": 2}, "initial_inventory": {"cornflower": 1, "sand": 4, "gravel": 5, "sunflower": 1, "green_dye": 5, "nautilus_shell": 5, "beetroot": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_concrete_powder", 1], "ingredients": {"blue_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x diorite_wall, 1x acacia_sign", "id": "textcraft.train.926", "max_steps": 50, "misc": {"target_items": {"diorite_wall": 1, "acacia_sign": 1}, "initial_inventory": {"cobblestone": 6, "quartz": 7, "acacia_log": 3, "popped_chorus_fruit": 4, "pumpkin": 2, "oak_log": 3}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_wall", 1], "ingredients": {"diorite": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_sign", 1], "ingredients": {"acacia_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x blue_stained_glass, 1x brown_stained_glass_pane, 2x brick_wall", "id": "textcraft.train.927", "max_steps": 50, "misc": {"target_items": {"blue_stained_glass": 1, "brown_stained_glass_pane": 1, "brick_wall": 2}, "initial_inventory": {"glass": 17, "cornflower": 2, "cocoa_beans": 1, "brick": 24, "red_tulip": 5, "prismarine_crystals": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_stained_glass", 1], "ingredients": {"glass": 8, "blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_stained_glass", 1], "ingredients": {"glass": 8, "brown_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["brown_stained_glass_pane", 1], "ingredients": {"brown_stained_glass": 6}, "result_count": 16}, {"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_wall", 1], "ingredients": {"bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x snow, 2x cyan_stained_glass", "id": "textcraft.train.928", "max_steps": 50, "misc": {"target_items": {"snow": 3, "cyan_stained_glass": 2}, "initial_inventory": {"snowball": 15, "glass": 10, "cornflower": 2, "green_dye": 1, "carved_pumpkin": 1, "milk_bucket": 5}, "gold_trajectory": [{"action": "craft", "target": ["snow_block", 3], "ingredients": {"snowball": 12}, "result_count": 3}, {"action": "craft", "target": ["snow", 1], "ingredients": {"snow_block": 3}, "result_count": 6}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_stained_glass", 1], "ingredients": {"glass": 8, "cyan_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x orange_bed, 2x white_carpet, 1x birch_fence_gate", "id": "textcraft.train.929", "max_steps": 50, "misc": {"target_items": {"orange_bed": 1, "white_carpet": 2, "birch_fence_gate": 1}, "initial_inventory": {"orange_tulip": 3, "string": 23, "acacia_log": 3, "birch_log": 1, "birch_planks": 2, "egg": 5, "brown_mushroom": 3, "prismarine_shard": 3, "heart_of_the_sea": 5}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 3], "ingredients": {"orange_tulip": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["orange_wool", 3], "ingredients": {"orange_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["orange_bed", 1], "ingredients": {"orange_wool": 3, "acacia_planks": 3}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["white_carpet", 1], "ingredients": {"white_wool": 2}, "result_count": 3}, {"action": "craft", "target": ["stick", 1], "ingredients": {"birch_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["birch_planks", 1], "ingredients": {"birch_log": 1}, "result_count": 4}, {"action": "craft", "target": ["birch_fence_gate", 1], "ingredients": {"stick": 4, "birch_planks": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x book", "id": "textcraft.train.930", "max_steps": 50, "misc": {"target_items": {"book": 2}, "initial_inventory": {"sugar_cane": 7, "rabbit_hide": 8, "stripped_oak_log": 3, "poppy": 1, "terracotta": 3}, "gold_trajectory": [{"action": "craft", "target": ["paper", 2], "ingredients": {"sugar_cane": 6}, "result_count": 6}, {"action": "craft", "target": ["leather", 2], "ingredients": {"rabbit_hide": 8}, "result_count": 2}, {"action": "craft", "target": ["book", 2], "ingredients": {"paper": 6, "leather": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x cartography_table", "id": "textcraft.train.931", "max_steps": 50, "misc": {"target_items": {"cartography_table": 1}, "initial_inventory": {"sugar_cane": 4, "acacia_log": 2, "snowball": 4, "smooth_quartz": 4, "string": 5, "milk_bucket": 3, "brick": 5}, "gold_trajectory": [{"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["cartography_table", 1], "ingredients": {"paper": 2, "acacia_planks": 4}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x polished_blackstone_brick_stairs, 1x polished_granite, 1x polished_blackstone_brick_wall", "id": "textcraft.train.932", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_brick_stairs": 3, "polished_granite": 1, "polished_blackstone_brick_wall": 1}, "initial_inventory": {"blackstone": 24, "cobblestone": 4, "quartz": 12, "baked_potato": 2, "birch_log": 4, "milk_bucket": 3}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_bricks", 2], "ingredients": {"polished_blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_brick_stairs", 1], "ingredients": {"polished_blackstone_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 4], "ingredients": {"diorite": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite", 1], "ingredients": {"granite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_bricks", 1], "ingredients": {"polished_blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_brick_wall", 1], "ingredients": {"polished_blackstone_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x red_nether_brick_slab", "id": "textcraft.train.933", "max_steps": 50, "misc": {"target_items": {"red_nether_brick_slab": 2}, "initial_inventory": {"nether_brick": 6, "nether_wart": 9, "prismarine_shard": 3, "baked_potato": 4, "quartz": 3, "stripped_oak_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["red_nether_bricks", 3], "ingredients": {"nether_brick": 6, "nether_wart": 6}, "result_count": 3}, {"action": "craft", "target": ["red_nether_brick_slab", 1], "ingredients": {"red_nether_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x jungle_fence_gate", "id": "textcraft.train.934", "max_steps": 50, "misc": {"target_items": {"jungle_fence_gate": 1}, "initial_inventory": {"acacia_log": 1, "jungle_log": 1, "stripped_warped_stem": 3, "sand": 5, "dirt": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["jungle_fence_gate", 1], "ingredients": {"stick": 4, "jungle_planks": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x orange_dye, 2x polished_blackstone_stairs, 3x mossy_cobblestone_wall", "id": "textcraft.train.935", "max_steps": 50, "misc": {"target_items": {"orange_dye": 1, "polished_blackstone_stairs": 2, "mossy_cobblestone_wall": 3}, "initial_inventory": {"orange_tulip": 2, "blackstone": 8, "cobblestone": 6, "vine": 6, "red_sand": 2, "cornflower": 1, "stripped_birch_log": 4, "snowball": 1}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_stairs", 1], "ingredients": {"polished_blackstone": 6}, "result_count": 4}, {"action": "craft", "target": ["mossy_cobblestone", 6], "ingredients": {"cobblestone": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_cobblestone_wall", 1], "ingredients": {"mossy_cobblestone": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x white_stained_glass_pane", "id": "textcraft.train.936", "max_steps": 50, "misc": {"target_items": {"white_stained_glass_pane": 3}, "initial_inventory": {"glass": 7, "lily_of_the_valley": 1, "egg": 1, "apple": 2, "popped_chorus_fruit": 2, "white_tulip": 4}, "gold_trajectory": [{"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "white_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x orange_stained_glass_pane, 2x red_nether_brick_stairs", "id": "textcraft.train.937", "max_steps": 50, "misc": {"target_items": {"orange_stained_glass_pane": 1, "red_nether_brick_stairs": 2}, "initial_inventory": {"glass": 11, "orange_tulip": 2, "nether_brick": 18, "nether_wart": 14, "beetroot": 3, "nether_star": 4, "apple": 1}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_stained_glass", 1], "ingredients": {"glass": 8, "orange_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["orange_stained_glass_pane", 1], "ingredients": {"orange_stained_glass": 6}, "result_count": 16}, {"action": "craft", "target": ["red_nether_bricks", 6], "ingredients": {"nether_brick": 12, "nether_wart": 12}, "result_count": 6}, {"action": "craft", "target": ["red_nether_brick_stairs", 1], "ingredients": {"red_nether_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x polished_granite_slab, 2x red_concrete_powder", "id": "textcraft.train.938", "max_steps": 50, "misc": {"target_items": {"polished_granite_slab": 1, "red_concrete_powder": 2}, "initial_inventory": {"cobblestone": 5, "quartz": 9, "rose_bush": 2, "sand": 5, "gravel": 4, "clay_ball": 1, "heart_of_the_sea": 2}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 4], "ingredients": {"diorite": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite", 1], "ingredients": {"granite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite_slab", 1], "ingredients": {"polished_granite": 3}, "result_count": 6}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_concrete_powder", 1], "ingredients": {"red_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x red_carpet", "id": "textcraft.train.939", "max_steps": 50, "misc": {"target_items": {"red_carpet": 2}, "initial_inventory": {"rose_bush": 1, "string": 10, "basalt": 3, "enchanted_golden_apple": 3, "brown_mushroom": 4, "azure_bluet": 4, "orange_tulip": 5}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["red_wool", 2], "ingredients": {"red_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["red_carpet", 1], "ingredients": {"red_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x acacia_fence", "id": "textcraft.train.940", "max_steps": 50, "misc": {"target_items": {"acacia_fence": 2}, "initial_inventory": {"acacia_log": 2, "smooth_stone": 2, "glass": 4, "smooth_sandstone": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["acacia_fence", 1], "ingredients": {"acacia_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x cyan_terracotta, 3x writable_book", "id": "textcraft.train.941", "max_steps": 50, "misc": {"target_items": {"cyan_terracotta": 2, "writable_book": 3}, "initial_inventory": {"terracotta": 11, "cornflower": 1, "green_dye": 1, "sugar_cane": 11, "rabbit_hide": 12, "ink_sac": 4, "feather": 4, "birch_log": 3, "clay_ball": 3, "bamboo": 4, "azure_bluet": 2, "shulker_shell": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_terracotta", 1], "ingredients": {"terracotta": 8, "cyan_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["paper", 3], "ingredients": {"sugar_cane": 9}, "result_count": 9}, {"action": "craft", "target": ["leather", 3], "ingredients": {"rabbit_hide": 12}, "result_count": 3}, {"action": "craft", "target": ["book", 3], "ingredients": {"paper": 9, "leather": 3}, "result_count": 3}, {"action": "craft", "target": ["writable_book", 3], "ingredients": {"book": 3, "ink_sac": 3, "feather": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x pink_stained_glass, 2x chiseled_nether_bricks", "id": "textcraft.train.942", "max_steps": 50, "misc": {"target_items": {"pink_stained_glass": 3, "chiseled_nether_bricks": 2}, "initial_inventory": {"glass": 11, "pink_tulip": 1, "nether_brick": 12, "egg": 3, "stripped_oak_log": 4, "blackstone": 5}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_stained_glass", 1], "ingredients": {"glass": 8, "pink_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_nether_bricks", 2], "ingredients": {"nether_brick_slab": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x pumpkin_pie", "id": "textcraft.train.943", "max_steps": 50, "misc": {"target_items": {"pumpkin_pie": 1}, "initial_inventory": {"pumpkin": 2, "sugar_cane": 1, "egg": 1, "crimson_stem": 2, "smooth_sandstone": 4, "quartz": 3}, "gold_trajectory": [{"action": "craft", "target": ["sugar", 1], "ingredients": {"sugar_cane": 1}, "result_count": 1}, {"action": "craft", "target": ["pumpkin_pie", 1], "ingredients": {"pumpkin": 1, "sugar": 1, "egg": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x wooden_hoe", "id": "textcraft.train.944", "max_steps": 50, "misc": {"target_items": {"wooden_hoe": 3}, "initial_inventory": {"acacia_log": 4, "apple": 1, "rabbit_hide": 5, "peony": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["wooden_hoe", 3], "ingredients": {"acacia_planks": 6, "stick": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x granite_stairs", "id": "textcraft.train.945", "max_steps": 50, "misc": {"target_items": {"granite_stairs": 1}, "initial_inventory": {"cobblestone": 7, "quartz": 12, "blue_orchid": 3, "popped_chorus_fruit": 3, "azure_bluet": 2}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_stairs", 1], "ingredients": {"granite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x bookshelf, 3x granite_stairs", "id": "textcraft.train.946", "max_steps": 50, "misc": {"target_items": {"bookshelf": 3, "granite_stairs": 3}, "initial_inventory": {"acacia_log": 7, "sugar_cane": 40, "rabbit_hide": 52, "cobblestone": 9, "quartz": 12, "popped_chorus_fruit": 2, "ghast_tear": 2}, "gold_trajectory": [{"action": "craft", "target": ["paper", 9], "ingredients": {"sugar_cane": 27}, "result_count": 27}, {"action": "craft", "target": ["leather", 9], "ingredients": {"rabbit_hide": 36}, "result_count": 9}, {"action": "craft", "target": ["book", 9], "ingredients": {"paper": 27, "leather": 9}, "result_count": 9}, {"action": "craft", "target": ["acacia_planks", 5], "ingredients": {"acacia_log": 5}, "result_count": 20}, {"action": "craft", "target": ["bookshelf", 3], "ingredients": {"acacia_planks": 18, "book": 9}, "result_count": 3}, {"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite", 6], "ingredients": {"diorite": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["granite_stairs", 1], "ingredients": {"granite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x warped_fungus_on_a_stick", "id": "textcraft.train.947", "max_steps": 50, "misc": {"target_items": {"warped_fungus_on_a_stick": 2}, "initial_inventory": {"acacia_log": 1, "string": 4, "warped_fungus": 2, "bamboo": 1, "enchanted_golden_apple": 1, "prismarine_crystals": 4, "dark_oak_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["fishing_rod", 2], "ingredients": {"stick": 6, "string": 4}, "result_count": 2}, {"action": "craft", "target": ["warped_fungus_on_a_stick", 2], "ingredients": {"fishing_rod": 2, "warped_fungus": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x diorite_slab", "id": "textcraft.train.948", "max_steps": 50, "misc": {"target_items": {"diorite_slab": 2}, "initial_inventory": {"cobblestone": 5, "quartz": 4, "rabbit_hide": 2, "vine": 1, "warped_stem": 4, "cooked_rabbit": 5}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["diorite_slab", 1], "ingredients": {"diorite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x black_concrete_powder", "id": "textcraft.train.949", "max_steps": 50, "misc": {"target_items": {"black_concrete_powder": 2}, "initial_inventory": {"wither_rose": 2, "sand": 6, "gravel": 4, "lilac": 3, "stripped_warped_stem": 1}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_concrete_powder", 1], "ingredients": {"black_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x arrow, 3x red_carpet, 1x nether_brick_wall", "id": "textcraft.train.950", "max_steps": 50, "misc": {"target_items": {"arrow": 2, "red_carpet": 3, "nether_brick_wall": 1}, "initial_inventory": {"flint": 1, "acacia_log": 1, "feather": 2, "rose_bush": 2, "string": 9, "nether_brick": 36, "spider_eye": 4, "lilac": 2, "wither_rose": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["red_wool", 2], "ingredients": {"red_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["red_carpet", 1], "ingredients": {"red_wool": 2}, "result_count": 3}, {"action": "craft", "target": ["nether_bricks", 6], "ingredients": {"nether_brick": 24}, "result_count": 6}, {"action": "craft", "target": ["nether_brick_wall", 1], "ingredients": {"nether_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x gray_concrete_powder, 3x dark_oak_fence_gate, 3x green_banner", "id": "textcraft.train.951", "max_steps": 50, "misc": {"target_items": {"gray_concrete_powder": 2, "dark_oak_fence_gate": 3, "green_banner": 3}, "initial_inventory": {"wither_rose": 2, "lily_of_the_valley": 1, "sand": 5, "gravel": 6, "acacia_log": 3, "dark_oak_log": 2, "green_dye": 27, "string": 95, "egg": 3, "ghast_tear": 1, "orange_tulip": 3}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_concrete_powder", 1], "ingredients": {"gray_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["dark_oak_planks", 2], "ingredients": {"dark_oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["dark_oak_fence_gate", 3], "ingredients": {"stick": 12, "dark_oak_planks": 6}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["green_wool", 18], "ingredients": {"green_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["green_banner", 3], "ingredients": {"green_wool": 18, "stick": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x writable_book", "id": "textcraft.train.952", "max_steps": 50, "misc": {"target_items": {"writable_book": 1}, "initial_inventory": {"sugar_cane": 3, "rabbit_hide": 5, "ink_sac": 1, "feather": 1, "stripped_jungle_log": 1, "dandelion": 3}, "gold_trajectory": [{"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["leather", 1], "ingredients": {"rabbit_hide": 4}, "result_count": 1}, {"action": "craft", "target": ["book", 1], "ingredients": {"paper": 3, "leather": 1}, "result_count": 1}, {"action": "craft", "target": ["writable_book", 1], "ingredients": {"book": 1, "ink_sac": 1, "feather": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x orange_carpet", "id": "textcraft.train.953", "max_steps": 50, "misc": {"target_items": {"orange_carpet": 1}, "initial_inventory": {"string": 28, "orange_tulip": 1, "milk_bucket": 1, "oak_log": 3, "quartz": 1, "flint": 1, "blue_orchid": 1}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["white_carpet", 3], "ingredients": {"white_wool": 6}, "result_count": 9}, {"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_carpet", 1], "ingredients": {"white_carpet": 8, "orange_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x stone_brick_stairs, 3x polished_blackstone_bricks, 3x light_blue_terracotta", "id": "textcraft.train.954", "max_steps": 50, "misc": {"target_items": {"stone_brick_stairs": 1, "polished_blackstone_bricks": 3, "light_blue_terracotta": 3}, "initial_inventory": {"stone": 10, "blackstone": 4, "terracotta": 10, "cornflower": 1, "lily_of_the_valley": 1, "smooth_quartz": 1, "wither_rose": 3}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["stone_brick_stairs", 1], "ingredients": {"stone_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_bricks", 1], "ingredients": {"polished_blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_terracotta", 1], "ingredients": {"terracotta": 8, "light_blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x lime_terracotta, 2x polished_diorite_stairs", "id": "textcraft.train.955", "max_steps": 50, "misc": {"target_items": {"lime_terracotta": 1, "polished_diorite_stairs": 2}, "initial_inventory": {"terracotta": 12, "green_dye": 2, "lily_of_the_valley": 1, "cobblestone": 10, "quartz": 11, "stripped_warped_stem": 3, "smooth_quartz": 1, "baked_potato": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_terracotta", 1], "ingredients": {"terracotta": 8, "lime_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["diorite", 4], "ingredients": {"cobblestone": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_diorite", 2], "ingredients": {"diorite": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_diorite_stairs", 1], "ingredients": {"polished_diorite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x red_terracotta", "id": "textcraft.train.956", "max_steps": 50, "misc": {"target_items": {"red_terracotta": 2}, "initial_inventory": {"terracotta": 10, "rose_bush": 1, "quartz": 5, "blue_orchid": 5, "gunpowder": 5}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_terracotta", 1], "ingredients": {"terracotta": 8, "red_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x gray_stained_glass", "id": "textcraft.train.957", "max_steps": 50, "misc": {"target_items": {"gray_stained_glass": 3}, "initial_inventory": {"glass": 8, "wither_rose": 2, "lily_of_the_valley": 1, "cobblestone": 4, "warped_stem": 2, "smooth_red_sandstone": 3}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_stained_glass", 1], "ingredients": {"glass": 8, "gray_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x granite, 2x brown_bed", "id": "textcraft.train.958", "max_steps": 50, "misc": {"target_items": {"granite": 3, "brown_bed": 2}, "initial_inventory": {"cobblestone": 6, "quartz": 8, "string": 30, "acacia_log": 2, "cocoa_beans": 2, "heart_of_the_sea": 3, "beetroot": 4, "pumpkin": 5}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 3], "ingredients": {"diorite": 3, "quartz": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 6], "ingredients": {"string": 24}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["white_bed", 2], "ingredients": {"white_wool": 6, "acacia_planks": 6}, "result_count": 2}, {"action": "craft", "target": ["brown_dye", 2], "ingredients": {"cocoa_beans": 2}, "result_count": 2}, {"action": "craft", "target": ["brown_bed", 2], "ingredients": {"white_bed": 2, "brown_dye": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x brown_stained_glass, 3x end_stone_brick_slab", "id": "textcraft.train.959", "max_steps": 50, "misc": {"target_items": {"brown_stained_glass": 1, "end_stone_brick_slab": 3}, "initial_inventory": {"glass": 12, "cocoa_beans": 2, "end_stone": 4, "nether_brick": 4, "blackstone": 2, "oak_log": 4, "feather": 4, "pumpkin": 2}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_stained_glass", 1], "ingredients": {"glass": 8, "brown_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["end_stone_bricks", 1], "ingredients": {"end_stone": 4}, "result_count": 4}, {"action": "craft", "target": ["end_stone_brick_slab", 1], "ingredients": {"end_stone_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x andesite_wall", "id": "textcraft.train.960", "max_steps": 50, "misc": {"target_items": {"andesite_wall": 1}, "initial_inventory": {"cobblestone": 8, "quartz": 5, "stripped_warped_stem": 4, "bamboo": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 3], "ingredients": {"diorite": 3, "cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["andesite_wall", 1], "ingredients": {"andesite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x polished_blackstone_brick_stairs, 1x jungle_fence, 3x item_frame", "id": "textcraft.train.961", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_brick_stairs": 1, "jungle_fence": 1, "item_frame": 3}, "initial_inventory": {"blackstone": 11, "jungle_log": 2, "acacia_log": 6, "rabbit_hide": 12, "poppy": 1, "stripped_birch_log": 5, "dandelion": 4, "nether_wart": 2}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_bricks", 2], "ingredients": {"polished_blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_brick_stairs", 1], "ingredients": {"polished_blackstone_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"jungle_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["jungle_fence", 1], "ingredients": {"jungle_planks": 4, "stick": 2}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["stick", 6], "ingredients": {"acacia_planks": 12}, "result_count": 24}, {"action": "craft", "target": ["leather", 3], "ingredients": {"rabbit_hide": 12}, "result_count": 3}, {"action": "craft", "target": ["item_frame", 3], "ingredients": {"stick": 24, "leather": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x blue_banner", "id": "textcraft.train.962", "max_steps": 50, "misc": {"target_items": {"blue_banner": 3}, "initial_inventory": {"cornflower": 23, "string": 95, "acacia_log": 1, "smooth_sandstone": 3, "snowball": 5, "red_sand": 2, "bamboo": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 18], "ingredients": {"cornflower": 18}, "result_count": 18}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["blue_wool", 18], "ingredients": {"blue_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["blue_banner", 3], "ingredients": {"blue_wool": 18, "stick": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x cyan_terracotta, 2x cyan_stained_glass, 2x orange_dye", "id": "textcraft.train.963", "max_steps": 50, "misc": {"target_items": {"cyan_terracotta": 3, "cyan_stained_glass": 2, "orange_dye": 2}, "initial_inventory": {"terracotta": 10, "cornflower": 2, "green_dye": 3, "glass": 9, "orange_tulip": 3, "glowstone_dust": 1, "nautilus_shell": 4, "stripped_spruce_log": 5, "crimson_stem": 4, "vine": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_terracotta", 1], "ingredients": {"terracotta": 8, "cyan_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["cyan_stained_glass", 1], "ingredients": {"glass": 8, "cyan_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["orange_dye", 2], "ingredients": {"orange_tulip": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x blue_banner", "id": "textcraft.train.964", "max_steps": 50, "misc": {"target_items": {"blue_banner": 2}, "initial_inventory": {"cornflower": 13, "string": 67, "acacia_log": 2, "brick": 3, "stripped_warped_stem": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 12], "ingredients": {"cornflower": 12}, "result_count": 12}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["blue_wool", 12], "ingredients": {"blue_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["blue_banner", 2], "ingredients": {"blue_wool": 12, "stick": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x quartz_bricks", "id": "textcraft.train.965", "max_steps": 50, "misc": {"target_items": {"quartz_bricks": 2}, "initial_inventory": {"quartz": 24, "bone": 4, "crimson_stem": 1}, "gold_trajectory": [{"action": "craft", "target": ["quartz_block", 4], "ingredients": {"quartz": 16}, "result_count": 4}, {"action": "craft", "target": ["quartz_bricks", 1], "ingredients": {"quartz_block": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x pink_concrete_powder", "id": "textcraft.train.966", "max_steps": 50, "misc": {"target_items": {"pink_concrete_powder": 1}, "initial_inventory": {"pink_tulip": 2, "sand": 5, "gravel": 4, "peony": 4, "string": 2, "dirt": 4, "creeper_head": 5}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_concrete_powder", 1], "ingredients": {"pink_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x white_terracotta, 3x acacia_sign", "id": "textcraft.train.967", "max_steps": 50, "misc": {"target_items": {"white_terracotta": 1, "acacia_sign": 3}, "initial_inventory": {"terracotta": 8, "lily_of_the_valley": 1, "acacia_log": 3, "prismarine_crystals": 3, "stripped_birch_log": 1, "creeper_head": 3, "obsidian": 5, "stripped_warped_stem": 3}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_terracotta", 1], "ingredients": {"terracotta": 8, "white_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_sign", 1], "ingredients": {"acacia_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x item_frame", "id": "textcraft.train.968", "max_steps": 50, "misc": {"target_items": {"item_frame": 1}, "initial_inventory": {"acacia_log": 1, "rabbit_hide": 4, "pink_tulip": 2, "ink_sac": 4, "lilac": 5, "egg": 2, "string": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["leather", 1], "ingredients": {"rabbit_hide": 4}, "result_count": 1}, {"action": "craft", "target": ["item_frame", 1], "ingredients": {"stick": 8, "leather": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x stone_hoe, 1x red_wool", "id": "textcraft.train.969", "max_steps": 50, "misc": {"target_items": {"stone_hoe": 3, "red_wool": 1}, "initial_inventory": {"blackstone": 8, "acacia_log": 2, "rose_bush": 1, "string": 4, "stone": 4, "glowstone_dust": 4, "ice": 3, "cooked_rabbit": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["stone_hoe", 3], "ingredients": {"blackstone": 6, "stick": 6}, "result_count": 3}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["red_wool", 1], "ingredients": {"red_dye": 1, "white_wool": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x polished_blackstone_brick_wall, 3x leather_helmet, 2x stone_brick_wall", "id": "textcraft.train.970", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_brick_wall": 1, "leather_helmet": 3, "stone_brick_wall": 2}, "initial_inventory": {"blackstone": 10, "rabbit_hide": 79, "stone": 12, "warped_stem": 4, "apple": 1, "stripped_spruce_log": 5, "blaze_rod": 3}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_bricks", 2], "ingredients": {"polished_blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_brick_wall", 1], "ingredients": {"polished_blackstone_bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["leather", 15], "ingredients": {"rabbit_hide": 60}, "result_count": 15}, {"action": "craft", "target": ["leather_helmet", 3], "ingredients": {"leather": 15}, "result_count": 3}, {"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["stone_brick_wall", 1], "ingredients": {"stone_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x cyan_terracotta", "id": "textcraft.train.971", "max_steps": 50, "misc": {"target_items": {"cyan_terracotta": 3}, "initial_inventory": {"terracotta": 11, "cornflower": 2, "green_dye": 2, "cooked_rabbit": 1, "wither_skeleton_skull": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_terracotta", 1], "ingredients": {"terracotta": 8, "cyan_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x carrot_on_a_stick, 1x mossy_cobblestone_wall, 1x andesite_stairs", "id": "textcraft.train.972", "max_steps": 50, "misc": {"target_items": {"carrot_on_a_stick": 3, "mossy_cobblestone_wall": 1, "andesite_stairs": 1}, "initial_inventory": {"acacia_log": 2, "string": 6, "carrot": 4, "cobblestone": 19, "vine": 8, "quartz": 4, "peony": 3, "wither_skeleton_skull": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["fishing_rod", 3], "ingredients": {"stick": 9, "string": 6}, "result_count": 3}, {"action": "craft", "target": ["carrot_on_a_stick", 3], "ingredients": {"fishing_rod": 3, "carrot": 3}, "result_count": 3}, {"action": "craft", "target": ["mossy_cobblestone", 6], "ingredients": {"cobblestone": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_cobblestone_wall", 1], "ingredients": {"mossy_cobblestone": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 3], "ingredients": {"diorite": 3, "cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["andesite_stairs", 1], "ingredients": {"andesite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x prismarine_brick_stairs", "id": "textcraft.train.973", "max_steps": 50, "misc": {"target_items": {"prismarine_brick_stairs": 1}, "initial_inventory": {"prismarine_shard": 59, "cooked_rabbit": 2, "gravel": 1}, "gold_trajectory": [{"action": "craft", "target": ["prismarine_bricks", 6], "ingredients": {"prismarine_shard": 54}, "result_count": 6}, {"action": "craft", "target": ["prismarine_brick_stairs", 1], "ingredients": {"prismarine_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x white_bed, 3x mossy_stone_brick_wall", "id": "textcraft.train.974", "max_steps": 50, "misc": {"target_items": {"white_bed": 3, "mossy_stone_brick_wall": 3}, "initial_inventory": {"string": 37, "acacia_log": 3, "stone": 11, "vine": 8, "clay_ball": 2, "prismarine_crystals": 2, "allium": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 9], "ingredients": {"string": 36}, "result_count": 9}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["white_bed", 3], "ingredients": {"white_wool": 9, "acacia_planks": 9}, "result_count": 3}, {"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["mossy_stone_bricks", 6], "ingredients": {"stone_bricks": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_stone_brick_wall", 1], "ingredients": {"mossy_stone_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x prismarine_brick_stairs, 3x purple_wool", "id": "textcraft.train.975", "max_steps": 50, "misc": {"target_items": {"prismarine_brick_stairs": 1, "purple_wool": 3}, "initial_inventory": {"prismarine_shard": 67, "cornflower": 2, "rose_bush": 1, "string": 18, "sugar_cane": 5, "dark_oak_log": 5}, "gold_trajectory": [{"action": "craft", "target": ["prismarine_bricks", 6], "ingredients": {"prismarine_shard": 54}, "result_count": 6}, {"action": "craft", "target": ["prismarine_brick_stairs", 1], "ingredients": {"prismarine_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 2], "ingredients": {"blue_dye": 2, "red_dye": 2}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["purple_wool", 3], "ingredients": {"purple_dye": 3, "white_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x creeper_banner_pattern, 2x black_stained_glass_pane, 1x blue_ice", "id": "textcraft.train.976", "max_steps": 50, "misc": {"target_items": {"creeper_banner_pattern": 2, "black_stained_glass_pane": 2, "blue_ice": 1}, "initial_inventory": {"sugar_cane": 3, "creeper_head": 2, "glass": 11, "wither_rose": 2, "ice": 119, "lily_of_the_valley": 5, "milk_bucket": 5, "baked_potato": 1, "flint": 2}, "gold_trajectory": [{"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["creeper_banner_pattern", 2], "ingredients": {"paper": 2, "creeper_head": 2}, "result_count": 2}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_stained_glass", 1], "ingredients": {"glass": 8, "black_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["black_stained_glass_pane", 1], "ingredients": {"black_stained_glass": 6}, "result_count": 16}, {"action": "craft", "target": ["packed_ice", 9], "ingredients": {"ice": 81}, "result_count": 9}, {"action": "craft", "target": ["blue_ice", 1], "ingredients": {"packed_ice": 9}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x nether_brick_slab, 2x blue_dye", "id": "textcraft.train.977", "max_steps": 50, "misc": {"target_items": {"nether_brick_slab": 1, "blue_dye": 2}, "initial_inventory": {"nether_brick": 15, "cornflower": 3, "peony": 2, "terracotta": 1, "red_tulip": 2, "milk_bucket": 3}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x spectral_arrow", "id": "textcraft.train.978", "max_steps": 50, "misc": {"target_items": {"spectral_arrow": 3}, "initial_inventory": {"glowstone_dust": 11, "flint": 1, "acacia_log": 2, "feather": 1, "smooth_sandstone": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}, {"action": "craft", "target": ["spectral_arrow", 2], "ingredients": {"glowstone_dust": 8, "arrow": 2}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x blue_bed", "id": "textcraft.train.979", "max_steps": 50, "misc": {"target_items": {"blue_bed": 3}, "initial_inventory": {"string": 53, "acacia_log": 4, "cornflower": 4, "spruce_log": 1, "allium": 2, "vine": 1}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 9], "ingredients": {"string": 36}, "result_count": 9}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["white_bed", 3], "ingredients": {"white_wool": 9, "acacia_planks": 9}, "result_count": 3}, {"action": "craft", "target": ["blue_dye", 3], "ingredients": {"cornflower": 3}, "result_count": 3}, {"action": "craft", "target": ["blue_bed", 3], "ingredients": {"white_bed": 3, "blue_dye": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x black_bed", "id": "textcraft.train.980", "max_steps": 50, "misc": {"target_items": {"black_bed": 3}, "initial_inventory": {"wither_rose": 10, "string": 46, "acacia_log": 4, "lily_of_the_valley": 1, "spruce_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 9], "ingredients": {"wither_rose": 9}, "result_count": 9}, {"action": "craft", "target": ["white_wool", 9], "ingredients": {"string": 36}, "result_count": 9}, {"action": "craft", "target": ["black_wool", 9], "ingredients": {"black_dye": 9, "white_wool": 9}, "result_count": 9}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["black_bed", 3], "ingredients": {"black_wool": 9, "acacia_planks": 9}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x red_sandstone_wall, 1x end_stone_brick_wall", "id": "textcraft.train.981", "max_steps": 50, "misc": {"target_items": {"red_sandstone_wall": 3, "end_stone_brick_wall": 1}, "initial_inventory": {"red_sand": 27, "end_stone": 9, "acacia_log": 5, "brown_mushroom": 4, "gravel": 1}, "gold_trajectory": [{"action": "craft", "target": ["red_sandstone", 6], "ingredients": {"red_sand": 24}, "result_count": 6}, {"action": "craft", "target": ["red_sandstone_wall", 1], "ingredients": {"red_sandstone": 6}, "result_count": 6}, {"action": "craft", "target": ["end_stone_bricks", 2], "ingredients": {"end_stone": 8}, "result_count": 8}, {"action": "craft", "target": ["end_stone_brick_wall", 1], "ingredients": {"end_stone_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x stone_brick_slab, 2x blue_banner", "id": "textcraft.train.982", "max_steps": 50, "misc": {"target_items": {"stone_brick_slab": 1, "blue_banner": 2}, "initial_inventory": {"stone": 5, "cornflower": 17, "string": 65, "acacia_log": 2, "peony": 1, "dandelion": 3, "stripped_oak_log": 5, "gravel": 5, "rabbit_hide": 2}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 1], "ingredients": {"stone": 4}, "result_count": 4}, {"action": "craft", "target": ["stone_brick_slab", 1], "ingredients": {"stone_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["blue_dye", 12], "ingredients": {"cornflower": 12}, "result_count": 12}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["blue_wool", 12], "ingredients": {"blue_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["blue_banner", 2], "ingredients": {"blue_wool": 12, "stick": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x pink_dye", "id": "textcraft.train.983", "max_steps": 50, "misc": {"target_items": {"pink_dye": 2}, "initial_inventory": {"pink_tulip": 3, "shulker_shell": 4, "cooked_rabbit": 5}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 2], "ingredients": {"pink_tulip": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x chiseled_polished_blackstone", "id": "textcraft.train.984", "max_steps": 50, "misc": {"target_items": {"chiseled_polished_blackstone": 1}, "initial_inventory": {"blackstone": 5, "prismarine_crystals": 1, "stripped_dark_oak_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_slab", 1], "ingredients": {"polished_blackstone": 3}, "result_count": 6}, {"action": "craft", "target": ["chiseled_polished_blackstone", 1], "ingredients": {"polished_blackstone_slab": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x warped_fence, 1x orange_stained_glass", "id": "textcraft.train.985", "max_steps": 50, "misc": {"target_items": {"warped_fence": 2, "orange_stained_glass": 1}, "initial_inventory": {"warped_stem": 2, "acacia_log": 2, "glass": 9, "orange_tulip": 2, "ink_sac": 3, "lilac": 1}, "gold_trajectory": [{"action": "craft", "target": ["warped_planks", 1], "ingredients": {"warped_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"warped_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["warped_planks", 1], "ingredients": {"warped_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["warped_fence", 1], "ingredients": {"warped_planks": 4, "stick": 2}, "result_count": 3}, {"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_stained_glass", 1], "ingredients": {"glass": 8, "orange_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x cut_red_sandstone", "id": "textcraft.train.986", "max_steps": 50, "misc": {"target_items": {"cut_red_sandstone": 1}, "initial_inventory": {"red_sand": 19, "egg": 3, "white_tulip": 5, "stripped_acacia_log": 5, "oak_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["red_sandstone", 4], "ingredients": {"red_sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone", 1], "ingredients": {"red_sandstone": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x polished_granite_slab, 3x orange_terracotta, 2x purple_wool", "id": "textcraft.train.987", "max_steps": 50, "misc": {"target_items": {"polished_granite_slab": 1, "orange_terracotta": 3, "purple_wool": 2}, "initial_inventory": {"cobblestone": 4, "quartz": 9, "terracotta": 11, "orange_tulip": 2, "cornflower": 1, "rose_bush": 2, "string": 10, "shulker_shell": 3, "blaze_rod": 2}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 4], "ingredients": {"diorite": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite", 1], "ingredients": {"granite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite_slab", 1], "ingredients": {"polished_granite": 3}, "result_count": 6}, {"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_terracotta", 1], "ingredients": {"terracotta": 8, "orange_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["purple_wool", 2], "ingredients": {"purple_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x mossy_stone_brick_stairs", "id": "textcraft.train.988", "max_steps": 50, "misc": {"target_items": {"mossy_stone_brick_stairs": 2}, "initial_inventory": {"stone": 11, "vine": 6, "acacia_log": 2, "oxeye_daisy": 1}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["mossy_stone_bricks", 6], "ingredients": {"stone_bricks": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_stone_brick_stairs", 1], "ingredients": {"mossy_stone_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x wooden_shovel", "id": "textcraft.train.989", "max_steps": 50, "misc": {"target_items": {"wooden_shovel": 1}, "initial_inventory": {"acacia_log": 2, "orange_tulip": 1, "oak_log": 5, "stripped_birch_log": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["wooden_shovel", 1], "ingredients": {"acacia_planks": 1, "stick": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x orange_bed, 3x oak_sign", "id": "textcraft.train.990", "max_steps": 50, "misc": {"target_items": {"orange_bed": 1, "oak_sign": 3}, "initial_inventory": {"orange_tulip": 3, "string": 15, "acacia_log": 2, "oak_log": 3, "scute": 4, "dandelion": 3, "red_mushroom": 4, "prismarine_crystals": 1, "cocoa_beans": 2}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 3], "ingredients": {"orange_tulip": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["orange_wool", 3], "ingredients": {"orange_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["orange_bed", 1], "ingredients": {"orange_wool": 3, "acacia_planks": 3}, "result_count": 1}, {"action": "craft", "target": ["oak_planks", 2], "ingredients": {"oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["oak_sign", 1], "ingredients": {"oak_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x arrow, 2x red_stained_glass_pane, 3x dark_oak_fence_gate", "id": "textcraft.train.991", "max_steps": 50, "misc": {"target_items": {"arrow": 1, "red_stained_glass_pane": 2, "dark_oak_fence_gate": 3}, "initial_inventory": {"flint": 1, "acacia_log": 3, "feather": 2, "glass": 7, "rose_bush": 1, "dark_oak_log": 2, "brown_mushroom": 2, "jungle_log": 3, "spruce_log": 3, "bone": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}, {"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "red_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["dark_oak_planks", 2], "ingredients": {"dark_oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["dark_oak_fence_gate", 3], "ingredients": {"stick": 12, "dark_oak_planks": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x birch_fence_gate", "id": "textcraft.train.992", "max_steps": 50, "misc": {"target_items": {"birch_fence_gate": 2}, "initial_inventory": {"acacia_log": 2, "birch_log": 2, "popped_chorus_fruit": 5, "red_tulip": 5, "blackstone": 4, "white_tulip": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["birch_planks", 1], "ingredients": {"birch_log": 1}, "result_count": 4}, {"action": "craft", "target": ["birch_fence_gate", 2], "ingredients": {"stick": 8, "birch_planks": 4}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x jungle_fence", "id": "textcraft.train.993", "max_steps": 50, "misc": {"target_items": {"jungle_fence": 2}, "initial_inventory": {"jungle_log": 2, "acacia_log": 1, "ink_sac": 2, "nether_brick": 5, "white_tulip": 1, "peony": 4, "stripped_acacia_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"jungle_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_planks", 1], "ingredients": {"jungle_log": 1}, "result_count": 4}, {"action": "craft", "target": ["jungle_fence", 1], "ingredients": {"jungle_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x lever", "id": "textcraft.train.994", "max_steps": 50, "misc": {"target_items": {"lever": 1}, "initial_inventory": {"acacia_log": 2, "cobblestone": 1, "nether_wart": 4, "carved_pumpkin": 3, "carrot": 4, "nautilus_shell": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["lever", 1], "ingredients": {"stick": 1, "cobblestone": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x sugar", "id": "textcraft.train.995", "max_steps": 50, "misc": {"target_items": {"sugar": 1}, "initial_inventory": {"sugar_cane": 2, "azure_bluet": 5, "prismarine_crystals": 4, "feather": 3, "nether_brick": 3}, "gold_trajectory": [{"action": "craft", "target": ["sugar", 1], "ingredients": {"sugar_cane": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x light_blue_stained_glass, 1x leather_leggings", "id": "textcraft.train.996", "max_steps": 50, "misc": {"target_items": {"light_blue_stained_glass": 2, "leather_leggings": 1}, "initial_inventory": {"glass": 11, "cornflower": 1, "lily_of_the_valley": 2, "rabbit_hide": 38, "prismarine_shard": 1, "dandelion": 3, "dark_oak_log": 5}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_stained_glass", 1], "ingredients": {"glass": 8, "light_blue_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["leather", 7], "ingredients": {"rabbit_hide": 28}, "result_count": 7}, {"action": "craft", "target": ["leather_leggings", 1], "ingredients": {"leather": 7}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x brown_terracotta", "id": "textcraft.train.997", "max_steps": 50, "misc": {"target_items": {"brown_terracotta": 2}, "initial_inventory": {"terracotta": 10, "cocoa_beans": 1, "feather": 5, "red_tulip": 1, "smooth_red_sandstone": 2, "stripped_jungle_log": 4, "prismarine_crystals": 4}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_terracotta", 1], "ingredients": {"terracotta": 8, "brown_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x wooden_hoe", "id": "textcraft.train.998", "max_steps": 50, "misc": {"target_items": {"wooden_hoe": 1}, "initial_inventory": {"acacia_log": 2, "jungle_log": 3, "cocoa_beans": 5, "birch_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["wooden_hoe", 1], "ingredients": {"acacia_planks": 2, "stick": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x spectral_arrow", "id": "textcraft.train.999", "max_steps": 50, "misc": {"target_items": {"spectral_arrow": 2}, "initial_inventory": {"glowstone_dust": 5, "flint": 2, "acacia_log": 1, "feather": 1, "bamboo": 1, "stripped_warped_stem": 2, "lilac": 2, "nether_brick": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}, {"action": "craft", "target": ["spectral_arrow", 1], "ingredients": {"glowstone_dust": 4, "arrow": 1}, "result_count": 2}]}} diff --git a/astraflow/core/workflow/impl/textcraft/textcraft_val.jsonl b/astraflow/core/workflow/impl/textcraft/textcraft_val.jsonl new file mode 100644 index 0000000..3348c18 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/textcraft_val.jsonl @@ -0,0 +1,100 @@ +{"goal": "Craft the following items: 1x diorite_stairs, 2x polished_blackstone_pressure_plate, 1x black_stained_glass", "id": "textcraft.train.13", "max_steps": 50, "misc": {"target_items": {"diorite_stairs": 1, "polished_blackstone_pressure_plate": 2, "black_stained_glass": 1}, "initial_inventory": {"cobblestone": 7, "quartz": 8, "blackstone": 5, "glass": 9, "wither_rose": 2, "obsidian": 5, "oak_log": 5, "netherite_scrap": 1, "baked_potato": 3}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_stairs", 1], "ingredients": {"diorite": 6}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_pressure_plate", 2], "ingredients": {"polished_blackstone": 4}, "result_count": 2}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_stained_glass", 1], "ingredients": {"glass": 8, "black_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x black_banner, 2x orange_dye, 3x polished_blackstone_bricks", "id": "textcraft.train.15", "max_steps": 50, "misc": {"target_items": {"black_banner": 3, "orange_dye": 2, "polished_blackstone_bricks": 3}, "initial_inventory": {"wither_rose": 20, "string": 84, "acacia_log": 2, "orange_tulip": 3, "blackstone": 6, "obsidian": 5, "netherite_scrap": 4, "stripped_warped_stem": 1}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 18], "ingredients": {"wither_rose": 18}, "result_count": 18}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["black_wool", 18], "ingredients": {"black_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["black_banner", 3], "ingredients": {"black_wool": 18, "stick": 3}, "result_count": 3}, {"action": "craft", "target": ["orange_dye", 2], "ingredients": {"orange_tulip": 2}, "result_count": 2}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_bricks", 1], "ingredients": {"polished_blackstone": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x light_blue_concrete_powder, 1x spruce_fence_gate, 1x blue_dye", "id": "textcraft.train.16", "max_steps": 50, "misc": {"target_items": {"light_blue_concrete_powder": 1, "spruce_fence_gate": 1, "blue_dye": 1}, "initial_inventory": {"cornflower": 2, "lily_of_the_valley": 2, "sand": 6, "gravel": 4, "acacia_log": 2, "spruce_log": 2, "stone": 4, "gunpowder": 4, "honeycomb": 2}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_concrete_powder", 1], "ingredients": {"light_blue_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["spruce_planks", 1], "ingredients": {"spruce_log": 1}, "result_count": 4}, {"action": "craft", "target": ["spruce_fence_gate", 1], "ingredients": {"stick": 4, "spruce_planks": 2}, "result_count": 1}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x nether_brick_wall", "id": "textcraft.train.17", "max_steps": 50, "misc": {"target_items": {"nether_brick_wall": 2}, "initial_inventory": {"nether_brick": 36, "stripped_dark_oak_log": 5, "red_sand": 2, "carrot": 2, "spruce_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["nether_bricks", 6], "ingredients": {"nether_brick": 24}, "result_count": 6}, {"action": "craft", "target": ["nether_brick_wall", 1], "ingredients": {"nether_bricks": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x red_nether_brick_stairs, 1x fermented_spider_eye", "id": "textcraft.train.33", "max_steps": 50, "misc": {"target_items": {"red_nether_brick_stairs": 1, "fermented_spider_eye": 1}, "initial_inventory": {"nether_brick": 16, "nether_wart": 15, "spider_eye": 1, "brown_mushroom": 1, "sugar_cane": 1, "obsidian": 4, "clay_ball": 2}, "gold_trajectory": [{"action": "craft", "target": ["red_nether_bricks", 6], "ingredients": {"nether_brick": 12, "nether_wart": 12}, "result_count": 6}, {"action": "craft", "target": ["red_nether_brick_stairs", 1], "ingredients": {"red_nether_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["sugar", 1], "ingredients": {"sugar_cane": 1}, "result_count": 1}, {"action": "craft", "target": ["fermented_spider_eye", 1], "ingredients": {"spider_eye": 1, "brown_mushroom": 1, "sugar": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x gray_terracotta", "id": "textcraft.train.44", "max_steps": 50, "misc": {"target_items": {"gray_terracotta": 3}, "initial_inventory": {"terracotta": 12, "wither_rose": 2, "lily_of_the_valley": 1, "gravel": 4, "apple": 1, "brick": 5, "nether_star": 3, "sand": 5}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_terracotta", 1], "ingredients": {"terracotta": 8, "gray_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x polished_blackstone_brick_stairs", "id": "textcraft.train.47", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_brick_stairs": 2}, "initial_inventory": {"blackstone": 10, "wither_rose": 1, "gunpowder": 4, "stripped_acacia_log": 2, "oxeye_daisy": 5}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_bricks", 2], "ingredients": {"polished_blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_brick_stairs", 1], "ingredients": {"polished_blackstone_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x red_carpet, 1x polished_blackstone_bricks", "id": "textcraft.train.70", "max_steps": 50, "misc": {"target_items": {"red_carpet": 2, "polished_blackstone_bricks": 1}, "initial_inventory": {"rose_bush": 2, "string": 8, "blackstone": 6, "stripped_jungle_log": 5, "brick": 1, "red_tulip": 5}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["red_wool", 2], "ingredients": {"red_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["red_carpet", 1], "ingredients": {"red_wool": 2}, "result_count": 3}, {"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_bricks", 1], "ingredients": {"polished_blackstone": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x brick_stairs", "id": "textcraft.train.76", "max_steps": 50, "misc": {"target_items": {"brick_stairs": 2}, "initial_inventory": {"brick": 26, "ice": 3, "stone": 2, "oak_log": 3, "smooth_red_sandstone": 5, "nether_wart": 2}, "gold_trajectory": [{"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_stairs", 1], "ingredients": {"bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x orange_stained_glass_pane", "id": "textcraft.train.86", "max_steps": 50, "misc": {"target_items": {"orange_stained_glass_pane": 3}, "initial_inventory": {"glass": 11, "orange_tulip": 1, "rabbit_hide": 3, "stripped_dark_oak_log": 3}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_stained_glass", 1], "ingredients": {"glass": 8, "orange_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["orange_stained_glass_pane", 1], "ingredients": {"orange_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 2x arrow, 1x fire_charge, 1x cyan_concrete_powder", "id": "textcraft.train.118", "max_steps": 50, "misc": {"target_items": {"arrow": 2, "fire_charge": 1, "cyan_concrete_powder": 1}, "initial_inventory": {"flint": 1, "acacia_log": 1, "feather": 1, "gunpowder": 1, "blaze_rod": 1, "cornflower": 1, "green_dye": 2, "sand": 5, "gravel": 6, "shulker_shell": 5, "stripped_birch_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}, {"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["fire_charge", 1], "ingredients": {"gunpowder": 1, "blaze_powder": 1}, "result_count": 3}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_concrete_powder", 1], "ingredients": {"cyan_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x cyan_terracotta", "id": "textcraft.train.119", "max_steps": 50, "misc": {"target_items": {"cyan_terracotta": 1}, "initial_inventory": {"terracotta": 12, "cornflower": 1, "green_dye": 1, "stone": 3, "red_mushroom": 5, "carrot": 3, "white_tulip": 5, "smooth_quartz": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_terracotta", 1], "ingredients": {"terracotta": 8, "cyan_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x magenta_dye, 3x orange_terracotta", "id": "textcraft.train.134", "max_steps": 50, "misc": {"target_items": {"magenta_dye": 3, "orange_terracotta": 3}, "initial_inventory": {"allium": 3, "terracotta": 9, "orange_tulip": 2, "nautilus_shell": 4, "ink_sac": 5}, "gold_trajectory": [{"action": "craft", "target": ["magenta_dye", 3], "ingredients": {"allium": 3}, "result_count": 3}, {"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_terracotta", 1], "ingredients": {"terracotta": 8, "orange_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x wooden_sword, 3x red_sandstone_wall, 3x birch_sign", "id": "textcraft.train.160", "max_steps": 50, "misc": {"target_items": {"wooden_sword": 2, "red_sandstone_wall": 3, "birch_sign": 3}, "initial_inventory": {"acacia_log": 4, "red_sand": 24, "birch_log": 2, "birch_planks": 4, "string": 5, "glass": 5}, "gold_trajectory": [{"action": "craft", "target": ["stick", 1], "ingredients": {"birch_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["wooden_sword", 2], "ingredients": {"acacia_planks": 4, "stick": 2}, "result_count": 2}, {"action": "craft", "target": ["red_sandstone", 6], "ingredients": {"red_sand": 24}, "result_count": 6}, {"action": "craft", "target": ["red_sandstone_wall", 1], "ingredients": {"red_sandstone": 6}, "result_count": 6}, {"action": "craft", "target": ["birch_planks", 1], "ingredients": {"birch_log": 1}, "result_count": 4}, {"action": "craft", "target": ["birch_sign", 1], "ingredients": {"birch_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x light_blue_wool, 1x yellow_stained_glass_pane", "id": "textcraft.train.177", "max_steps": 50, "misc": {"target_items": {"light_blue_wool": 3, "yellow_stained_glass_pane": 1}, "initial_inventory": {"cornflower": 3, "lily_of_the_valley": 2, "string": 13, "glass": 7, "dandelion": 1, "basalt": 1, "wither_rose": 1, "nether_wart": 4, "obsidian": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}, {"action": "craft", "target": ["white_dye", 2], "ingredients": {"lily_of_the_valley": 2}, "result_count": 2}, {"action": "craft", "target": ["light_blue_dye", 2], "ingredients": {"blue_dye": 2, "white_dye": 2}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["light_blue_wool", 3], "ingredients": {"light_blue_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "yellow_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x yellow_wool", "id": "textcraft.train.181", "max_steps": 50, "misc": {"target_items": {"yellow_wool": 2}, "initial_inventory": {"dandelion": 3, "string": 8, "dark_oak_log": 3, "stripped_birch_log": 3, "stripped_jungle_log": 5, "brown_mushroom": 3, "sugar_cane": 1}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 2], "ingredients": {"dandelion": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["yellow_wool", 2], "ingredients": {"yellow_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x birch_fence_gate, 2x yellow_banner", "id": "textcraft.train.186", "max_steps": 50, "misc": {"target_items": {"birch_fence_gate": 1, "yellow_banner": 2}, "initial_inventory": {"acacia_log": 2, "birch_log": 2, "dandelion": 14, "string": 68, "orange_tulip": 2, "terracotta": 2, "baked_potato": 3, "dirt": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["birch_planks", 1], "ingredients": {"birch_log": 1}, "result_count": 4}, {"action": "craft", "target": ["birch_fence_gate", 1], "ingredients": {"stick": 4, "birch_planks": 2}, "result_count": 1}, {"action": "craft", "target": ["yellow_dye", 12], "ingredients": {"dandelion": 12}, "result_count": 12}, {"action": "craft", "target": ["white_wool", 12], "ingredients": {"string": 48}, "result_count": 12}, {"action": "craft", "target": ["yellow_wool", 12], "ingredients": {"yellow_dye": 12, "white_wool": 12}, "result_count": 12}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["yellow_banner", 2], "ingredients": {"yellow_wool": 12, "stick": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x torch", "id": "textcraft.train.194", "max_steps": 50, "misc": {"target_items": {"torch": 1}, "initial_inventory": {"acacia_log": 1, "string": 4, "scute": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x pink_concrete_powder, 1x lime_concrete_powder, 2x andesite_slab", "id": "textcraft.train.216", "max_steps": 50, "misc": {"target_items": {"pink_concrete_powder": 2, "lime_concrete_powder": 1, "andesite_slab": 2}, "initial_inventory": {"pink_tulip": 2, "sand": 12, "gravel": 9, "green_dye": 1, "lily_of_the_valley": 1, "cobblestone": 6, "quartz": 3, "terracotta": 3, "netherite_scrap": 5, "stripped_warped_stem": 3, "beetroot": 1}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_concrete_powder", 1], "ingredients": {"pink_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_concrete_powder", 1], "ingredients": {"lime_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["diorite", 1], "ingredients": {"cobblestone": 2, "quartz": 2}, "result_count": 2}, {"action": "craft", "target": ["andesite", 2], "ingredients": {"diorite": 2, "cobblestone": 2}, "result_count": 4}, {"action": "craft", "target": ["andesite_slab", 1], "ingredients": {"andesite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x orange_stained_glass_pane", "id": "textcraft.train.235", "max_steps": 50, "misc": {"target_items": {"orange_stained_glass_pane": 3}, "initial_inventory": {"glass": 10, "orange_tulip": 2, "heart_of_the_sea": 3, "spruce_log": 1, "blackstone": 5}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_stained_glass", 1], "ingredients": {"glass": 8, "orange_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["orange_stained_glass_pane", 1], "ingredients": {"orange_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 3x cut_red_sandstone, 1x painting", "id": "textcraft.train.244", "max_steps": 50, "misc": {"target_items": {"cut_red_sandstone": 3, "painting": 1}, "initial_inventory": {"red_sand": 23, "acacia_log": 1, "wither_rose": 1, "string": 4, "warped_fungus": 5, "oxeye_daisy": 2}, "gold_trajectory": [{"action": "craft", "target": ["red_sandstone", 4], "ingredients": {"red_sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone", 1], "ingredients": {"red_sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["black_wool", 1], "ingredients": {"black_dye": 1, "white_wool": 1}, "result_count": 1}, {"action": "craft", "target": ["painting", 1], "ingredients": {"stick": 8, "black_wool": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x cyan_terracotta, 1x pink_terracotta", "id": "textcraft.train.246", "max_steps": 50, "misc": {"target_items": {"cyan_terracotta": 3, "pink_terracotta": 1}, "initial_inventory": {"terracotta": 19, "cornflower": 1, "green_dye": 1, "pink_tulip": 2, "crimson_stem": 2, "peony": 1, "allium": 1}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_terracotta", 1], "ingredients": {"terracotta": 8, "cyan_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_terracotta", 1], "ingredients": {"terracotta": 8, "pink_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x gray_stained_glass", "id": "textcraft.train.249", "max_steps": 50, "misc": {"target_items": {"gray_stained_glass": 1}, "initial_inventory": {"glass": 8, "wither_rose": 2, "lily_of_the_valley": 2, "blaze_rod": 2, "spider_eye": 5}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_stained_glass", 1], "ingredients": {"glass": 8, "gray_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x sugar, 2x cyan_terracotta", "id": "textcraft.train.250", "max_steps": 50, "misc": {"target_items": {"sugar": 1, "cyan_terracotta": 2}, "initial_inventory": {"sugar_cane": 1, "terracotta": 10, "cornflower": 1, "green_dye": 1, "egg": 4, "dandelion": 4, "spider_eye": 5}, "gold_trajectory": [{"action": "craft", "target": ["sugar", 1], "ingredients": {"sugar_cane": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_terracotta", 1], "ingredients": {"terracotta": 8, "cyan_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x brick_wall, 2x polished_blackstone_brick_stairs, 2x light_blue_wool", "id": "textcraft.train.262", "max_steps": 50, "misc": {"target_items": {"brick_wall": 1, "polished_blackstone_brick_stairs": 2, "light_blue_wool": 2}, "initial_inventory": {"brick": 32, "blackstone": 11, "cornflower": 1, "lily_of_the_valley": 2, "string": 12, "gunpowder": 5, "nautilus_shell": 4, "snowball": 1}, "gold_trajectory": [{"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_wall", 1], "ingredients": {"bricks": 6}, "result_count": 6}, {"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_bricks", 2], "ingredients": {"polished_blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_brick_stairs", 1], "ingredients": {"polished_blackstone_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["light_blue_wool", 2], "ingredients": {"light_blue_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x oak_sign, 2x brown_wool, 2x black_concrete_powder", "id": "textcraft.train.271", "max_steps": 50, "misc": {"target_items": {"oak_sign": 1, "brown_wool": 2, "black_concrete_powder": 2}, "initial_inventory": {"oak_log": 2, "acacia_log": 2, "cocoa_beans": 3, "string": 11, "wither_rose": 2, "sand": 6, "gravel": 5, "stripped_warped_stem": 4, "smooth_red_sandstone": 4, "allium": 1}, "gold_trajectory": [{"action": "craft", "target": ["oak_planks", 2], "ingredients": {"oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["oak_sign", 1], "ingredients": {"oak_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["brown_dye", 2], "ingredients": {"cocoa_beans": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["brown_wool", 2], "ingredients": {"brown_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["black_concrete_powder", 1], "ingredients": {"black_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x yellow_stained_glass_pane", "id": "textcraft.train.286", "max_steps": 50, "misc": {"target_items": {"yellow_stained_glass_pane": 2}, "initial_inventory": {"glass": 7, "dandelion": 1, "warped_fungus": 3, "beetroot": 4, "crying_obsidian": 3, "azure_bluet": 4, "bamboo": 4}, "gold_trajectory": [{"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["yellow_dye", 1], "ingredients": {"dandelion": 1}, "result_count": 1}, {"action": "craft", "target": ["yellow_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "yellow_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x end_stone_brick_slab, 3x fire_charge, 3x painting", "id": "textcraft.train.290", "max_steps": 50, "misc": {"target_items": {"end_stone_brick_slab": 3, "fire_charge": 3, "painting": 3}, "initial_inventory": {"end_stone": 5, "gunpowder": 1, "blaze_rod": 1, "acacia_log": 4, "wither_rose": 3, "string": 18, "prismarine_shard": 4, "pumpkin": 2, "stone": 4, "vine": 4}, "gold_trajectory": [{"action": "craft", "target": ["end_stone_bricks", 1], "ingredients": {"end_stone": 4}, "result_count": 4}, {"action": "craft", "target": ["end_stone_brick_slab", 1], "ingredients": {"end_stone_bricks": 3}, "result_count": 6}, {"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["fire_charge", 1], "ingredients": {"gunpowder": 1, "blaze_powder": 1}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["stick", 6], "ingredients": {"acacia_planks": 12}, "result_count": 24}, {"action": "craft", "target": ["black_dye", 3], "ingredients": {"wither_rose": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["black_wool", 3], "ingredients": {"black_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["painting", 3], "ingredients": {"stick": 24, "black_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x polished_granite_slab", "id": "textcraft.train.299", "max_steps": 50, "misc": {"target_items": {"polished_granite_slab": 2}, "initial_inventory": {"cobblestone": 5, "quartz": 11, "netherite_scrap": 5, "obsidian": 3, "prismarine_shard": 4, "egg": 2}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 4], "ingredients": {"diorite": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite", 1], "ingredients": {"granite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite_slab", 1], "ingredients": {"polished_granite": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x black_banner, 3x sugar", "id": "textcraft.train.307", "max_steps": 50, "misc": {"target_items": {"black_banner": 3, "sugar": 3}, "initial_inventory": {"wither_rose": 23, "string": 73, "acacia_log": 2, "sugar_cane": 3, "stone": 5, "terracotta": 1}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 18], "ingredients": {"wither_rose": 18}, "result_count": 18}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["black_wool", 18], "ingredients": {"black_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["black_banner", 3], "ingredients": {"black_wool": 18, "stick": 3}, "result_count": 3}, {"action": "craft", "target": ["sugar", 3], "ingredients": {"sugar_cane": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x jack_o_lantern, 2x nether_brick_slab", "id": "textcraft.train.307", "max_steps": 50, "misc": {"target_items": {"jack_o_lantern": 1, "nether_brick_slab": 2}, "initial_inventory": {"carved_pumpkin": 1, "acacia_log": 2, "nether_brick": 18, "scute": 2, "string": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}, {"action": "craft", "target": ["jack_o_lantern", 1], "ingredients": {"carved_pumpkin": 1, "torch": 1}, "result_count": 1}, {"action": "craft", "target": ["nether_bricks", 3], "ingredients": {"nether_brick": 12}, "result_count": 3}, {"action": "craft", "target": ["nether_brick_slab", 1], "ingredients": {"nether_bricks": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x diorite_wall", "id": "textcraft.train.313", "max_steps": 50, "misc": {"target_items": {"diorite_wall": 1}, "initial_inventory": {"cobblestone": 7, "quartz": 9, "stripped_dark_oak_log": 5, "smooth_quartz": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_wall", 1], "ingredients": {"diorite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x wooden_axe", "id": "textcraft.train.315", "max_steps": 50, "misc": {"target_items": {"wooden_axe": 3}, "initial_inventory": {"acacia_log": 4, "egg": 4, "pink_tulip": 1, "baked_potato": 5, "peony": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["wooden_axe", 3], "ingredients": {"acacia_planks": 9, "stick": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x polished_blackstone_brick_stairs", "id": "textcraft.train.325", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_brick_stairs": 1}, "initial_inventory": {"blackstone": 8, "nether_star": 5, "blaze_rod": 5, "feather": 3}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_bricks", 2], "ingredients": {"polished_blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_brick_stairs", 1], "ingredients": {"polished_blackstone_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x stone_sword, 1x prismarine_wall", "id": "textcraft.train.339", "max_steps": 50, "misc": {"target_items": {"stone_sword": 3, "prismarine_wall": 1}, "initial_inventory": {"blackstone": 8, "acacia_log": 2, "prismarine_shard": 31, "string": 1, "nautilus_shell": 1, "brick": 4, "sugar_cane": 3, "glass": 5}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_sword", 3], "ingredients": {"blackstone": 6, "stick": 3}, "result_count": 3}, {"action": "craft", "target": ["prismarine", 6], "ingredients": {"prismarine_shard": 24}, "result_count": 6}, {"action": "craft", "target": ["prismarine_wall", 1], "ingredients": {"prismarine": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x ender_eye, 2x blue_dye", "id": "textcraft.train.353", "max_steps": 50, "misc": {"target_items": {"ender_eye": 1, "blue_dye": 2}, "initial_inventory": {"ender_pearl": 1, "blaze_rod": 1, "cornflower": 3, "string": 4, "stripped_oak_log": 2, "spruce_log": 4, "azure_bluet": 3}, "gold_trajectory": [{"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["ender_eye", 1], "ingredients": {"ender_pearl": 1, "blaze_powder": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_dye", 2], "ingredients": {"cornflower": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x oak_sign, 2x fermented_spider_eye, 1x andesite_stairs", "id": "textcraft.train.360", "max_steps": 50, "misc": {"target_items": {"oak_sign": 1, "fermented_spider_eye": 2, "andesite_stairs": 1}, "initial_inventory": {"oak_log": 2, "acacia_log": 1, "spider_eye": 3, "brown_mushroom": 2, "sugar_cane": 2, "cobblestone": 10, "quartz": 6, "lilac": 2, "ghast_tear": 2, "ink_sac": 2}, "gold_trajectory": [{"action": "craft", "target": ["oak_planks", 2], "ingredients": {"oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["oak_sign", 1], "ingredients": {"oak_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["sugar", 2], "ingredients": {"sugar_cane": 2}, "result_count": 2}, {"action": "craft", "target": ["fermented_spider_eye", 2], "ingredients": {"spider_eye": 2, "brown_mushroom": 2, "sugar": 2}, "result_count": 2}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 3], "ingredients": {"diorite": 3, "cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["andesite_stairs", 1], "ingredients": {"andesite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x polished_diorite, 2x mossy_stone_brick_stairs, 1x orange_dye", "id": "textcraft.train.365", "max_steps": 50, "misc": {"target_items": {"polished_diorite": 2, "mossy_stone_brick_stairs": 2, "orange_dye": 1}, "initial_inventory": {"cobblestone": 6, "quartz": 5, "stone": 11, "vine": 6, "orange_tulip": 1, "egg": 3, "cornflower": 5, "beetroot": 5, "terracotta": 3, "oxeye_daisy": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}, {"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["mossy_stone_bricks", 6], "ingredients": {"stone_bricks": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_stone_brick_stairs", 1], "ingredients": {"mossy_stone_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x spruce_fence", "id": "textcraft.train.373", "max_steps": 50, "misc": {"target_items": {"spruce_fence": 2}, "initial_inventory": {"spruce_log": 2, "acacia_log": 2, "prismarine_shard": 1, "scute": 1, "enchanted_golden_apple": 1}, "gold_trajectory": [{"action": "craft", "target": ["spruce_planks", 1], "ingredients": {"spruce_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"spruce_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["spruce_planks", 1], "ingredients": {"spruce_log": 1}, "result_count": 4}, {"action": "craft", "target": ["spruce_fence", 1], "ingredients": {"spruce_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x lime_stained_glass", "id": "textcraft.train.378", "max_steps": 50, "misc": {"target_items": {"lime_stained_glass": 3}, "initial_inventory": {"glass": 10, "green_dye": 1, "lily_of_the_valley": 2, "nether_wart": 5, "nether_brick": 4, "lilac": 4}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_stained_glass", 1], "ingredients": {"glass": 8, "lime_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x green_stained_glass_pane, 2x cut_red_sandstone_slab", "id": "textcraft.train.382", "max_steps": 50, "misc": {"target_items": {"green_stained_glass_pane": 2, "cut_red_sandstone_slab": 2}, "initial_inventory": {"glass": 7, "green_dye": 1, "red_sand": 22, "nether_star": 5, "crying_obsidian": 4, "clay_ball": 4}, "gold_trajectory": [{"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["green_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "green_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["red_sandstone", 4], "ingredients": {"red_sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone", 1], "ingredients": {"red_sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone_slab", 1], "ingredients": {"cut_red_sandstone": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x cut_sandstone", "id": "textcraft.train.386", "max_steps": 50, "misc": {"target_items": {"cut_sandstone": 1}, "initial_inventory": {"sand": 18, "sugar_cane": 5, "oak_log": 2, "carved_pumpkin": 3}, "gold_trajectory": [{"action": "craft", "target": ["sandstone", 4], "ingredients": {"sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_sandstone", 1], "ingredients": {"sandstone": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x diorite_wall", "id": "textcraft.train.387", "max_steps": 50, "misc": {"target_items": {"diorite_wall": 1}, "initial_inventory": {"cobblestone": 7, "quartz": 9, "obsidian": 2, "egg": 1}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_wall", 1], "ingredients": {"diorite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x flower_banner_pattern", "id": "textcraft.train.388", "max_steps": 50, "misc": {"target_items": {"flower_banner_pattern": 2}, "initial_inventory": {"sugar_cane": 4, "oxeye_daisy": 2, "lilac": 3, "carrot": 3, "heart_of_the_sea": 3, "dirt": 1, "poppy": 1}, "gold_trajectory": [{"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["flower_banner_pattern", 2], "ingredients": {"paper": 2, "oxeye_daisy": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x brown_stained_glass, 1x nether_brick_fence, 3x jungle_sign", "id": "textcraft.train.392", "max_steps": 50, "misc": {"target_items": {"brown_stained_glass": 2, "nether_brick_fence": 1, "jungle_sign": 3}, "initial_inventory": {"glass": 9, "cocoa_beans": 1, "nether_brick": 26, "jungle_log": 2, "acacia_log": 1, "warped_fungus": 5, "blue_orchid": 3, "azure_bluet": 5, "stripped_birch_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_stained_glass", 1], "ingredients": {"glass": 8, "brown_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["nether_bricks", 4], "ingredients": {"nether_brick": 16}, "result_count": 4}, {"action": "craft", "target": ["nether_brick_fence", 1], "ingredients": {"nether_bricks": 4, "nether_brick": 2}, "result_count": 6}, {"action": "craft", "target": ["jungle_planks", 2], "ingredients": {"jungle_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"jungle_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["jungle_sign", 1], "ingredients": {"jungle_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x andesite_stairs, 1x brown_stained_glass_pane", "id": "textcraft.train.420", "max_steps": 50, "misc": {"target_items": {"andesite_stairs": 2, "brown_stained_glass_pane": 1}, "initial_inventory": {"cobblestone": 10, "quartz": 4, "glass": 12, "cocoa_beans": 2, "string": 4, "stripped_crimson_stem": 4}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 3], "ingredients": {"diorite": 3, "cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["andesite_stairs", 1], "ingredients": {"andesite": 6}, "result_count": 4}, {"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_stained_glass", 1], "ingredients": {"glass": 8, "brown_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["brown_stained_glass_pane", 1], "ingredients": {"brown_stained_glass": 6}, "result_count": 16}]}} +{"goal": "Craft the following items: 3x andesite_stairs, 2x polished_blackstone_brick_stairs", "id": "textcraft.train.435", "max_steps": 50, "misc": {"target_items": {"andesite_stairs": 3, "polished_blackstone_brick_stairs": 2}, "initial_inventory": {"cobblestone": 7, "quartz": 4, "blackstone": 10, "prismarine_crystals": 5, "orange_tulip": 4, "poppy": 1}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 3], "ingredients": {"diorite": 3, "cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["andesite_stairs", 1], "ingredients": {"andesite": 6}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_bricks", 2], "ingredients": {"polished_blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_brick_stairs", 1], "ingredients": {"polished_blackstone_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x leather_leggings", "id": "textcraft.train.441", "max_steps": 50, "misc": {"target_items": {"leather_leggings": 1}, "initial_inventory": {"rabbit_hide": 37, "bamboo": 5, "smooth_sandstone": 4, "honeycomb": 4, "dirt": 1}, "gold_trajectory": [{"action": "craft", "target": ["leather", 7], "ingredients": {"rabbit_hide": 28}, "result_count": 7}, {"action": "craft", "target": ["leather_leggings", 1], "ingredients": {"leather": 7}, "result_count": 1}]}} +{"goal": "Craft the following items: 2x birch_sign, 3x polished_granite_stairs", "id": "textcraft.train.448", "max_steps": 50, "misc": {"target_items": {"birch_sign": 2, "polished_granite_stairs": 3}, "initial_inventory": {"birch_log": 2, "acacia_log": 2, "cobblestone": 9, "quartz": 16, "gravel": 2, "nether_wart": 4, "cocoa_beans": 4, "end_stone": 3, "netherite_scrap": 5}, "gold_trajectory": [{"action": "craft", "target": ["birch_planks", 2], "ingredients": {"birch_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"birch_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["birch_sign", 1], "ingredients": {"birch_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["diorite", 4], "ingredients": {"cobblestone": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["granite", 8], "ingredients": {"diorite": 8, "quartz": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_granite", 2], "ingredients": {"granite": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_granite_stairs", 1], "ingredients": {"polished_granite": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x item_frame", "id": "textcraft.train.452", "max_steps": 50, "misc": {"target_items": {"item_frame": 1}, "initial_inventory": {"acacia_log": 1, "rabbit_hide": 4, "sand": 4, "snowball": 5, "jungle_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 2], "ingredients": {"acacia_planks": 4}, "result_count": 8}, {"action": "craft", "target": ["leather", 1], "ingredients": {"rabbit_hide": 4}, "result_count": 1}, {"action": "craft", "target": ["item_frame", 1], "ingredients": {"stick": 8, "leather": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x book, 2x polished_diorite_slab, 2x light_blue_wool", "id": "textcraft.train.456", "max_steps": 50, "misc": {"target_items": {"book": 1, "polished_diorite_slab": 2, "light_blue_wool": 2}, "initial_inventory": {"sugar_cane": 4, "rabbit_hide": 6, "cobblestone": 5, "quartz": 4, "cornflower": 1, "lily_of_the_valley": 1, "string": 11, "egg": 5, "snowball": 1, "melon_slice": 1}, "gold_trajectory": [{"action": "craft", "target": ["paper", 1], "ingredients": {"sugar_cane": 3}, "result_count": 3}, {"action": "craft", "target": ["leather", 1], "ingredients": {"rabbit_hide": 4}, "result_count": 1}, {"action": "craft", "target": ["book", 1], "ingredients": {"paper": 3, "leather": 1}, "result_count": 1}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite_slab", 1], "ingredients": {"polished_diorite": 3}, "result_count": 6}, {"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["light_blue_wool", 2], "ingredients": {"light_blue_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 2x pink_terracotta", "id": "textcraft.train.456", "max_steps": 50, "misc": {"target_items": {"pink_terracotta": 2}, "initial_inventory": {"terracotta": 11, "pink_tulip": 1, "lilac": 5, "gunpowder": 2, "melon_slice": 5, "bamboo": 5}, "gold_trajectory": [{"action": "craft", "target": ["pink_dye", 1], "ingredients": {"pink_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["pink_terracotta", 1], "ingredients": {"terracotta": 8, "pink_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x spectral_arrow, 2x painting", "id": "textcraft.train.480", "max_steps": 50, "misc": {"target_items": {"spectral_arrow": 1, "painting": 2}, "initial_inventory": {"glowstone_dust": 6, "flint": 2, "acacia_log": 4, "feather": 1, "wither_rose": 3, "string": 10, "birch_planks": 8, "blaze_rod": 4, "stripped_birch_log": 1, "baked_potato": 3, "cobblestone": 1, "gravel": 1}, "gold_trajectory": [{"action": "craft", "target": ["stick", 1], "ingredients": {"birch_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["arrow", 1], "ingredients": {"flint": 1, "stick": 1, "feather": 1}, "result_count": 4}, {"action": "craft", "target": ["spectral_arrow", 1], "ingredients": {"glowstone_dust": 4, "arrow": 1}, "result_count": 2}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 4], "ingredients": {"tag:planks": 8}, "result_count": 16}, {"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["black_wool", 2], "ingredients": {"black_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["painting", 2], "ingredients": {"stick": 16, "black_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x dark_prismarine_stairs, 3x torch", "id": "textcraft.train.481", "max_steps": 50, "misc": {"target_items": {"dark_prismarine_stairs": 1, "torch": 3}, "initial_inventory": {"prismarine_shard": 63, "wither_rose": 8, "acacia_log": 1, "stripped_oak_log": 1, "dandelion": 2, "smooth_sandstone": 4}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 6], "ingredients": {"wither_rose": 6}, "result_count": 6}, {"action": "craft", "target": ["dark_prismarine", 6], "ingredients": {"prismarine_shard": 48, "black_dye": 6}, "result_count": 6}, {"action": "craft", "target": ["dark_prismarine_stairs", 1], "ingredients": {"dark_prismarine": 6}, "result_count": 4}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x blue_concrete_powder", "id": "textcraft.train.481", "max_steps": 50, "misc": {"target_items": {"blue_concrete_powder": 3}, "initial_inventory": {"cornflower": 1, "sand": 6, "gravel": 4, "nether_brick": 3, "obsidian": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_concrete_powder", 1], "ingredients": {"blue_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x brick_stairs", "id": "textcraft.train.481", "max_steps": 50, "misc": {"target_items": {"brick_stairs": 2}, "initial_inventory": {"brick": 30, "smooth_quartz": 2, "scute": 4, "dirt": 2, "crimson_stem": 3}, "gold_trajectory": [{"action": "craft", "target": ["bricks", 6], "ingredients": {"brick": 24}, "result_count": 6}, {"action": "craft", "target": ["brick_stairs", 1], "ingredients": {"bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x torch, 2x leather_boots", "id": "textcraft.train.485", "max_steps": 50, "misc": {"target_items": {"torch": 1, "leather_boots": 2}, "initial_inventory": {"acacia_log": 2, "rabbit_hide": 32, "warped_fungus": 2, "crying_obsidian": 3, "dark_oak_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}, {"action": "craft", "target": ["leather", 8], "ingredients": {"rabbit_hide": 32}, "result_count": 8}, {"action": "craft", "target": ["leather_boots", 2], "ingredients": {"leather": 8}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x sugar, 2x orange_concrete_powder", "id": "textcraft.train.509", "max_steps": 50, "misc": {"target_items": {"sugar": 1, "orange_concrete_powder": 2}, "initial_inventory": {"sugar_cane": 1, "orange_tulip": 1, "sand": 4, "gravel": 4, "nether_star": 1, "lilac": 2, "melon_slice": 4, "egg": 2}, "gold_trajectory": [{"action": "craft", "target": ["sugar", 1], "ingredients": {"sugar_cane": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_dye", 1], "ingredients": {"orange_tulip": 1}, "result_count": 1}, {"action": "craft", "target": ["orange_concrete_powder", 1], "ingredients": {"orange_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x polished_blackstone_brick_stairs", "id": "textcraft.train.511", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_brick_stairs": 2}, "initial_inventory": {"blackstone": 9, "spider_eye": 3, "blaze_rod": 1}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 2], "ingredients": {"blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_bricks", 2], "ingredients": {"polished_blackstone": 8}, "result_count": 8}, {"action": "craft", "target": ["polished_blackstone_brick_stairs", 1], "ingredients": {"polished_blackstone_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 2x light_blue_terracotta", "id": "textcraft.train.528", "max_steps": 50, "misc": {"target_items": {"light_blue_terracotta": 2}, "initial_inventory": {"terracotta": 8, "cornflower": 1, "lily_of_the_valley": 1, "dandelion": 4, "red_tulip": 1, "nether_brick": 3, "stone": 5, "wither_rose": 5}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_terracotta", 1], "ingredients": {"terracotta": 8, "light_blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x gray_concrete_powder, 1x leather_helmet", "id": "textcraft.train.537", "max_steps": 50, "misc": {"target_items": {"gray_concrete_powder": 2, "leather_helmet": 1}, "initial_inventory": {"wither_rose": 2, "lily_of_the_valley": 2, "sand": 6, "gravel": 5, "rabbit_hide": 25, "nether_star": 4, "white_tulip": 4, "ink_sac": 4, "smooth_sandstone": 4, "ghast_tear": 4}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_concrete_powder", 1], "ingredients": {"gray_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["leather", 5], "ingredients": {"rabbit_hide": 20}, "result_count": 5}, {"action": "craft", "target": ["leather_helmet", 1], "ingredients": {"leather": 5}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x dark_oak_sign", "id": "textcraft.train.543", "max_steps": 50, "misc": {"target_items": {"dark_oak_sign": 3}, "initial_inventory": {"dark_oak_log": 3, "acacia_log": 2, "warped_stem": 4, "string": 3, "smooth_sandstone": 5, "red_tulip": 1, "oak_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["dark_oak_planks", 2], "ingredients": {"dark_oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"dark_oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["dark_oak_sign", 1], "ingredients": {"dark_oak_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x cyan_terracotta", "id": "textcraft.train.550", "max_steps": 50, "misc": {"target_items": {"cyan_terracotta": 1}, "initial_inventory": {"terracotta": 8, "cornflower": 2, "green_dye": 2, "stripped_dark_oak_log": 4, "baked_potato": 5, "stripped_oak_log": 1, "nether_star": 4, "bamboo": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_terracotta", 1], "ingredients": {"terracotta": 8, "cyan_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x mossy_stone_brick_stairs, 1x green_bed", "id": "textcraft.train.559", "max_steps": 50, "misc": {"target_items": {"mossy_stone_brick_stairs": 2, "green_bed": 1}, "initial_inventory": {"stone": 11, "vine": 9, "green_dye": 3, "string": 13, "acacia_log": 2, "cornflower": 3, "baked_potato": 4}, "gold_trajectory": [{"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["mossy_stone_bricks", 6], "ingredients": {"stone_bricks": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_stone_brick_stairs", 1], "ingredients": {"mossy_stone_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["green_wool", 3], "ingredients": {"green_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["green_bed", 1], "ingredients": {"green_wool": 3, "acacia_planks": 3}, "result_count": 1}]}} +{"goal": "Craft the following items: 1x torch", "id": "textcraft.train.562", "max_steps": 50, "misc": {"target_items": {"torch": 1}, "initial_inventory": {"acacia_log": 2, "blaze_rod": 3, "sand": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["torch", 1], "ingredients": {"stick": 1}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x white_stained_glass, 3x polished_diorite", "id": "textcraft.train.571", "max_steps": 50, "misc": {"target_items": {"white_stained_glass": 3, "polished_diorite": 3}, "initial_inventory": {"glass": 10, "lily_of_the_valley": 1, "cobblestone": 4, "quartz": 4, "lilac": 5, "spider_eye": 3, "end_stone": 2, "milk_bucket": 3, "string": 2}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["white_stained_glass", 1], "ingredients": {"glass": 8, "white_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_diorite", 1], "ingredients": {"diorite": 4}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x prismarine_brick_stairs, 1x red_carpet", "id": "textcraft.train.573", "max_steps": 50, "misc": {"target_items": {"prismarine_brick_stairs": 1, "red_carpet": 1}, "initial_inventory": {"prismarine_shard": 80, "rose_bush": 2, "string": 9, "sunflower": 3, "ghast_tear": 4, "scute": 5, "end_stone": 5, "egg": 3}, "gold_trajectory": [{"action": "craft", "target": ["prismarine_bricks", 6], "ingredients": {"prismarine_shard": 54}, "result_count": 6}, {"action": "craft", "target": ["prismarine_brick_stairs", 1], "ingredients": {"prismarine_bricks": 6}, "result_count": 4}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["red_wool", 2], "ingredients": {"red_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["red_carpet", 1], "ingredients": {"red_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x polished_blackstone_slab", "id": "textcraft.train.576", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_slab": 2}, "initial_inventory": {"blackstone": 6, "spider_eye": 1, "smooth_stone": 2}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_slab", 1], "ingredients": {"polished_blackstone": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x diorite_wall", "id": "textcraft.train.615", "max_steps": 50, "misc": {"target_items": {"diorite_wall": 1}, "initial_inventory": {"cobblestone": 8, "quartz": 9, "white_tulip": 2, "end_stone": 1, "blue_orchid": 2, "ice": 2}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 3], "ingredients": {"cobblestone": 6, "quartz": 6}, "result_count": 6}, {"action": "craft", "target": ["diorite_wall", 1], "ingredients": {"diorite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 2x spruce_fence", "id": "textcraft.train.620", "max_steps": 50, "misc": {"target_items": {"spruce_fence": 2}, "initial_inventory": {"spruce_log": 2, "acacia_log": 1, "stripped_oak_log": 4, "basalt": 2, "stone": 1}, "gold_trajectory": [{"action": "craft", "target": ["spruce_planks", 1], "ingredients": {"spruce_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"spruce_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["spruce_planks", 1], "ingredients": {"spruce_log": 1}, "result_count": 4}, {"action": "craft", "target": ["spruce_fence", 1], "ingredients": {"spruce_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x black_banner", "id": "textcraft.train.641", "max_steps": 50, "misc": {"target_items": {"black_banner": 3}, "initial_inventory": {"wither_rose": 25, "string": 100, "acacia_log": 1, "obsidian": 4, "warped_stem": 5, "ink_sac": 3, "melon_slice": 4, "blaze_rod": 5}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 18], "ingredients": {"wither_rose": 18}, "result_count": 18}, {"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["black_wool", 18], "ingredients": {"black_dye": 18, "white_wool": 18}, "result_count": 18}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["black_banner", 3], "ingredients": {"black_wool": 18, "stick": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x polished_granite_slab, 2x red_concrete_powder, 2x oak_sign", "id": "textcraft.train.645", "max_steps": 50, "misc": {"target_items": {"polished_granite_slab": 3, "red_concrete_powder": 2, "oak_sign": 2}, "initial_inventory": {"cobblestone": 4, "quartz": 9, "rose_bush": 1, "sand": 4, "gravel": 6, "oak_log": 2, "acacia_log": 1, "spruce_log": 2, "stripped_dark_oak_log": 1}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["granite", 4], "ingredients": {"diorite": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite", 1], "ingredients": {"granite": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_granite_slab", 1], "ingredients": {"polished_granite": 3}, "result_count": 6}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["red_concrete_powder", 1], "ingredients": {"red_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}, {"action": "craft", "target": ["oak_planks", 2], "ingredients": {"oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"oak_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["oak_sign", 1], "ingredients": {"oak_planks": 6, "stick": 1}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x acacia_sign, 3x oak_fence_gate", "id": "textcraft.train.652", "max_steps": 50, "misc": {"target_items": {"acacia_sign": 1, "oak_fence_gate": 3}, "initial_inventory": {"acacia_log": 7, "oak_log": 2, "oxeye_daisy": 3, "scute": 4, "cobblestone": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["acacia_sign", 1], "ingredients": {"acacia_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["oak_planks", 2], "ingredients": {"oak_log": 2}, "result_count": 8}, {"action": "craft", "target": ["oak_fence_gate", 3], "ingredients": {"stick": 12, "oak_planks": 6}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x ender_eye", "id": "textcraft.train.663", "max_steps": 50, "misc": {"target_items": {"ender_eye": 2}, "initial_inventory": {"ender_pearl": 3, "blaze_rod": 1, "heart_of_the_sea": 2, "sunflower": 2, "enchanted_golden_apple": 5, "red_sand": 4, "peony": 2}, "gold_trajectory": [{"action": "craft", "target": ["blaze_powder", 1], "ingredients": {"blaze_rod": 1}, "result_count": 2}, {"action": "craft", "target": ["ender_eye", 2], "ingredients": {"ender_pearl": 2, "blaze_powder": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x cut_red_sandstone_slab", "id": "textcraft.train.663", "max_steps": 50, "misc": {"target_items": {"cut_red_sandstone_slab": 3}, "initial_inventory": {"red_sand": 19, "flint": 3, "pumpkin": 5, "peony": 5}, "gold_trajectory": [{"action": "craft", "target": ["red_sandstone", 4], "ingredients": {"red_sand": 16}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone", 1], "ingredients": {"red_sandstone": 4}, "result_count": 4}, {"action": "craft", "target": ["cut_red_sandstone_slab", 1], "ingredients": {"cut_red_sandstone": 3}, "result_count": 6}]}} +{"goal": "Craft the following items: 1x green_stained_glass_pane, 2x spruce_sign, 2x orange_wool", "id": "textcraft.train.671", "max_steps": 50, "misc": {"target_items": {"green_stained_glass_pane": 1, "spruce_sign": 2, "orange_wool": 2}, "initial_inventory": {"glass": 7, "green_dye": 1, "spruce_log": 2, "acacia_log": 1, "orange_tulip": 3, "string": 8, "stripped_birch_log": 3, "lily_of_the_valley": 1}, "gold_trajectory": [{"action": "craft", "target": ["glass_pane", 1], "ingredients": {"glass": 6}, "result_count": 16}, {"action": "craft", "target": ["green_stained_glass_pane", 1], "ingredients": {"glass_pane": 8, "green_dye": 1}, "result_count": 8}, {"action": "craft", "target": ["spruce_planks", 2], "ingredients": {"spruce_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 1], "ingredients": {"spruce_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["spruce_sign", 1], "ingredients": {"spruce_planks": 6, "stick": 1}, "result_count": 3}, {"action": "craft", "target": ["orange_dye", 2], "ingredients": {"orange_tulip": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["orange_wool", 2], "ingredients": {"orange_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 3x stone_sword", "id": "textcraft.train.677", "max_steps": 50, "misc": {"target_items": {"stone_sword": 3}, "initial_inventory": {"blackstone": 6, "acacia_log": 1, "honeycomb": 5, "obsidian": 5, "rabbit_hide": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_sword", 3], "ingredients": {"blackstone": 6, "stick": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x brown_terracotta", "id": "textcraft.train.693", "max_steps": 50, "misc": {"target_items": {"brown_terracotta": 1}, "initial_inventory": {"terracotta": 11, "cocoa_beans": 1, "green_dye": 3, "honeycomb": 2}, "gold_trajectory": [{"action": "craft", "target": ["brown_dye", 1], "ingredients": {"cocoa_beans": 1}, "result_count": 1}, {"action": "craft", "target": ["brown_terracotta", 1], "ingredients": {"terracotta": 8, "brown_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x black_carpet", "id": "textcraft.train.696", "max_steps": 50, "misc": {"target_items": {"black_carpet": 3}, "initial_inventory": {"wither_rose": 3, "string": 9, "orange_tulip": 1, "apple": 1}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 2], "ingredients": {"wither_rose": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["black_wool", 2], "ingredients": {"black_dye": 2, "white_wool": 2}, "result_count": 2}, {"action": "craft", "target": ["black_carpet", 1], "ingredients": {"black_wool": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x yellow_wool", "id": "textcraft.train.707", "max_steps": 50, "misc": {"target_items": {"yellow_wool": 2}, "initial_inventory": {"dandelion": 2, "string": 12, "smooth_quartz": 5, "stripped_jungle_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["yellow_dye", 2], "ingredients": {"dandelion": 2}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 2], "ingredients": {"string": 8}, "result_count": 2}, {"action": "craft", "target": ["yellow_wool", 2], "ingredients": {"yellow_dye": 2, "white_wool": 2}, "result_count": 2}]}} +{"goal": "Craft the following items: 1x andesite_wall", "id": "textcraft.train.711", "max_steps": 50, "misc": {"target_items": {"andesite_wall": 1}, "initial_inventory": {"cobblestone": 7, "quartz": 4, "milk_bucket": 4, "red_tulip": 1, "ghast_tear": 1, "ink_sac": 4, "stripped_spruce_log": 2}, "gold_trajectory": [{"action": "craft", "target": ["diorite", 2], "ingredients": {"cobblestone": 4, "quartz": 4}, "result_count": 4}, {"action": "craft", "target": ["andesite", 3], "ingredients": {"diorite": 3, "cobblestone": 3}, "result_count": 6}, {"action": "craft", "target": ["andesite_wall", 1], "ingredients": {"andesite": 6}, "result_count": 6}]}} +{"goal": "Craft the following items: 3x blue_concrete_powder", "id": "textcraft.train.713", "max_steps": 50, "misc": {"target_items": {"blue_concrete_powder": 3}, "initial_inventory": {"cornflower": 2, "sand": 5, "gravel": 4, "white_tulip": 5, "terracotta": 3, "warped_stem": 4}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["blue_concrete_powder", 1], "ingredients": {"blue_dye": 1, "sand": 4, "gravel": 4}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x lime_stained_glass", "id": "textcraft.train.736", "max_steps": 50, "misc": {"target_items": {"lime_stained_glass": 3}, "initial_inventory": {"glass": 8, "green_dye": 1, "lily_of_the_valley": 1, "stripped_birch_log": 4, "creeper_head": 2, "stone": 5, "crimson_stem": 3, "snowball": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_stained_glass", 1], "ingredients": {"glass": 8, "lime_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x polished_blackstone_button, 3x light_gray_dye, 3x leather_helmet", "id": "textcraft.train.737", "max_steps": 50, "misc": {"target_items": {"polished_blackstone_button": 1, "light_gray_dye": 3, "leather_helmet": 3}, "initial_inventory": {"blackstone": 4, "oxeye_daisy": 3, "rabbit_hide": 88, "smooth_quartz": 3, "pink_tulip": 2, "string": 5}, "gold_trajectory": [{"action": "craft", "target": ["polished_blackstone", 1], "ingredients": {"blackstone": 4}, "result_count": 4}, {"action": "craft", "target": ["polished_blackstone_button", 1], "ingredients": {"polished_blackstone": 1}, "result_count": 1}, {"action": "craft", "target": ["light_gray_dye", 3], "ingredients": {"oxeye_daisy": 3}, "result_count": 3}, {"action": "craft", "target": ["leather", 15], "ingredients": {"rabbit_hide": 60}, "result_count": 15}, {"action": "craft", "target": ["leather_helmet", 3], "ingredients": {"leather": 15}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x gray_terracotta", "id": "textcraft.train.771", "max_steps": 50, "misc": {"target_items": {"gray_terracotta": 3}, "initial_inventory": {"terracotta": 9, "wither_rose": 2, "lily_of_the_valley": 1, "stone": 4, "sand": 2, "spider_eye": 4}, "gold_trajectory": [{"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["gray_terracotta", 1], "ingredients": {"terracotta": 8, "gray_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x purple_stained_glass", "id": "textcraft.train.776", "max_steps": 50, "misc": {"target_items": {"purple_stained_glass": 2}, "initial_inventory": {"glass": 10, "cornflower": 2, "rose_bush": 2, "prismarine_crystals": 4, "stripped_dark_oak_log": 1, "string": 4, "nether_star": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["red_dye", 1], "ingredients": {"rose_bush": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_dye", 1], "ingredients": {"blue_dye": 1, "red_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["purple_stained_glass", 1], "ingredients": {"glass": 8, "purple_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 1x wooden_hoe, 1x stone_brick_stairs", "id": "textcraft.train.777", "max_steps": 50, "misc": {"target_items": {"wooden_hoe": 1, "stone_brick_stairs": 1}, "initial_inventory": {"acacia_log": 3, "stone": 10, "quartz": 1, "oak_log": 4, "creeper_head": 2, "wither_rose": 2}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["wooden_hoe", 1], "ingredients": {"acacia_planks": 2, "stick": 2}, "result_count": 1}, {"action": "craft", "target": ["stone_bricks", 2], "ingredients": {"stone": 8}, "result_count": 8}, {"action": "craft", "target": ["stone_brick_stairs", 1], "ingredients": {"stone_bricks": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x cyan_terracotta", "id": "textcraft.train.795", "max_steps": 50, "misc": {"target_items": {"cyan_terracotta": 1}, "initial_inventory": {"terracotta": 11, "cornflower": 2, "green_dye": 1, "ghast_tear": 3, "brown_mushroom": 1, "egg": 1, "string": 3}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["cyan_dye", 1], "ingredients": {"blue_dye": 1, "green_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["cyan_terracotta", 1], "ingredients": {"terracotta": 8, "cyan_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 2x bookshelf, 3x acacia_fence_gate, 1x warped_fence_gate", "id": "textcraft.train.797", "max_steps": 50, "misc": {"target_items": {"bookshelf": 2, "acacia_fence_gate": 3, "warped_fence_gate": 1}, "initial_inventory": {"acacia_log": 9, "sugar_cane": 19, "rabbit_hide": 24, "warped_stem": 2, "sunflower": 2, "gravel": 5, "scute": 5, "green_dye": 2}, "gold_trajectory": [{"action": "craft", "target": ["paper", 6], "ingredients": {"sugar_cane": 18}, "result_count": 18}, {"action": "craft", "target": ["leather", 6], "ingredients": {"rabbit_hide": 24}, "result_count": 6}, {"action": "craft", "target": ["book", 6], "ingredients": {"paper": 18, "leather": 6}, "result_count": 6}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["bookshelf", 2], "ingredients": {"acacia_planks": 12, "book": 6}, "result_count": 2}, {"action": "craft", "target": ["acacia_planks", 2], "ingredients": {"acacia_log": 2}, "result_count": 8}, {"action": "craft", "target": ["stick", 3], "ingredients": {"acacia_planks": 6}, "result_count": 12}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["acacia_fence_gate", 3], "ingredients": {"stick": 12, "acacia_planks": 6}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["warped_planks", 1], "ingredients": {"warped_stem": 1}, "result_count": 4}, {"action": "craft", "target": ["warped_fence_gate", 1], "ingredients": {"stick": 4, "warped_planks": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x lime_terracotta", "id": "textcraft.train.797", "max_steps": 50, "misc": {"target_items": {"lime_terracotta": 3}, "initial_inventory": {"terracotta": 8, "green_dye": 2, "lily_of_the_valley": 2, "crying_obsidian": 4, "glowstone_dust": 2, "acacia_log": 5, "cornflower": 3, "netherite_scrap": 5}, "gold_trajectory": [{"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["lime_dye", 1], "ingredients": {"green_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["lime_terracotta", 1], "ingredients": {"terracotta": 8, "lime_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x orange_bed", "id": "textcraft.train.818", "max_steps": 50, "misc": {"target_items": {"orange_bed": 3}, "initial_inventory": {"orange_tulip": 10, "string": 43, "acacia_log": 3, "stone": 4, "gunpowder": 3, "stripped_crimson_stem": 1}, "gold_trajectory": [{"action": "craft", "target": ["orange_dye", 9], "ingredients": {"orange_tulip": 9}, "result_count": 9}, {"action": "craft", "target": ["white_wool", 9], "ingredients": {"string": 36}, "result_count": 9}, {"action": "craft", "target": ["orange_wool", 9], "ingredients": {"orange_dye": 9, "white_wool": 9}, "result_count": 9}, {"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["orange_bed", 3], "ingredients": {"orange_wool": 9, "acacia_planks": 9}, "result_count": 3}]}} +{"goal": "Craft the following items: 2x light_blue_terracotta", "id": "textcraft.train.827", "max_steps": 50, "misc": {"target_items": {"light_blue_terracotta": 2}, "initial_inventory": {"terracotta": 9, "cornflower": 1, "lily_of_the_valley": 1, "azure_bluet": 3, "poppy": 5}, "gold_trajectory": [{"action": "craft", "target": ["blue_dye", 1], "ingredients": {"cornflower": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["light_blue_dye", 1], "ingredients": {"blue_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["light_blue_terracotta", 1], "ingredients": {"terracotta": 8, "light_blue_dye": 1}, "result_count": 8}]}} +{"goal": "Craft the following items: 3x prismarine_stairs", "id": "textcraft.train.843", "max_steps": 50, "misc": {"target_items": {"prismarine_stairs": 3}, "initial_inventory": {"prismarine_shard": 31, "baked_potato": 1, "basalt": 3}, "gold_trajectory": [{"action": "craft", "target": ["prismarine", 6], "ingredients": {"prismarine_shard": 24}, "result_count": 6}, {"action": "craft", "target": ["prismarine_stairs", 1], "ingredients": {"prismarine": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 3x white_banner, 3x spruce_fence", "id": "textcraft.train.845", "max_steps": 50, "misc": {"target_items": {"white_banner": 3, "spruce_fence": 3}, "initial_inventory": {"string": 102, "acacia_log": 3, "spruce_log": 2, "stripped_oak_log": 2, "warped_fungus": 5, "pink_tulip": 3}, "gold_trajectory": [{"action": "craft", "target": ["white_wool", 18], "ingredients": {"string": 72}, "result_count": 18}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["white_banner", 3], "ingredients": {"white_wool": 18, "stick": 3}, "result_count": 3}, {"action": "craft", "target": ["spruce_planks", 1], "ingredients": {"spruce_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"spruce_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["spruce_planks", 1], "ingredients": {"spruce_log": 1}, "result_count": 4}, {"action": "craft", "target": ["spruce_fence", 1], "ingredients": {"spruce_planks": 4, "stick": 2}, "result_count": 3}]}} +{"goal": "Craft the following items: 3x mossy_cobblestone_wall, 1x red_bed", "id": "textcraft.train.849", "max_steps": 50, "misc": {"target_items": {"mossy_cobblestone_wall": 3, "red_bed": 1}, "initial_inventory": {"cobblestone": 9, "vine": 9, "rose_bush": 2, "string": 12, "acacia_log": 2, "white_tulip": 4, "cornflower": 3, "melon_slice": 1}, "gold_trajectory": [{"action": "craft", "target": ["mossy_cobblestone", 6], "ingredients": {"cobblestone": 6, "vine": 6}, "result_count": 6}, {"action": "craft", "target": ["mossy_cobblestone_wall", 1], "ingredients": {"mossy_cobblestone": 6}, "result_count": 6}, {"action": "craft", "target": ["red_dye", 2], "ingredients": {"rose_bush": 2}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["red_wool", 3], "ingredients": {"red_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["red_bed", 1], "ingredients": {"red_wool": 3, "acacia_planks": 3}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x painting, 1x gray_wool, 1x stone_axe", "id": "textcraft.train.849", "max_steps": 50, "misc": {"target_items": {"painting": 3, "gray_wool": 1, "stone_axe": 1}, "initial_inventory": {"acacia_log": 5, "wither_rose": 5, "string": 17, "lily_of_the_valley": 1, "blackstone": 3, "orange_tulip": 2, "cocoa_beans": 3, "enchanted_golden_apple": 1, "obsidian": 3}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 3], "ingredients": {"acacia_log": 3}, "result_count": 12}, {"action": "craft", "target": ["stick", 6], "ingredients": {"acacia_planks": 12}, "result_count": 24}, {"action": "craft", "target": ["black_dye", 3], "ingredients": {"wither_rose": 3}, "result_count": 3}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["black_wool", 3], "ingredients": {"black_dye": 3, "white_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["painting", 3], "ingredients": {"stick": 24, "black_wool": 3}, "result_count": 3}, {"action": "craft", "target": ["black_dye", 1], "ingredients": {"wither_rose": 1}, "result_count": 1}, {"action": "craft", "target": ["white_dye", 1], "ingredients": {"lily_of_the_valley": 1}, "result_count": 1}, {"action": "craft", "target": ["gray_dye", 1], "ingredients": {"black_dye": 1, "white_dye": 1}, "result_count": 2}, {"action": "craft", "target": ["white_wool", 1], "ingredients": {"string": 4}, "result_count": 1}, {"action": "craft", "target": ["gray_wool", 1], "ingredients": {"gray_dye": 1, "white_wool": 1}, "result_count": 1}, {"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_axe", 1], "ingredients": {"blackstone": 3, "stick": 2}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x prismarine_stairs", "id": "textcraft.train.871", "max_steps": 50, "misc": {"target_items": {"prismarine_stairs": 3}, "initial_inventory": {"prismarine_shard": 28, "sunflower": 4, "oxeye_daisy": 1, "heart_of_the_sea": 3}, "gold_trajectory": [{"action": "craft", "target": ["prismarine", 6], "ingredients": {"prismarine_shard": 24}, "result_count": 6}, {"action": "craft", "target": ["prismarine_stairs", 1], "ingredients": {"prismarine": 6}, "result_count": 4}]}} +{"goal": "Craft the following items: 1x carrot_on_a_stick", "id": "textcraft.train.896", "max_steps": 50, "misc": {"target_items": {"carrot_on_a_stick": 1}, "initial_inventory": {"acacia_log": 1, "string": 2, "carrot": 1, "stripped_crimson_stem": 2, "egg": 1, "stone": 4, "enchanted_golden_apple": 2, "stripped_oak_log": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["fishing_rod", 1], "ingredients": {"stick": 3, "string": 2}, "result_count": 1}, {"action": "craft", "target": ["carrot_on_a_stick", 1], "ingredients": {"fishing_rod": 1, "carrot": 1}, "result_count": 1}]}} +{"goal": "Craft the following items: 3x red_wool", "id": "textcraft.train.905", "max_steps": 50, "misc": {"target_items": {"red_wool": 3}, "initial_inventory": {"rose_bush": 3, "string": 16, "melon_slice": 3, "enchanted_golden_apple": 5, "ghast_tear": 1}, "gold_trajectory": [{"action": "craft", "target": ["red_dye", 2], "ingredients": {"rose_bush": 2}, "result_count": 4}, {"action": "craft", "target": ["white_wool", 3], "ingredients": {"string": 12}, "result_count": 3}, {"action": "craft", "target": ["red_wool", 3], "ingredients": {"red_dye": 3, "white_wool": 3}, "result_count": 3}]}} +{"goal": "Craft the following items: 1x stone_shovel, 3x prismarine_brick_stairs", "id": "textcraft.train.905", "max_steps": 50, "misc": {"target_items": {"stone_shovel": 1, "prismarine_brick_stairs": 3}, "initial_inventory": {"blackstone": 2, "acacia_log": 2, "prismarine_shard": 80, "enchanted_golden_apple": 5, "carrot": 5, "lilac": 3, "sugar_cane": 1, "end_stone": 4}, "gold_trajectory": [{"action": "craft", "target": ["acacia_planks", 1], "ingredients": {"acacia_log": 1}, "result_count": 4}, {"action": "craft", "target": ["stick", 1], "ingredients": {"acacia_planks": 2}, "result_count": 4}, {"action": "craft", "target": ["stone_shovel", 1], "ingredients": {"blackstone": 1, "stick": 2}, "result_count": 1}, {"action": "craft", "target": ["prismarine_bricks", 6], "ingredients": {"prismarine_shard": 54}, "result_count": 6}, {"action": "craft", "target": ["prismarine_brick_stairs", 1], "ingredients": {"prismarine_bricks": 6}, "result_count": 4}]}} diff --git a/astraflow/core/workflow/impl/textcraft/workflow.py b/astraflow/core/workflow/impl/textcraft/workflow.py new file mode 100644 index 0000000..7ff9412 --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/workflow.py @@ -0,0 +1,760 @@ +"""Recursive agent workflow for TextCraft. + +Design summary (see ``claude-doc/recursive-agent-textcraft-plan.md``): + +- Multi-turn agent loop. Each turn the model emits one ``{JSON}`` + block. Workflow parses, dispatches, returns an observation, appends to chat + history, calls the model again — until ``finish`` or budget exhausted. +- Recursion: ```` fans out up to ``max_breadth`` sub-agents + in parallel via ``asyncio.gather``. Each child is a full episode (its own + agent + forked env that shares parent's inventory by reference). +- Aggregation: parent sees only each child's ``finish_message`` wrapped in a + ``{msg}`` + block (Option A — platoon-faithful, bounded context). +- Trajectory tree → flat list of sequences inside one trajectory. Each agent + (root + every descendant) contributes one sequence with loss_mask=1 on its + own response tokens and 0 on its observations. Team reward broadcast. +""" + +from __future__ import annotations + +import asyncio +import json +import os +import random +import re +import uuid +from collections.abc import Callable +from dataclasses import dataclass, field +from typing import Any + +import aiofiles +import aiofiles.os +import torch +from transformers import PreTrainedTokenizerFast + +from astraflow.core.workflow.api.cli_args import GenerationHyperparameters +from astraflow.core.workflow.api.engine_api import InferenceEngine +from astraflow.core.workflow.api.io_struct import ModelRequest, ModelResponse +from astraflow.core.workflow.api.reward_api import AsyncRewardWrapper +from astraflow.core.workflow.api.workflow_api import RolloutWorkflow +from astraflow.core.workflow.registry import register_workflow +from astraflow.core.workflow.utils import logging, stats_tracker +from astraflow.core.workflow.utils.data import resolve_prompt_id +from astraflow.core.workflow.utils.dynamic_import import import_from_string +from astraflow.core.workflow.impl.textcraft.env import TextCraftEnv, get_default_recipe_db +from astraflow.core.workflow.impl.textcraft.task import Task +from astraflow.core.workflow.impl.textcraft.tasks import get_task + +logger = logging.getLogger("RecursiveAgent") + + +# --------------------------------------------------------------------------- +# System prompts +# --------------------------------------------------------------------------- + +MAIN_SYSTEM_PROMPT = """You are a TextCraft agent. Your goal is to craft target items using a shared inventory and a recipe database. + +You act by emitting EXACTLY ONE action block per turn, in this format: + {JSON args} + +After each action you will receive an observation as the next user message. Use it to decide your next action. + +Available actions: + +- get_info — Query recipe database for one or more items. + {"items": ["stick", "oak_planks"]} + +- view_inventory — Read current inventory. + {} + +- craft — Consume ingredients, produce target. target must be [item_name, total_count]; total_count must be divisible by the recipe's result_count. Ingredients must match the recipe exactly (no extras). + {"ingredients": {"oak_log": 1}, "target": ["oak_planks", 4]} + +- spawn — Dispatch 1-4 sub-agents in PARALLEL. Each shares your inventory by reference (their crafts affect you). Use this to delegate independent sub-goals (e.g. crafting different intermediates). + {"subtasks": [ + {"targets": {"oak_planks": 16}, "max_steps": 8}, + {"targets": {"stick": 8}, "max_steps": 5} + ]} + +- finish — End your episode with a brief summary. After finish, no more actions can be taken. + {"message": "crafted 4 wooden_pickaxe"} + +You share a step budget with any sub-agents you spawn. Be efficient. +""" + +SUB_SYSTEM_PROMPT = """You are a TextCraft sub-agent dispatched by a parent agent to complete a focused sub-task. You share the parent's inventory: items you craft become available to the parent. + +You act by emitting EXACTLY ONE action block per turn (same format as the parent): + {JSON args} + +After each action you will receive an observation as the next user message. Use it to decide your next action. + +Available actions: + +- get_info — Query recipe database for one or more items. + {"items": ["stick", "oak_planks"]} + +- view_inventory — Read current inventory. + {} + +- craft — Consume ingredients, produce target. target must be [item_name, total_count]; total_count must be divisible by the recipe's result_count. Ingredients must match the recipe exactly (no extras). + {"ingredients": {"oak_log": 1}, "target": ["oak_planks", 4]} + +- spawn — You MAY recurse and spawn your own sub-agents (depth-limited). Same syntax as the parent. + +- finish — End your episode with a CONCISE summary message; this message is the only thing the parent will see about your work. Be informative but brief. + {"message": "crafted 16 oak_planks"} + +You have a tight step budget. Solve your sub-task directly when possible. +""" + + +# --------------------------------------------------------------------------- +# Action parsing +# --------------------------------------------------------------------------- + +# Match the first {...} block. DOTALL so JSON +# args may span lines. Lazy match on the JSON body to stop at the first +# matching (handles trailing model text after the block). +_ACTION_RE = re.compile( + r"\s*(\{.*?\})\s*", + re.DOTALL, +) + + +@dataclass +class ParsedAction: + type: str + args: dict[str, Any] + error: str | None = None + raw_text: str = "" + + +def parse_action(text: str) -> ParsedAction: + """Extract the first {json} block.""" + m = _ACTION_RE.search(text) + if not m: + return ParsedAction( + type="__noaction__", + args={}, + error="no {...} block found in response", + raw_text=text, + ) + action_type = m.group(1) + try: + args = json.loads(m.group(2)) + except json.JSONDecodeError as e: + return ParsedAction( + type=action_type, + args={}, + error=f"action JSON decode failed: {e}", + raw_text=m.group(0), + ) + if not isinstance(args, dict): + return ParsedAction( + type=action_type, + args={}, + error=f"action args must be a JSON object, got {type(args).__name__}", + raw_text=m.group(0), + ) + return ParsedAction(type=action_type, args=args, raw_text=m.group(0)) + + +def validate_action(action: ParsedAction) -> str | None: + """Return None if valid, else an error string.""" + if action.error is not None: + return action.error + if action.type not in {"get_info", "view_inventory", "craft", "spawn", "finish"}: + return f"unknown action type: {action.type!r}" + if action.type == "get_info": + items = action.args.get("items") + if not isinstance(items, list) or not all(isinstance(x, str) for x in items): + return "get_info: 'items' must be a list of strings" + elif action.type == "craft": + ing = action.args.get("ingredients") + tgt = action.args.get("target") + if not isinstance(ing, dict): + return "craft: 'ingredients' must be a JSON object" + if not (isinstance(tgt, list) and len(tgt) == 2 and isinstance(tgt[0], str) and isinstance(tgt[1], int)): + return "craft: 'target' must be [item_name: str, count: int]" + elif action.type == "spawn": + subs = action.args.get("subtasks") + if not isinstance(subs, list) or not subs: + return "spawn: 'subtasks' must be a non-empty list" + for i, s in enumerate(subs): + if not isinstance(s, dict) or not isinstance(s.get("targets"), dict): + return f"spawn: subtasks[{i}] needs a 'targets' dict" + if not isinstance(s.get("max_steps", 0), int): + return f"spawn: subtasks[{i}].max_steps must be int" + elif action.type == "finish": + if not isinstance(action.args.get("message", ""), str): + return "finish: 'message' must be a string" + return None + + +# --------------------------------------------------------------------------- +# Step-budget tracker (shared across the whole trajectory tree) +# --------------------------------------------------------------------------- + + +@dataclass +class BudgetTracker: + total: int + used: int = 0 + reserved: int = 0 + + def remaining(self) -> int: + return max(0, self.total - self.used - self.reserved) + + def consume(self, n: int = 1) -> bool: + if self.remaining() < n: + return False + self.used += n + return True + + def reserve(self, n: int) -> bool: + if self.remaining() < n: + return False + self.reserved += n + return True + + def release(self, n: int) -> None: + self.reserved = max(0, self.reserved - n) + + +# --------------------------------------------------------------------------- +# Per-agent trajectory record +# --------------------------------------------------------------------------- + + +@dataclass +class AgentTrajectory: + traj_id: str + parent_id: str | None + depth: int + task: Task + is_root: bool + # Sequence of (turn input_ids, ModelResponse) pairs for this agent's + # own steps. We rebuild the chat history each turn so we don't have to + # track per-turn input growth here. + turns: list[tuple[list[int], ModelResponse]] = field(default_factory=list) + finish_message: str | None = None + error_message: str | None = None + # Final per-agent reward (set after env.evaluate at end of episode). + reward: float = 0.0 + # Final chat history (system + user + per-turn assistant/observation). Used + # for rollout dumps. Stored as a list of {"role": str, "content": str}. + messages: list[dict[str, str]] = field(default_factory=list) + + +# --------------------------------------------------------------------------- +# Workflow +# --------------------------------------------------------------------------- + + +@register_workflow("recursive_agent") +class RecursiveAgentWorkflow(RolloutWorkflow): + """Multi-turn recursive agent on a stateful in-process env. + + For TextCraft: see ``astraflow/core/workflow/impl/textcraft/env.py``. + """ + + def __init__( + self, + gconfig: GenerationHyperparameters, + tokenizer: PreTrainedTokenizerFast | str, + reward_fn: Callable[..., Any] | str | None = None, + enable_thinking: bool = False, + rollout_stat_scope: str = "rollout", + dump_dir: str | None = None, + max_depth: int = 3, + max_breadth: int = 4, + max_steps_per_episode: int = 50, + max_concurrent_subagents: int = 8, + delegation_reward_cap: float = 0.0, + depth_level_weighting: bool = True, + dump_prob: float = 1 / 128, + parse_error_observation: str = ( + "ERROR: could not parse your response. Reply with a single " + "{...} block." + ), + ): + # reward_fn is OPTIONAL — recursive_agent computes reward from + # env.evaluate() directly (rule-based, no LLM verifier). We accept + # the kwarg for API parity with other workflows but don't require it. + self.reward_fn = reward_fn + if isinstance(tokenizer, str): + from astraflow.core.workflow.utils.hf_utils import load_hf_tokenizer + + tokenizer = load_hf_tokenizer(tokenizer) + self.tokenizer = tokenizer + self.gconfig = gconfig.new_with_stop_and_pad_token_ids(self.tokenizer) + self.enable_thinking = enable_thinking + self.rollout_stat_scope = rollout_stat_scope + self.dump_dir = dump_dir + self.async_reward_fn = None + if reward_fn is not None and not isinstance(reward_fn, str): + self.async_reward_fn = AsyncRewardWrapper(reward_fn) + if self.dump_dir is not None and not os.path.exists(self.dump_dir): + os.makedirs(self.dump_dir, exist_ok=True) + + self.max_depth = int(max_depth) + self.max_breadth = int(max_breadth) + self.max_steps_per_episode = int(max_steps_per_episode) + self.max_concurrent_subagents = int(max_concurrent_subagents) + self.delegation_reward_cap = float(delegation_reward_cap) + self.depth_level_weighting = bool(depth_level_weighting) + self.dump_prob = float(dump_prob) + self.parse_error_observation = parse_error_observation + + # Eager-load the recipe DB so the first episode doesn't pay the + # 860-recipe parse cost. + get_default_recipe_db() + + # ------------------------------------------------------------------ chat + + def _apply_chat_template(self, messages: list[dict], add_generation_prompt: bool) -> list[int]: + try: + return list(self.tokenizer.apply_chat_template( + messages, + tokenize=True, + add_generation_prompt=add_generation_prompt, + enable_thinking=self.enable_thinking, + )) + except TypeError: + return list(self.tokenizer.apply_chat_template( + messages, tokenize=True, add_generation_prompt=add_generation_prompt, + )) + + def _build_initial_messages( + self, task: Task, env: TextCraftEnv, is_root: bool + ) -> list[dict]: + system = MAIN_SYSTEM_PROMPT if is_root else SUB_SYSTEM_PROMPT + target_str = ", ".join(f"{c}x {it}" for it, c in (task.misc.get("target_items") or {}).items()) + user = ( + f"Task: {task.goal or 'craft target items'}\n" + f"Targets: {target_str or '(none)'}\n" + f"Initial inventory: {env.view_inventory()}\n" + f"Step budget: {task.max_steps}" + ) + return [ + {"role": "system", "content": system}, + {"role": "user", "content": user}, + ] + + # ------------------------------------------------------------------ episode + + async def _run_episode( + self, + engine: InferenceEngine, + env: TextCraftEnv, + task: Task, + budget: BudgetTracker, + sem: asyncio.Semaphore, + all_trajs: list[AgentTrajectory], + parent_id: str | None, + depth: int, + is_root: bool, + ) -> AgentTrajectory: + traj_id = uuid.uuid4().hex + traj = AgentTrajectory( + traj_id=traj_id, parent_id=parent_id, depth=depth, task=task, is_root=is_root, + ) + all_trajs.append(traj) + + messages = self._build_initial_messages(task, env, is_root) + steps_taken = 0 + max_local_steps = task.max_steps if task.max_steps is not None else self.max_steps_per_episode + + while not env.finished and steps_taken < max_local_steps: + if not budget.consume(1): + traj.error_message = ( + f"[budget exhausted at local step {steps_taken}; " + f"total {budget.used}/{budget.total}]" + ) + break + + input_ids = self._apply_chat_template(messages, add_generation_prompt=True) + resp = await engine.agenerate( + ModelRequest( + rid=uuid.uuid4().hex, + input_ids=input_ids, + gconfig=self.gconfig.new(n_samples=1), + tokenizer=self.tokenizer, + ) + ) + traj.turns.append((input_ids, resp)) + response_text = self.tokenizer.decode(resp.output_tokens) + + action = parse_action(response_text) + err = validate_action(action) + if err is not None: + obs = f"ERROR: {err}" + stats_tracker.get(self.rollout_stat_scope).scalar(parse_errors=1) + messages.append({"role": "assistant", "content": response_text}) + messages.append({"role": "user", "content": obs}) + steps_taken += 1 + continue + + # Dispatch. + if action.type == "get_info": + obs = env.get_info(action.args["items"]) + elif action.type == "view_inventory": + obs = env.view_inventory() + elif action.type == "craft": + obs = env.craft(action.args["ingredients"], action.args["target"]) + elif action.type == "finish": + env.finish(action.args.get("message", "")) + traj.finish_message = action.args.get("message", "") + # Per-agent reward: evaluate THIS agent's env against ITS + # own target_items at the moment of finish(). Inventory is + # shared with the parent by reference, so this captures the + # snapshot at this finish — matches platoon's per-agent + # reward semantics (each agent scored on its own subtask). + score, _info = env.evaluate() + traj.reward = float(score) + messages.append({"role": "assistant", "content": response_text}) + # No observation appended — episode terminates. + steps_taken += 1 + break + elif action.type == "spawn": + if depth >= self.max_depth: + obs = f"ERROR: max recursion depth ({self.max_depth}) reached; cannot spawn" + else: + subs = action.args["subtasks"][: self.max_breadth] + obs = await self._dispatch_spawn( + engine, env, budget, sem, all_trajs, traj_id, depth, subs, + ) + else: + obs = f"ERROR: unhandled action type {action.type!r}" + + messages.append({"role": "assistant", "content": response_text}) + messages.append({"role": "user", "content": obs}) + steps_taken += 1 + + # Save full chat history (system + initial user + per-turn pairs) for + # rollout dumps. May or may not end with a trailing user observation + # depending on whether the agent finished cleanly. + traj.messages = messages + return traj + + async def _dispatch_spawn( + self, + engine: InferenceEngine, + parent_env: TextCraftEnv, + budget: BudgetTracker, + sem: asyncio.Semaphore, + all_trajs: list[AgentTrajectory], + parent_id: str, + parent_depth: int, + subs: list[dict[str, Any]], + ) -> str: + """Run N children in parallel; return finish-message-only spawn_result.""" + parent_env.subagent_launched += len(subs) + child_tasks: list[Task] = [] + for i, s in enumerate(subs): + targets = s.get("targets", {}) + max_steps = int(s.get("max_steps", 10)) + context = s.get("context", "") + target_str = ", ".join(f"{c}x {it}" for it, c in targets.items()) + goal = f"Craft the following items: {target_str}" + if context: + goal += f"\n\nContext from parent: {context}" + child_tasks.append(Task( + goal=goal, + id=f"{parent_id}/sub_{i}", + max_steps=max_steps, + misc={ + "target_items": targets, + "initial_inventory": parent_env.inventory, # ALIASED + }, + )) + + async def _one(child_task: Task) -> AgentTrajectory: + async with sem: + child_env = parent_env.fork(child_task) + return await self._run_episode( + engine=engine, + env=child_env, + task=child_task, + budget=budget, + sem=sem, + all_trajs=all_trajs, + parent_id=parent_id, + depth=parent_depth + 1, + is_root=False, + ) + + children = await asyncio.gather(*[_one(t) for t in child_tasks]) + + # Telemetry: count how many children produced a finish_message (proxy + # for "succeeded at terminating cleanly"). Real per-child task + # success is checked in evaluate() at episode end. + for child in children: + if child.finish_message: + # Per-child success on its own targets. + child_targets: dict[str, int] = child.task.misc.get("target_items") or {} + ok = all(parent_env.inventory.get(it, 0) >= c for it, c in child_targets.items()) + parent_env.subagent_succeeded += 1.0 if ok else 0.0 + + # Format observation: finish_message-only (Option A). + parts = [""] + for i, (child, sub) in enumerate(zip(children, subs)): + target_str = ", ".join(f"{c}x {it}" for it, c in sub["targets"].items()) + msg = child.finish_message or (child.error_message or "[no finish_message]") + parts.append(f"{msg}") + parts.append("") + return "\n".join(parts) + + # ------------------------------------------------------------------ entry + + async def _run_one_rollout( + self, + engine: InferenceEngine, + data: dict[str, Any], + rollout_idx: int, + ) -> dict[str, Any]: + """Run one independent rollout (one root + its full spawn tree). + + Returns per-agent training data. Each agent (root or sub-agent) + carries its OWN reward (computed at finish() time in _run_episode + against THAT agent's own target_items). Agents that never finished + (budget exhausted) keep reward=0.0. + + ``per_agent`` is a list of ``{"reward": float, "sequences": [...]} + — one entry per agent that produced training data. + ``root_score`` is the root agent's reward (for stats). + """ + task = self._task_from_data(data) + env = TextCraftEnv(task=task) + budget = BudgetTracker(total=task.max_steps or self.max_steps_per_episode) + sem = asyncio.Semaphore(self.max_concurrent_subagents) + all_trajs: list[AgentTrajectory] = [] + + await self._run_episode( + engine=engine, env=env, task=task, budget=budget, sem=sem, + all_trajs=all_trajs, parent_id=None, depth=0, is_root=True, + ) + + # Per-agent rewards are already stored on each AgentTrajectory by + # _run_episode at finish() time. Build per-agent sequences here. + per_agent: list[dict[str, Any]] = [] + for ag in all_trajs: + if not ag.turns: + continue + seqs = self._build_sequences_for_agent(ag, ag.reward) + per_agent.append({"reward": ag.reward, "sequences": seqs, "depth": ag.depth, "is_root": ag.is_root}) + + root_traj = all_trajs[0] if all_trajs else None + return { + "per_agent": per_agent, + "all_trajs": all_trajs, + "task": task, + "root_reward": float(root_traj.reward) if root_traj else 0.0, + "n_agents": len(all_trajs), + "subagent_launched": int(env.subagent_launched), + "subagent_succeeded": float(env.subagent_succeeded), + } + + async def arun_episode( + self, engine: InferenceEngine, data: dict[str, Any] + ) -> dict[str, Any]: + """Run K=n_samples rollouts of one prompt in parallel. + + Returns ``n_trajs=K`` with one trajectory per rollout. Each + trajectory's sequences share that rollout's root reward. This shape + lets ``filter_zero_adv`` see the across-sibling variance and lets + GRPO compute per-prompt advantages — matching the pattern used by + ``rlvr`` and other workflows. + """ + # Optional dynamic import for reward_fn — kept for API parity even + # though we don't call it (reward is env.evaluate()-based). + if isinstance(self.reward_fn, str): + try: + self.reward_fn = import_from_string(self.reward_fn) + self.async_reward_fn = AsyncRewardWrapper(self.reward_fn) + except Exception as e: + logger.warning("could not import reward_fn=%r: %s — proceeding (env reward only)", self.reward_fn, e) + self.reward_fn = None + + n_samples = max(1, int(self.gconfig.n_samples)) + + # Run all K rollouts in parallel. Each rollout is independent: its + # own env, budget, semaphore, trajectory tree. + rollouts = await asyncio.gather(*[ + self._run_one_rollout(engine, data, i) for i in range(n_samples) + ]) + + # Aggregate stats so wandb/StatsLogger see the group. + root_rewards = [r["root_reward"] for r in rollouts] + n_agents_list = [r["n_agents"] for r in rollouts] + launched_total = sum(r["subagent_launched"] for r in rollouts) + succeeded_total = sum(r["subagent_succeeded"] for r in rollouts) + # Per-agent rewards across all agents in all rollouts (for diagnostics). + all_agent_rewards = [ + pa["reward"] for r in rollouts for pa in r["per_agent"] + ] + sub_agent_rewards = [ + pa["reward"] for r in rollouts for pa in r["per_agent"] if not pa["is_root"] + ] + + for rw in root_rewards: + stats_tracker.get(self.rollout_stat_scope).scalar(reward=rw) + stats_tracker.get(self.rollout_stat_scope).scalar(env_score=rw) + for na in n_agents_list: + stats_tracker.get(self.rollout_stat_scope).scalar(n_agents=na) + for sr in sub_agent_rewards: + stats_tracker.get(self.rollout_stat_scope).scalar(subagent_reward=sr) + if launched_total > 0: + stats_tracker.get(self.rollout_stat_scope).scalar( + subagent_success_rate=succeeded_total / launched_total, + ) + + # Optional dump: one rollout sampled per group call (avoids K× volume). + if self.dump_dir is not None and random.random() < self.dump_prob: + r0 = rollouts[0] + await self._dump_trajectory( + r0["all_trajs"], r0["root_reward"], r0["root_reward"], + {"subagent_launched": r0["subagent_launched"], "subagent_succeeded": r0["subagent_succeeded"]}, + data, + ) + + # Build the structured result. Each AGENT (root or sub-agent) across + # ALL K rollouts becomes its own trajectory with its OWN reward — + # platoon's per-agent reward semantics. AstraFlow's GRPO then + # normalizes advantages across all trajectories sharing this prompt_id. + trajectories: list[dict[str, Any]] = [] + rewards_kept: list[float] = [] + for r in rollouts: + for pa in r["per_agent"]: + if not pa["sequences"]: + continue + trajectories.append({"sequences": pa["sequences"]}) + rewards_kept.append(pa["reward"]) + + prompt_id = resolve_prompt_id(data) or (rollouts[0]["task"].id if rollouts else None) + + if not trajectories: + return { + "n_trajs": 0, + "rewards": torch.tensor([], dtype=torch.float32), + "trajectories": [], + "prompt_id": prompt_id, + } + + return { + "n_trajs": len(trajectories), + "rewards": torch.tensor(rewards_kept, dtype=torch.float32), + "trajectories": trajectories, + "prompt_id": prompt_id, + } + + # ------------------------------------------------------------------ helpers + + def _task_from_data(self, data: dict[str, Any]) -> Task: + """Materialize a Task object from a dataset row. + + Supported shapes: + 1. ``{"task_id": "textcraft.train.42"}`` → loads from disk via tasks.py + 2. inline: ``{"target_items": {...}, "initial_inventory": {...}, "max_steps": N, "id": ...}`` + """ + if "task_id" in data: + return get_task(data["task_id"]) + return Task( + goal=data.get("goal") or "Craft the target items", + id=data.get("id") or data.get("query_id") or uuid.uuid4().hex, + max_steps=int(data.get("max_steps", self.max_steps_per_episode)), + misc={ + "target_items": data.get("target_items", {}), + "initial_inventory": data.get("initial_inventory", {}), + }, + ) + + def _build_sequences_for_agent( + self, ag: AgentTrajectory, reward: float + ) -> list[dict[str, torch.Tensor]]: + """Emit one training sequence per turn of this agent. + + Per-turn layout:: + + [turn_input_ids (loss_mask=0)] [response_tokens (loss_mask=1)] + + We deliberately do NOT try to concatenate turns into one long + sequence. Doing so requires reconciling each turn's ``input_ids`` + (built by re-applying the chat template after appending the prior + assistant message + new observation) with the cumulative + prior_input + prior_response_tokens — but SGLang's actual + ``resp.output_tokens`` is one of many tokenizations whose decoded + text matches the assistant message; the chat-template re-encode + often picks a different tokenization due to BPE non-uniqueness + + special-token handling. That breaks any "next turn starts with + cumulative-so-far" invariant. + + Treating each turn as an independent sequence sidesteps this: + the loss is computed against the actual context the model saw + (turn_input_ids) and the actual tokens it generated + (resp.output_tokens). All per-turn sequences for this agent + share the same trajectory reward (with depth-level weighting if + enabled). + """ + # Per-agent reward weighting. + weight = 1.0 / (ag.depth + 1) if self.depth_level_weighting else 1.0 + per_seq_reward = reward * weight + + out: list[dict[str, torch.Tensor]] = [] + for input_ids, resp in ag.turns: + seq_ids = list(input_ids) + list(resp.output_tokens) + seq_mask = [0] * len(input_ids) + [1] * len(resp.output_tokens) + seq_logprobs = [0.0] * len(input_ids) + list(resp.output_logprobs) + seq_versions = [-1] * len(input_ids) + list(resp.output_versions) + n = len(seq_ids) + seq = { + "input_ids": torch.tensor(seq_ids, dtype=torch.int32), + "loss_mask": torch.tensor(seq_mask, dtype=torch.int32), + "logprobs": torch.tensor(seq_logprobs, dtype=torch.float32), + "versions": torch.tensor(seq_versions, dtype=torch.int32), + "attention_mask": torch.ones(n, dtype=torch.bool), + "rewards": torch.tensor(per_seq_reward, dtype=torch.float32), + } + out.append({k: v.unsqueeze(0) for k, v in seq.items()}) + return out + + async def _dump_trajectory( + self, + all_trajs: list[AgentTrajectory], + reward: float, + score: float, + info: dict, + data: dict[str, Any], + ) -> None: + if self.dump_dir is None: + return + # Pick the engine version from any trajectory's first turn (best-effort). + version = 0 + if all_trajs and all_trajs[0].turns: + v = all_trajs[0].turns[0][1].output_versions + if v: + version = max(v) + dump_path = os.path.join(self.dump_dir, str(version)) + await aiofiles.os.makedirs(dump_path, exist_ok=True) + qid = resolve_prompt_id(data) or (all_trajs[0].task.id if all_trajs else uuid.uuid4().hex) + file_path = os.path.join(dump_path, f"{qid}.txt") + async with aiofiles.open(file_path, "a") as f: + await f.write(f"=== Episode reward={reward} env_score={score} n_agents={len(all_trajs)} info={info} ===\n\n") + for ag in all_trajs: + kind = "ROOT" if ag.is_root else f"SUB depth={ag.depth} parent={ag.parent_id}" + await f.write(f"--- {kind} traj_id={ag.traj_id} task={ag.task.goal!r} target_items={ag.task.misc.get('target_items')} per_agent_reward={ag.reward} steps={len(ag.turns)} ---\n") + if ag.finish_message: + await f.write(f"FINISH: {ag.finish_message}\n") + if ag.error_message: + await f.write(f"ERROR: {ag.error_message}\n") + # Full chat history: system prompt + initial user (task+targets+inventory) + per-turn (assistant + user observation). + # Falls back to legacy per-turn output dump if messages wasn't populated (e.g., agent never ran). + if ag.messages: + for j, msg in enumerate(ag.messages): + await f.write(f" [{j}] {msg['role']}:\n {msg['content']}\n") + else: + for i, (_input_ids, resp) in enumerate(ag.turns): + await f.write(f" turn {i} output:\n {self.tokenizer.decode(resp.output_tokens)[:600]}\n") + await f.write("\n") diff --git a/astraflow/core/workflow/reward/textcraft_success.py b/astraflow/core/workflow/reward/textcraft_success.py new file mode 100644 index 0000000..be1dec7 --- /dev/null +++ b/astraflow/core/workflow/reward/textcraft_success.py @@ -0,0 +1,26 @@ +"""TextCraft reward function (API-parity stub). + +The recursive_agent workflow computes its own reward from +``TextCraftEnv.evaluate()`` (rule-based on final inventory). This module +exists so a yaml ``reward_fn: textcraft_success`` resolves to *something* +— the workflow won't actually call it. + +If you ever want a verifier-style reward over the final assistant message, +this is the place to add it. +""" + +from typing import Any + +from astraflow.core.workflow.registry import register_reward + + +@register_reward("textcraft_success") +def textcraft_success_reward_fn( + prompt: str, + completions: str, + prompt_ids: list[int], + completion_ids: list[int], + **kwargs: Any, +) -> float: + """Stub reward — recursive_agent does not call this. Returns 0.0 if invoked.""" + return 0.0 diff --git a/astraflow/dataflow/dataset/textcraft.py b/astraflow/dataflow/dataset/textcraft.py new file mode 100644 index 0000000..f77e0a2 --- /dev/null +++ b/astraflow/dataflow/dataset/textcraft.py @@ -0,0 +1,162 @@ +"""TextCraft dataset for the recursive_agent workflow. + +Each row is a task spec: + { + "messages": [{"role": "user", "content": }], + "task_id": "textcraft.train.42", + "target_items": {...}, + "initial_inventory": {...}, + "max_steps": 50, + "answer": "", # for AstraFlow's prompt_id machinery + } + +The workflow reads ``task_id`` (or falls back to the inline fields) and +materializes a Task via ``textcraft.tasks.get_task``. + +Tasks are SYNTHESIZED locally from the bundled recipe database — no +network. ``download_dataset(offline_dir, ...)`` writes the materialized +jsonl files (textcraft_train.jsonl / textcraft_val.jsonl) into the +textcraft package directory so subsequent loads are deterministic. +""" + +from __future__ import annotations + +import json +from dataclasses import asdict +from logging import getLogger +from pathlib import Path + +from datasets import Dataset + +from astraflow.core.workflow.impl.textcraft.tasks import ( + create_textcraft_datasets, + get_task, + get_task_ids, +) +from astraflow.dataflow.dataset.utils import attach_query_ids + +logger = getLogger(__name__) + + +_TEXTCRAFT_PKG_DIR = Path(__file__).resolve().parents[2] / "core" / "workflow" / "impl" / "textcraft" + + +def _ensure_tasks_generated( + num_train: int = 1000, + num_val: int = 100, + seed: int = 42, + force: bool = False, +) -> tuple[Path, Path]: + """Materialize textcraft_train.jsonl + textcraft_val.jsonl beside the + workflow code, regenerating if missing OR if the existing files are + smaller than the requested counts. + + Returns (train_path, val_path). + """ + train_path = _TEXTCRAFT_PKG_DIR / "textcraft_train.jsonl" + val_path = _TEXTCRAFT_PKG_DIR / "textcraft_val.jsonl" + if not force and train_path.exists() and val_path.exists(): + train_lines = sum(1 for _ in open(train_path)) + val_lines = sum(1 for _ in open(val_path)) + if train_lines >= num_train and val_lines >= num_val: + return train_path, val_path + logger.info( + "existing textcraft files too small (train %d<%d or val %d<%d); regenerating", + train_lines, num_train, val_lines, num_val, + ) + logger.info( + "generating textcraft tasks: %d train / %d val (seed=%d)", + num_train, num_val, seed, + ) + train_tasks, val_tasks = create_textcraft_datasets( + seed=seed, num_samples_train=num_train, num_samples_val=num_val, + ) + with open(train_path, "w") as f: + for t in train_tasks: + f.write(json.dumps(asdict(t)) + "\n") + with open(val_path, "w") as f: + for t in val_tasks: + f.write(json.dumps(asdict(t)) + "\n") + logger.info("wrote %d train tasks → %s", len(train_tasks), train_path) + logger.info("wrote %d val tasks → %s", len(val_tasks), val_path) + return train_path, val_path + + +def download_dataset( + offline_dir: str | None = None, + num_train: int = 1000, + num_val: int = 100, + seed: int = 42, +): + """Generate the train/val jsonl files (no network).""" + _ensure_tasks_generated(num_train=num_train, num_val=num_val, seed=seed, force=True) + + +def _row_for_task_id(task_id: str) -> dict: + """Materialize a HuggingFace-Dataset row for a single task. + + Keep the schema uniform across rows so HF Dataset doesn't merge dict + keys: only ``task_id`` (workflow re-loads the full Task via + ``get_task``) and a single ``messages`` field. + """ + task = get_task(task_id) + target_str = ", ".join( + f"{c}x {it}" for it, c in (task.misc.get("target_items") or {}).items() + ) + user = ( + f"Task: {task.goal or 'Craft target items'}\n" + f"Targets: {target_str}\n" + f"Initial inventory: {json.dumps(task.misc.get('initial_inventory') or {})}\n" + f"Step budget: {task.max_steps}" + ) + return { + "task_id": task.id, + "messages": [{"role": "user", "content": user}], + "answer": task.id, # placeholder for AstraFlow's prompt_id resolution + } + + +def get_textcraft_rl_dataset( + tokenizer=None, + max_length: int | None = None, + num_tasks: int = 1000, + num_val: int = 100, + seed: int = 42, + offline_dir: str | None = None, + dataset_name: str = "textcraft", +) -> Dataset: + """Return a HF Dataset of TextCraft train tasks.""" + _ensure_tasks_generated(num_train=num_tasks, num_val=num_val, seed=seed) + task_ids = get_task_ids("train", num_samples_train=num_tasks) + rows = [_row_for_task_id(tid) for tid in task_ids] + ds = Dataset.from_list(rows) + ds = attach_query_ids(ds, dataset_name) + if max_length is not None and tokenizer is not None: + def short_enough(sample): + content = sample["messages"][0]["content"] + return len(tokenizer.encode(content)) <= max_length + ds = ds.filter(short_enough) + return ds + + +def get_textcraft_eval_dataset( + tokenizer=None, + max_length: int | None = None, + num_val: int = 100, + num_train: int = 1000, + seed: int = 42, + offline_dir: str | None = None, + dataset_name: str = "textcraft_val", +) -> Dataset: + """Return a HF Dataset of TextCraft val tasks.""" + _ensure_tasks_generated(num_train=num_train, num_val=num_val, seed=seed) + task_ids = get_task_ids("val", num_samples_val=num_val) + rows = [_row_for_task_id(tid) for tid in task_ids] + ds = Dataset.from_list(rows) + ds = attach_query_ids(ds, dataset_name) + if max_length is not None and tokenizer is not None: + def short_enough(sample): + content = sample["messages"][0]["content"] + return len(tokenizer.encode(content)) <= max_length + ds = ds.filter(short_enough) + return ds diff --git a/docs/en/index.rst b/docs/en/index.rst index f9a2e77..62533c7 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -33,3 +33,4 @@ on distributed GPU clusters. recipes/multi-agent recipes/agentbench recipes/search + recipes/textcraft-recursive diff --git a/docs/en/recipes/textcraft-recursive.md b/docs/en/recipes/textcraft-recursive.md new file mode 100644 index 0000000..e4fc0aa --- /dev/null +++ b/docs/en/recipes/textcraft-recursive.md @@ -0,0 +1,157 @@ +# TextCraft (Recursive Agent) + +A multi-turn recursive-agent recipe ported from +[platoon](https://github.com/.../platoon)'s TextCraft design. The agent +acts in a stateful crafting environment (Minecraft-style recipes + +inventory) and can recursively spawn up to 4 sub-agents in parallel per +turn — each shares the parent's inventory by reference, so their work +mutates the same state. + +**Recipe**: [`examples/textcraft/qwen3-4b-recursive/`](https://github.com/Infini-AI-Lab/astraflow/tree/main/examples/textcraft/qwen3-4b-recursive) + +**Workflow class**: [`astraflow/core/workflow/impl/textcraft/workflow.py`](https://github.com/Infini-AI-Lab/astraflow/tree/main/astraflow/core/workflow/impl/textcraft/workflow.py) — registered as `recursive_agent`. + +## How it works + +### Tool-call protocol + +Each turn the model emits **exactly one** action block: + +``` +{"items": ["stick", "oak_planks"]} +{} +{"ingredients": {"oak_log": 1}, "target": ["oak_planks", 4]} +{"subtasks": [ + {"targets": {"oak_planks": 16}, "max_steps": 8}, + {"targets": {"stick": 8}, "max_steps": 5} +]} +{"message": "crafted 4 wooden_pickaxe"} +``` + +XML/JSON instead of platoon's Python-code-as-action because SGLang runs +with `--skip-tokenizer-init` (can't do string-stop) and we want zero +sandbox infrastructure. Base Qwen3 reads the format from the system +prompt with no SFT bootstrap needed. + +### Stateful environment + +[`TextCraftEnv`](https://github.com/Infini-AI-Lab/astraflow/tree/main/astraflow/core/workflow/impl/textcraft/env.py) +holds a mutable `inventory: dict[str, int]` and a shared read-only +recipe database (~860 Minecraft recipes bundled in +`astraflow/core/workflow/impl/textcraft/recipes/`). + +`env.fork(child_task)` returns a child env whose `inventory` is **the +same dict object** as the parent's. When a sub-agent calls `craft`, the +mutation is visible to the parent. Single asyncio loop → no race. + +### Spawning + +A `` block runs all subtasks in parallel via +`asyncio.gather`, each as a full sub-episode with its own forked env +and trajectory. Up to 4 children per spawn, up to depth 3 (root + 2 +levels of nesting). Sub-agents share the root's step budget. + +### Aggregation — finish-message only (Option A, platoon-faithful) + +The parent's view of a spawn is bounded — only each child's +`finish_message`: + +``` + +crafted 16 oak_planks +crafted 8 stick + +``` + +The sub-agent's intermediate turns (other `craft` / `get_info` calls) +are NOT shown to the parent. This forces sub-agents to summarize their +work in `finish` messages and bounds context growth across recursion. + +### Training scheme + +One trajectory per episode containing **N sequences** (one per agent in +the tree — root + every descendant). Per-sequence layout: + +| span | source | `loss_mask` | +|---|---|---| +| chat prompt + all prior turns' env tokens (observations) | env | 0 | +| this agent's own response tokens at each turn | model | **1** | + +**Reward broadcast**: all sequences share the root reward +(`env.evaluate()` → 1.0 if every target_item is satisfied else 0.0). +**Depth-level weighting**: per-sequence reward is multiplied by +`1 / (depth + 1)` so deeper agents contribute less per-token weight +(matches platoon's `depth_level_weighting: true`). + +## Run + +One-time prep (synthesizes 1000 train + 100 val tasks locally from the +bundled recipe DB; no network required): + +```bash +# Generated automatically on first launch; or force-regenerate: +python -c "from astraflow.dataflow.dataset.textcraft import download_dataset; download_dataset()" +``` + +Pre-fetch the model (one-time, ~8 GB): + +```bash +huggingface-cli download Qwen/Qwen3-4B-Instruct-2507 +``` + +Run: + +```bash +bash examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh +``` + +Smoke run (3 train steps, eval-at-start): + +```bash +bash examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh \ + total_train_steps=3 evaluator.eval_at_start=true evaluator.freq_steps=100 +``` + +## Settings (matches platoon where compatible) + +| Setting | Value | matches platoon? | +|---|---|---| +| Model | Qwen/Qwen3-4B-Instruct-2507 | ✅ | +| `enable_thinking` | `false` | ✅ | +| Algorithm | M2PO | ⚠ platoon uses CISPO (same GRPO family) | +| Fine-tuning | Full-FT | ⚠ platoon uses LoRA rank=32 | +| Inference backend | SGLang + RaaS + AstraFlow | ⚠ platoon uses Tinker | +| Tool-call protocol | XML / JSON | ⚠ platoon uses Python sandbox | +| `group_size` (n_samples) | 8 train / 1 eval | ✅ | +| `batch_size` | 32 | ✅ | +| `max_steps_per_episode` | 50 | ✅ | +| `lr` | 3e-5 | ✅ | +| Adam (β₁, β₂) | (0.9, 0.95) | ✅ | +| `grad_clip` | 0 (off) | ✅ (platoon: 1e12) | +| `max_staleness` | 3 | ✅ | +| `total_train_steps` | 100 | ✅ | +| Eval cadence | every 20 steps | ✅ | +| `max_depth` | 3 | platoon: unbounded — AstraFlow safety cap | +| `max_breadth` | 4 | platoon: unbounded — AstraFlow safety cap | +| `max_concurrent_subagents` | 8 | bounds K^N RaaS queue blowup | +| `delegation_reward_cap` | 0.0 | ✅ (= `_TEXTCRAFT_DELEGATION_REWARD_CAP`) | +| `depth_level_weighting` | true | ✅ | +| Dataset | TextCraft 1000 train / 100 val (original Minecraft recipes) | ✅ | +| SGLang context_length | 32768 | bumped from math recipe's 16k for recursion overhead | + +## Caveats + +- This is a **design reproduction**, not a **results reproduction**. + The differences in trainer / FT regime / backend / tool-call surface + (marked ⚠ above) mean wall-clock and final scores can differ. The + intent is to validate the architecture port and have a path to + reproduce the qualitative behavior (multi-turn recursion, shared + inventory, finish-message bottleneck, team reward). +- Tasks are synthesized locally from the bundled `recipes/` JSON + directory; no network required at training time (unlike the math + recipes which used HF Hub datasets pre-`offline-math`). +- Each parent's context grows with every observation. The chat history + for a 50-step root agent can hit several thousand tokens by the end + even before any spawn injection. We picked `context_length: 32768` + for headroom; raise it if you increase `max_steps_per_episode` or + `max_breadth`. diff --git a/examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh b/examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh new file mode 100755 index 0000000..cf7df94 --- /dev/null +++ b/examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh @@ -0,0 +1,36 @@ +#!/bin/bash +set -euo pipefail +# [1/3] Launch AstraFlow HTTP service +# +# Usage (terminal 1): +# bash examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh + +export CUDA_VISIBLE_DEVICES="" + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== AstraFlow HTTP Service ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "Port : ${ASTRAFLOW_PORT}" +echo "===============================" + +python3 -u -m astraflow \ + --config "${EXPERIMENT_CONFIG}" \ + --port "${ASTRAFLOW_PORT}" \ + --host "${ASTRAFLOW_HOST}" \ + 2>&1 | tee "${LOG_DIR}/astraflow.log" diff --git a/examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh b/examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh new file mode 100755 index 0000000..5d88b2b --- /dev/null +++ b/examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh @@ -0,0 +1,44 @@ +#!/bin/bash +set -euo pipefail +# [2/3] Launch RaaS inference server (SGLang + TCP receiver) +# +# Usage (terminal 2, after AstraFlow is ready): +# bash examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" +export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="${ASTRAFLOW_URL:-http://127.0.0.1:${ASTRAFLOW_PORT}}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== RaaS Inference Server (SGLang + TCP receiver) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "RaaS config : ${RAAS_CONFIG}" +echo "GPUs : ${CUDA_VISIBLE_DEVICES}" +echo "Port : ${RAAS_PORT}" +echo "AstraFlow URL : ${ASTRAFLOW_URL}" +echo "=======================================================" + +python3 -u -m astraflow.raas.server \ + --host "${RAAS_HOST}" \ + --port "${RAAS_PORT}" \ + --config "${EXPERIMENT_CONFIG}" \ + --config "${RAAS_CONFIG}" \ + --engine-id "${ENGINE_ID:-default}" \ + --astraflow-url "${ASTRAFLOW_URL}" \ + 2>&1 | tee "${LOG_DIR}/raas.log" diff --git a/examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh b/examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh new file mode 100755 index 0000000..cb8e850 --- /dev/null +++ b/examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh @@ -0,0 +1,47 @@ +#!/bin/bash +set -euo pipefail +# [3/3] Launch Trainer for model0 (TCP, sender_agent on local_rank 0) +# +# Usage (terminal 3, after AstraFlow and RaaS are ready): +# bash examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS:-4,5,6,7}" +TRAINER0_NPROC="$(echo "${CUDA_VISIBLE_DEVICES}" | awk -F',' '{print NF}')" + +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" +export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" + +# sender_agent (in trainer) listens on this HTTP port +export WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== Trainer model0 (TCP) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "GPUs : ${CUDA_VISIBLE_DEVICES} (FSDP dp${TRAINER0_NPROC})" +echo "AstraFlow : ${ASTRAFLOW_URL}" +echo "RaaS : ${ASTRAFLOW_RAAS_URL}" +echo "Sender HTTP : ${WEIGHT_TRANSFER_HTTP_PORT}" +echo "WANDB mode : ${WANDB_MODE:-online}" +echo "==========================================" + +torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ + --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ + examples/launch_trainer.py \ + --config "${EXPERIMENT_CONFIG}" \ + --trainer trainer_model0 \ + "$@" 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh b/examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh new file mode 100755 index 0000000..ced8ff7 --- /dev/null +++ b/examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh @@ -0,0 +1,116 @@ +#!/bin/bash +set -euo pipefail +# All-in-one launcher for AstraFlow training with the RECURSIVE-AGENT +# workflow on TextCraft (Qwen3-4B-Instruct-2507, M2PO, platoon port). +# +# Workflow: recursive_agent. Agent emits one {JSON} +# per turn (craft / get_info / view_inventory / spawn / finish). Spawn +# fans out up to 4 sub-agents in parallel via asyncio.gather, each +# inheriting the parent's inventory by reference. Tree-structured +# trajectory flattened to one trajectory with N sequences sharing the +# env-based team reward. +# +# TextCraft task data is synthesized locally on first run from the +# bundled Minecraft recipe DB (no HF download required). Files land at +# astraflow/core/workflow/impl/textcraft/textcraft_{train,val}.jsonl. +# +# Launches 3 processes: +# 1. AstraFlow HTTP service (CPU-only) +# 2. RaaS inference server (SGLang, SERVICE_CUDA_VISIBLE_DEVICES) +# 3. Trainer model0 (FSDP, TRAINER_MODEL0_GPUS) +# +# Usage: +# bash examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh + +# ============================================================================= +# Part 1: Load env and settings +# ============================================================================= +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +# Defined in examples/_common/utils.sh. +astraflow_load_experiment_env + +# ============================================================================= +# Part 2: Set up env +# ============================================================================= +# GPU assignments (default: 4 GPUs for inference, 4 for training) +export SERVICE_CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" +export TRAINER_MODEL0_GPUS="${TRAINER_MODEL0_GPUS:-4,5,6,7}" +# Ports / URLs (each component gets its own port) +export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" +export WEIGHT_TRANSFER_HTTP_PORT_MODEL0="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" + +TRAINER0_NPROC="$(echo "${TRAINER_MODEL0_GPUS}" | awk -F',' '{print NF}')" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. +# Defined in examples/_common/utils.sh. +astraflow_setup_env + +# ============================================================================= +# Part 3: Print info and clean up +# ============================================================================= +echo "=== AstraFlow (Qwen3-4B, TextCraft, M2PO, ctx32k, TCP, RECURSIVE AGENT) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "RaaS config : ${RAAS_CONFIG}" +echo "RaaS GPUs : ${SERVICE_CUDA_VISIBLE_DEVICES}" +echo "Trainer model0 GPUs : ${TRAINER_MODEL0_GPUS} (FSDP dp${TRAINER0_NPROC})" +echo "RaaS port : ${RAAS_PORT}" +echo "AstraFlow port : ${ASTRAFLOW_PORT}" +echo "Sender HTTP model0 : ${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" +echo "WANDB mode : ${WANDB_MODE:-online}" +echo "==========================================================" + +trap astraflow_cleanup_trap EXIT INT TERM + +# Kill leftover processes and shared memory from prior runs. +# Defined in examples/_common/utils.sh. +astraflow_kill_stale + +# ============================================================================= +# Part 4: Launch training +# ============================================================================= +echo "[1/3] Starting AstraFlow HTTP service..." +CUDA_VISIBLE_DEVICES="" \ + python3 -u -m astraflow \ + --config "${EXPERIMENT_CONFIG}" \ + --port "${ASTRAFLOW_PORT}" \ + --host "${ASTRAFLOW_HOST}" \ + 2>&1 | tee "${LOG_DIR}/astraflow.log" & +sleep 5 + +echo "[2/3] Starting RaaS inference server (SGLang + TCP receiver)..." +CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES}" \ + python3 -u -m astraflow.raas.server \ + --host "${RAAS_HOST}" \ + --port "${RAAS_PORT}" \ + --config "${EXPERIMENT_CONFIG}" \ + --config "${RAAS_CONFIG}" \ + --engine-id "${ENGINE_ID:-default}" \ + --astraflow-url "${ASTRAFLOW_URL}" \ + 2>&1 | tee "${LOG_DIR}/raas.log" & +sleep 15 + +export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" + +echo "[3/3] Starting trainer model0..." +CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS}" \ +WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" \ + torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ + --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ + examples/launch_trainer.py \ + --config "${EXPERIMENT_CONFIG}" \ + --trainer trainer_model0 \ + "$@" \ + 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/textcraft/qwen3-4b-recursive/yaml/experiment.yaml b/examples/textcraft/qwen3-4b-recursive/yaml/experiment.yaml new file mode 100644 index 0000000..59cf195 --- /dev/null +++ b/examples/textcraft/qwen3-4b-recursive/yaml/experiment.yaml @@ -0,0 +1,166 @@ +# ============================================================================ +# Experiment config — AstraFlow service + Trainer (RECURSIVE AGENT on TextCraft) +# Experiment: textcraft / qwen3-4b-recursive +# +# Recursive agent reproduction of platoon's design (see +# claude-doc/recursive-agent-textcraft-plan.md): +# - workflow_cls: recursive_agent +# - TextCraft stateful env (in-process inventory dict + recipe DB) +# - Up to 4 sub-agents per spawn, depth <= 3 +# - Team reward (env.evaluate()) broadcast across the trajectory tree +# +# Model + dataset + hyperparams match platoon where compatible: +# - Qwen3-4B-Instruct-2507 (no thinking) +# - TextCraft 1000 train / 100 val tasks (synthesized locally from +# bundled Minecraft recipes; no HF download needed) +# - LR 3e-5, β (0.9, 0.95), batch 32, group_size 8, max_steps 50 +# +# Trainer is M2PO + full-FT + SGLang+AstraFlow (substrate differences +# from platoon: CISPO + LoRA + Tinker). See docs page for details. +# +# GPU layout (default, 8 GPUs): +# SERVICE_CUDA_VISIBLE_DEVICES=0,1,2,3 -> RaaS (model0 dp=4) +# TRAINER_MODEL0_GPUS=4,5,6,7 -> Trainer model0 (FSDP, 4 GPUs) +# ============================================================================ + +experiment: + experiment_name: astraflow-textcraft + trial_name: qwen3-4b-recursive + fileroot: ./data-experiments/${experiment.experiment_name}/${experiment.trial_name} + + model_path: "Qwen/Qwen3-4B-Instruct-2507" # = platoon + tokenizer_path: "Qwen/Qwen3-4B-Instruct-2507" # = platoon + seed: 1 + dtype: bfloat16 + weight_transfer_mode: tcp + weight_transfer_strategies: full + +raas: + models: + model0: + backend: sglang + gconfig: + n_samples: 8 # = platoon group_size (train) + temperature: 1.0 + max_new_tokens: 1024 # per-turn budget for the recursive agent + min_new_tokens: 0 + +dataflow: + host: "0.0.0.0" + port: 8000 + + # Rollout dump dir for recursive-agent sanity checking. The dataflow + # loader substitutes ${experiment.*} placeholders and propagates this + # into workflow_spec.dump_dir. + dump_dir: "./data-experiments/${experiment.experiment_name}/${experiment.trial_name}/rollout_dumps" + + buffer: + size: 10000 + replay_size: 10000 + replay_ratio: 0 + max_staleness: 8 # = platoon max_staleness + filter_function: filter_zero_adv + + rollout_dataset: + dataset_fn: "astraflow.dataflow.dataset.textcraft:get_textcraft_rl_dataset" + num_tasks: 1000 # = platoon + num_val: 100 + seed: 42 + + workflow_spec: + workflow_cls: "recursive_agent" + reward_fn: "textcraft_success" # stub; recursive_agent uses env.evaluate() + enable_thinking: false # = platoon + max_depth: 3 # AstraFlow safety cap (platoon: unbounded) + max_breadth: 4 # AstraFlow safety cap (platoon: unbounded) + max_steps_per_episode: 50 # = platoon max_steps + max_concurrent_subagents: 8 # bounds K^N RaaS queue blowup + delegation_reward_cap: 0.0 # = platoon _TEXTCRAFT_DELEGATION_REWARD_CAP + depth_level_weighting: false # disabled: was applying 1/(depth+1) to raw reward, which gives sub-agents backwards credit. Platoon applies a different (mass-preserving inverse-traj-count) formula on advantages, not raw rewards — porting that properly is a separate change. + # Sampling rate for rollout dumps. 1.0 for v1 validation; for + # multi-hundred-step runs we lower to keep disk usage bounded. + dump_prob: 0.02 + + eval_workflows: + textcraft_eval: + workflow_cls: "recursive_agent" + reward_fn: "textcraft_success" + enable_thinking: false + max_depth: 3 + max_breadth: 4 + max_steps_per_episode: 50 + delegation_reward_cap: 0.0 + depth_level_weighting: false # eval doesn't need weighting + dump_prob: 0.05 + gconfig_overrides: + n_samples: 1 # = platoon eval group_size + # Stochastic eval with moderate temperature, like our math + # recipes. Adds some per-task noise (≈2% floor on a 100-task + # set) but gives a softer view of capability than greedy. + temperature: 0.6 + + eval_datasets: + textcraft_val: + dataset_fn: "astraflow.dataflow.dataset.textcraft:get_textcraft_eval_dataset" + num_val: 100 # = platoon + num_train: 1000 + seed: 42 + repeat: 1 + eval_workflow: textcraft_eval + +trainer_base: + total_train_steps: 1000 # extended from 100 to continue v20 + train_batch_size: 512 # = platoon batch_size + n_samples: 8 + engine: + backend: fsdp + data_parallel_size: 4 + + actor: + gradient_checkpointing: true + mb_spec: + max_tokens_per_mb: 32768 # match raas.context_length=32768; recursive agent rollouts can be ~20k+ tokens + optimizer: + type: adam + lr: 3e-6 # = platoon + weight_decay: 0.0 + beta1: 0.9 # = platoon + beta2: 0.95 # = platoon + eps: 1e-8 + lr_scheduler_type: constant + gradient_clipping: 1.0 # standard PPO grad clip. v16 saw grad_norm spikes up to 18.6 destabilizing policy. (DO NOT SET TO 0 — that clips ALL grads to ZERO so the optimizer step never moves the weights.) + # M2PO (ours; platoon uses CISPO) + m2_threshold: 0.01 + eps_clip: 100.0 + eps_clip_higher: 100.0 + reward_scaling: 1 + reward_bias: 0 + kl_ctl: 0.00 + kl_penalty_coef: 0.001 # platoon default + ppo_n_minibatches: 4 # = platoon num_minibatches + reward_norm: { mean_level: group, std_level: group } + adv_norm: { mean_level: batch, std_level: batch } + + ref: + path: "Qwen/Qwen3-4B-Instruct-2507" # explicit so KL(actor||ref) is computed against frozen base + mb_spec: + max_tokens_per_mb: 32768 # match raas.context_length=32768; recursive agent rollouts can be ~20k+ tokens + + recover: + mode: auto + freq_steps: 25 # = platoon checkpoint every: 5 + + evaluator: + eval_at_start: true # baseline at v0 + freq_steps: 20 # = platoon eval every: 20 + + stats_logger: + wandb: + mode: online + id_suffix: "uid" + +trainer_model0: + model_id: model0 + stats_logger: + wandb: + tags: ["textcraft", "recursive-agent", "qwen3-4b", "m2po", "platoon-port"] diff --git a/examples/textcraft/qwen3-4b-recursive/yaml/raas.yaml b/examples/textcraft/qwen3-4b-recursive/yaml/raas.yaml new file mode 100644 index 0000000..93693ef --- /dev/null +++ b/examples/textcraft/qwen3-4b-recursive/yaml/raas.yaml @@ -0,0 +1,35 @@ +# ============================================================================ +# RaaS config — Inference serving instance (hardware/resources) +# Experiment: textcraft / qwen3-4b-recursive +# +# Hardware: 4x GPU, TP=1 +# model0: DP=4, TP=1 +# +# Merged with experiment.yaml at launch (--config experiment.yaml --config raas.yaml) +# experiment.yaml provides: model_path, tokenizer_path, seed, dtype, models/gconfig +# ============================================================================ + +rollout: + # n_samples=8 × train_batch_size=32 × MAX_BREADTH=4 worst-case branching + # could exceed the math recipe's 1024 cap during deep spawns. + max_concurrent_rollouts: 2048 + max_concurrent_evals: 64 + pause_grace_period: 3 + enable_adaptive_availability: true + target_waiting_queue_per_dp: 4 + adaptive_step_size: 4 + load_cache_ttl_ms: 100 + +engine: + model0: + backend: sglang + data_parallel_size: 4 + +sglang: + # 32k context: recursion + per-turn observation history accumulate. + # Each turn appends action + observation to chat history, which can + # reach a few thousand tokens per agent over a 50-step episode. + context_length: 32768 + mem_fraction_static: 0.8 + max_running_requests: null + skip_tokenizer_init: true From d4065c83987c8ddb3c89b629191ad323f9982fa3 Mon Sep 17 00:00:00 2001 From: Haizhong Date: Wed, 27 May 2026 13:54:04 -0400 Subject: [PATCH 13/35] feat: add Oolong recursive-agent workflow + Qwen3-4B recipe Ports platoon's OOLONG recursive-agent design (arxiv 2605.06639) to AstraFlow as a new workflow (oolong_recursive) with reward fn (oolong_success), HF dataset loader, and Qwen3-4B-Instruct-2507 recipe under examples/oolong/qwen3-4b-recursive/. Sub-agent grading is currently rule-based for oolong-synth and a placeholder (score=0) for oolong-real until an LLM judge is wired. --- .gitignore | 3 + astraflow/core/workflow/__init__.py | 2 + .../core/workflow/impl/oolong/__init__.py | 16 + astraflow/core/workflow/impl/oolong/env.py | 187 ++++++ .../core/workflow/impl/oolong/eval_helpers.py | 126 ++++ astraflow/core/workflow/impl/oolong/tasks.py | 139 ++++ .../core/workflow/impl/oolong/workflow.py | 626 ++++++++++++++++++ .../core/workflow/reward/oolong_success.py | 23 + astraflow/dataflow/dataset/oolong.py | 98 +++ .../qwen3-4b-recursive/scripts/1_astraflow.sh | 36 + .../qwen3-4b-recursive/scripts/2_raas.sh | 44 ++ .../scripts/3_trainer_model0.sh | 47 ++ .../scripts/run_qwen3-4b-recursive.sh | 116 ++++ .../qwen3-4b-recursive/yaml/experiment.yaml | 171 +++++ .../oolong/qwen3-4b-recursive/yaml/raas.yaml | 30 + 15 files changed, 1664 insertions(+) create mode 100644 astraflow/core/workflow/impl/oolong/__init__.py create mode 100644 astraflow/core/workflow/impl/oolong/env.py create mode 100644 astraflow/core/workflow/impl/oolong/eval_helpers.py create mode 100644 astraflow/core/workflow/impl/oolong/tasks.py create mode 100644 astraflow/core/workflow/impl/oolong/workflow.py create mode 100644 astraflow/core/workflow/reward/oolong_success.py create mode 100644 astraflow/dataflow/dataset/oolong.py create mode 100755 examples/oolong/qwen3-4b-recursive/scripts/1_astraflow.sh create mode 100755 examples/oolong/qwen3-4b-recursive/scripts/2_raas.sh create mode 100755 examples/oolong/qwen3-4b-recursive/scripts/3_trainer_model0.sh create mode 100755 examples/oolong/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh create mode 100644 examples/oolong/qwen3-4b-recursive/yaml/experiment.yaml create mode 100644 examples/oolong/qwen3-4b-recursive/yaml/raas.yaml diff --git a/.gitignore b/.gitignore index 5ea9106..fe2c281 100644 --- a/.gitignore +++ b/.gitignore @@ -231,3 +231,6 @@ evaluation/data/AReaL-boba-2-RL-Code tmp* torchelastic_* torchinductor_* + +# Oolong HF dataset cache (auto-downloaded, multi-GB) +astraflow/core/workflow/impl/oolong/oolong_*.jsonl diff --git a/astraflow/core/workflow/__init__.py b/astraflow/core/workflow/__init__.py index 58425c1..b9b7bef 100644 --- a/astraflow/core/workflow/__init__.py +++ b/astraflow/core/workflow/__init__.py @@ -26,6 +26,7 @@ import astraflow.core.workflow.impl.sm_lg_router import astraflow.core.workflow.impl.spawn import astraflow.core.workflow.impl.textcraft.workflow # registers recursive_agent +import astraflow.core.workflow.impl.oolong.workflow # registers oolong_recursive import astraflow.core.workflow.impl.vision_rlvr import astraflow.core.workflow.reward.clevr_count_70k import astraflow.core.workflow.reward.geometry3k @@ -33,3 +34,4 @@ import astraflow.core.workflow.reward.human_eval_reward import astraflow.core.workflow.reward.livecodebench_reward import astraflow.core.workflow.reward.textcraft_success # noqa: F401 +import astraflow.core.workflow.reward.oolong_success # noqa: F401 diff --git a/astraflow/core/workflow/impl/oolong/__init__.py b/astraflow/core/workflow/impl/oolong/__init__.py new file mode 100644 index 0000000..ba264ae --- /dev/null +++ b/astraflow/core/workflow/impl/oolong/__init__.py @@ -0,0 +1,16 @@ +"""Oolong recursive-agent workflow for long-context aggregation. + +Port of platoon's Oolong setup (see `claude-doc/oolong-plan.md`): +- workflow_cls: oolong_recursive +- Python sandbox env: stateful exec() namespace per agent, pre-populated + with `context`, `finish`, `launch_subagent`, and `asyncio`. +- Agent emits `......` blocks; the + Python may call `finish(answer)` or `await launch_subagent(goal, context)`. +- Reward (per Gandhi et al. 2026, "Recursive Agent Optimization"): + R(X) = success(X) + lambda * mean(success(children)) + with lambda=0.4 by default for Oolong (paper's choice for OOLONG-REAL). +""" + +# Importing workflow triggers registration of the `oolong_recursive` +# workflow_cls via @register_workflow. +from astraflow.core.workflow.impl.oolong import workflow # noqa: F401 diff --git a/astraflow/core/workflow/impl/oolong/env.py b/astraflow/core/workflow/impl/oolong/env.py new file mode 100644 index 0000000..e658d2e --- /dev/null +++ b/astraflow/core/workflow/impl/oolong/env.py @@ -0,0 +1,187 @@ +"""Per-agent Python sandbox env for Oolong. + +Each agent gets a stateful exec() namespace pre-populated with: + - `context: str` -- the (potentially huge) text to process + - `asyncio` module + - `finish(answer: Any) -> None` -- raises FinishSignal to end the episode + - `launch_subagent(goal: str, context: str = "") -> str` -- async callback + into the workflow that spawns a child agent and returns its finish text. + +State persists across turns: variables defined in turn N are visible in +turn N+1. Top-level `await` is supported via `PyCF_ALLOW_TOP_LEVEL_AWAIT`. + +Reward is computed at finish() time via the platoon-ported scorers in +`eval_helpers.py`. For oolong-real the scorer is a placeholder (=0.0) +until we add an LLM judge. +""" + +from __future__ import annotations + +import ast +import asyncio +import io +import json +import textwrap +import traceback +from contextlib import redirect_stderr, redirect_stdout +from dataclasses import dataclass +from typing import Any, Awaitable, Callable + +from astraflow.core.workflow.impl.oolong.eval_helpers import ( + dnd_process_response, + synth_process_response, +) +from astraflow.core.workflow.impl.oolong.tasks import Task + + +# Sentinel exception used to terminate the agent's code when finish() is +# called. Carries the answer payload. +class FinishSignal(Exception): + def __init__(self, payload: Any): + super().__init__("FinishSignal") + self.payload = payload + + +# Cap how much sandbox stdout we surface back to the model per turn. +# Oolong agents like to `print(context)`, which can be >50k chars. We +# truncate to keep the chat history manageable; agents can chunk explicitly. +DEFAULT_STDOUT_TRUNCATE = 8000 + + +# Signature: launch_subagent(goal, context) -> finish_message_string. +# The workflow injects this when constructing the env. +SpawnCallback = Callable[[str, str], Awaitable[str]] + + +@dataclass +class ExecResult: + """One Python code execution result.""" + stdout: str + stderr: str + error: str | None # traceback string if user code raised + truncated: bool + + +class OolongEnv: + """Stateful Python sandbox for one agent.""" + + def __init__( + self, + task: Task, + spawn_callback: SpawnCallback | None = None, + stdout_truncate: int = DEFAULT_STDOUT_TRUNCATE, + ): + self.task = task + self.stdout_truncate = stdout_truncate + self._spawn_cb = spawn_callback + + self.finished: bool = False + self.finish_payload: Any | None = None + + # Per-agent telemetry, mirroring TextCraft. + self.subagent_launched: int = 0 + self.subagent_succeeded: float = 0.0 + + # The stateful namespace. Pre-populate the helpers the agent needs. + ctx = str(task.misc.get("context", "")) + self.globals: dict[str, Any] = { + "__name__": "__oolong_sandbox__", + "__builtins__": __builtins__, + "asyncio": asyncio, + "context": ctx, + "finish": self._finish, + "launch_subagent": self._launch_subagent, + "json": json, + } + + # ---------------------------- exposed Python API -------------------------- + + def _finish(self, answer: Any) -> None: + raise FinishSignal(answer) + + async def _launch_subagent(self, goal: str, context: str = "") -> str: + """Async callback into the workflow to spawn a child agent. + + Returns the child's finish_message string (or an empty string if the + child never finished cleanly). + """ + if self._spawn_cb is None: + raise RuntimeError( + "launch_subagent called but no spawn_callback was injected by the workflow" + ) + self.subagent_launched += 1 + result = await self._spawn_cb(str(goal), str(context)) + # Caller's "success" telemetry is tracked at the workflow level (we + # do not know the child's reward here without a round-trip). + return result + + # ----------------------------- code execution ----------------------------- + + async def run_code(self, code: str) -> ExecResult: + """Execute one block of Python code in the persistent namespace. + + Supports top-level `await` (e.g. `await launch_subagent(...)`). + Captures stdout/stderr, truncates if huge. + """ + # Compile with top-level-await support so the code may use `await` + # directly (without us wrapping it in an `async def`). + flags = ast.PyCF_ALLOW_TOP_LEVEL_AWAIT + finish_payload: Any = None + + stdout_buf = io.StringIO() + stderr_buf = io.StringIO() + err_str: str | None = None + + try: + compiled = compile(textwrap.dedent(code), "", "exec", flags=flags) + except SyntaxError as e: + return ExecResult(stdout="", stderr=str(e), error=f"SyntaxError: {e}", truncated=False) + + try: + with redirect_stdout(stdout_buf), redirect_stderr(stderr_buf): + # eval(compiled, ...) returns either None or a coroutine, + # depending on whether the code contained top-level await. + result = eval(compiled, self.globals) + if asyncio.iscoroutine(result): + await result + except FinishSignal as fs: + finish_payload = fs.payload + self.finished = True + self.finish_payload = finish_payload + except Exception: + err_str = traceback.format_exc(limit=10) + + out = stdout_buf.getvalue() + err = stderr_buf.getvalue() + truncated = False + if len(out) > self.stdout_truncate: + out = out[: self.stdout_truncate] + f"\n[... stdout truncated, total={len(stdout_buf.getvalue())} chars ...]" + truncated = True + return ExecResult(stdout=out, stderr=err, error=err_str, truncated=truncated) + + # ----------------------------- evaluation --------------------------------- + + def evaluate(self) -> tuple[float, dict[str, Any]]: + """Reward for THIS agent. Called at the agent's finish() time. + + Routes to the right grader based on task_id prefix: + - oolong.synth.* -> rule-based synth_process_response + - oolong.real.* -> dnd_process_response (placeholder for now) + - synthetic sub-agent task ids (no "oolong." prefix) -> 0.0 + placeholder; will need an LLM judge per the paper (Appendix A.7). + """ + if not self.finished: + return 0.0, {"reason": "agent never called finish()"} + + task_id = self.task.id or "" + output = "" if self.finish_payload is None else str(self.finish_payload) + + if task_id.startswith("oolong.synth."): + r = synth_process_response(self.task.misc, output) + elif task_id.startswith("oolong.real."): + r = dnd_process_response(self.task.misc, output) + else: + # Sub-agent task — no root verifier available without an LLM judge. + r = {"score": 0.0, "reason": "no node-local verifier (LLM judge not yet wired)"} + + return float(r.get("score", 0.0)), r diff --git a/astraflow/core/workflow/impl/oolong/eval_helpers.py b/astraflow/core/workflow/impl/oolong/eval_helpers.py new file mode 100644 index 0000000..98271e7 --- /dev/null +++ b/astraflow/core/workflow/impl/oolong/eval_helpers.py @@ -0,0 +1,126 @@ +"""Rule-based graders for oolong-synth (ported from platoon). + +Source: + https://github.com/abertsch72/oolong/blob/main/src/eval/eval_helpers.py + platoon/plugins/oolong/platoon/oolong/eval_helpers.py + +We only port the synth scorer for now; oolong-real requires an LLM judge +which we defer to a follow-up (see Appendix A.7 of arxiv 2605.06639). +""" + +from __future__ import annotations + +import ast +import re +from datetime import datetime +from typing import Any + +try: + import dateutil.parser # type: ignore[import-untyped] + _HAS_DATEUTIL = True +except ImportError: + _HAS_DATEUTIL = False + + +def synth_attempt_answer_parse(answer: str) -> tuple[str, str]: + """Extract the candidate answer string from the agent's finish() output. + + Returns (candidate, parse_confidence in {"low","med","high","vhigh"}). + """ + parse_confidence = "low" + if ":" not in answer: # bad start + if len(answer) < 20: # short, return the whole thing + return answer, parse_confidence + return answer.split()[-1], parse_confidence + + candidate = answer.split(":")[-1].strip() + candidate = candidate.replace("*", "") # strip markdown bold + candidate = candidate.replace("[", "").replace("]", "") # strip brackets + + parse_confidence = "med" + if any(tok in answer for tok in ("User:", "Answer:", "Date:", "Label")): + parse_confidence = "high" + + if len(candidate) < 20: + parse_confidence = "vhigh" + elif "more common" in candidate: + candidate = "more common" + elif "less common" in candidate: + candidate = "less common" + elif "same frequency" in candidate: + candidate = "same frequency" + + return candidate, parse_confidence + + +def synth_process_response(datapoint: dict[str, Any], output: str) -> dict[str, Any]: + """Compute (score, parse_confidence) for an oolong-synth task. + + Matches platoon's `synth_process_response` semantics: + - exact-string match -> 1.0 + - NUMERIC: 0.75 ** |gold - pred| partial credit + - DATE: dateutil-parsed equality + - COMPARISON wording: substring match + - else: 0.0 + """ + answer_str = datapoint["answer"] + answer_type = datapoint.get("answer_type", "") + + # Parse gold: stored as a Python list literal like "[47]" or "['spam']", + # or a datetime stamp for date answer types. + if "datetime" not in answer_str: + try: + gold = ast.literal_eval(answer_str)[0] + except (ValueError, SyntaxError, IndexError, TypeError): + return {"score": 0.0, "parse_confidence": "low", + "reason": f"Could not parse gold answer: {answer_str!r}"} + else: + try: + gold = datetime.strptime(answer_str, "[datetime.date(%Y, %m, %d)]") + except (ValueError, TypeError): + return {"score": 0.0, "parse_confidence": "low", + "reason": f"Could not parse gold date: {answer_str!r}"} + + trimmed, parse_confidence = synth_attempt_answer_parse(output) + + score = 0.0 + if str(trimmed) == str(gold): + score = 1.0 + elif str(trimmed) in ("more common", "less common", "same frequency"): + if str(trimmed) in str(gold): + score = 1.0 + elif answer_type == "ANSWER_TYPE.NUMERIC": + try: + t = int(trimmed) + g = int(gold) + score = 0.75 ** abs(g - t) + except (ValueError, TypeError): + parse_confidence = "low" # didn't parse as a number — bad sign + elif answer_type == "ANSWER_TYPE.DATE": + if _HAS_DATEUTIL: + try: + t = dateutil.parser.parse(str(trimmed)) + score = 1.0 if t == gold else 0.0 + except (ValueError, TypeError): + parse_confidence = "low" + else: + parse_confidence = "low" + + return { + "score": float(score), + "parse_confidence": parse_confidence, + "candidate": trimmed, + "gold": str(gold), + } + + +# Placeholder for oolong-real (D&D) — would need an LLM judge. +# We define the function so the workflow can dispatch on dataset name, +# but it always returns score=0 for now. Wire up GPT-5-mini-style judge +# in a follow-up when we add `oolong-real` support. +def dnd_process_response(datapoint: dict[str, Any], output: str) -> dict[str, Any]: + return { + "score": 0.0, + "parse_confidence": "n/a", + "reason": "oolong-real LLM judge not yet implemented; score=0 placeholder.", + } diff --git a/astraflow/core/workflow/impl/oolong/tasks.py b/astraflow/core/workflow/impl/oolong/tasks.py new file mode 100644 index 0000000..c0ea9a2 --- /dev/null +++ b/astraflow/core/workflow/impl/oolong/tasks.py @@ -0,0 +1,139 @@ +"""Task loading for Oolong from HuggingFace, with on-disk JSONL cache. + +Mirrors the platoon loader (oolong-synth / oolong-real). On first call +we hit HuggingFace (`oolongbench/oolong-synth` / `oolong-real`), cache the +examples to `/oolong_{dataset}_{split}.jsonl`, and from then on +load from disk. + +A `Task` here is a lightweight dataclass mirroring platoon's: + Task(goal=question, id=task_id, max_steps=..., misc={...example...}) +""" + +from __future__ import annotations + +import json +import os +from copy import deepcopy +from dataclasses import dataclass, field +from pathlib import Path +from typing import Any, Literal + +_DATA_DIR = Path(__file__).parent +_VALID_DATASETS = ("synth", "real") +_DEFAULT_MAX_STEPS = 50 + +_TASKS: dict[str, "Task"] = {} +_RAW_BY_FILE: dict[Path, list[dict[str, Any]]] = {} + + +@dataclass +class Task: + """Lightweight task carrier matching platoon's shape.""" + goal: str + id: str + max_steps: int = _DEFAULT_MAX_STEPS + misc: dict[str, Any] = field(default_factory=dict) + + +def _hf_name(dataset: str) -> str: + return f"oolongbench/oolong-{dataset}" + + +def _load_from_hf(dataset: str, split: str) -> list[dict[str, Any]]: + """Hit HF; return list of dicts.""" + try: + from datasets import load_dataset # type: ignore[import-untyped] + except ImportError as exc: + raise ImportError( + "datasets library is required. Install with: pip install datasets" + ) from exc + + name = _hf_name(dataset) + if dataset == "real": + ds = load_dataset(name, "dnd", split=split) + else: + ds = load_dataset(name, split=split) + return [dict(ex) for ex in ds] + + +def _cache_path(dataset: str, split: str) -> Path: + return _DATA_DIR / f"oolong_{dataset}_{split}.jsonl" + + +def _ensure_cached(dataset: str, split: str) -> list[dict[str, Any]]: + """Return parsed raw rows, downloading/caching from HF if needed.""" + path = _cache_path(dataset, split) + if path in _RAW_BY_FILE: + return _RAW_BY_FILE[path] + + if not path.exists(): + rows = _load_from_hf(dataset, split) + # Atomic write + tmp = path.with_suffix(".jsonl.tmp") + with open(tmp, "w") as f: + for row in rows: + f.write(json.dumps(row) + "\n") + os.replace(tmp, path) + else: + rows = [] + with open(path) as f: + for line in f: + line = line.strip() + if line: + rows.append(json.loads(line)) + + _RAW_BY_FILE[path] = rows + return rows + + +def _example_to_task(example: dict[str, Any], dataset: str, split: str, idx: int) -> Task: + """Convert one HF row into a Task. Pre-extracts the context for env use.""" + task_id = f"oolong.{dataset}.{split}.{idx}" + # Normalize: HF field is `context_window_text`; we expose it as `context`. + misc = dict(example) + if "context_window_text" in misc and "context" not in misc: + misc["context"] = misc.pop("context_window_text") + misc.pop("context_window_text_with_labels", None) + return Task( + goal=str(example.get("question", "")), + id=task_id, + max_steps=_DEFAULT_MAX_STEPS, + misc=misc, + ) + + +def get_task_ids( + dataset: Literal["synth", "real"] = "synth", + split: Literal["validation", "test"] = "validation", + max_context_len: int | None = None, +) -> list[str]: + """Return the ordered list of task IDs for a (dataset, split).""" + if dataset not in _VALID_DATASETS: + raise ValueError(f"dataset must be in {_VALID_DATASETS}, got {dataset!r}") + rows = _ensure_cached(dataset, split) + ids: list[str] = [] + for idx, ex in enumerate(rows): + if max_context_len is not None: + ctx = ex.get("context_window_text") or ex.get("context") or "" + if len(ctx) > max_context_len: + continue + ids.append(f"oolong.{dataset}.{split}.{idx}") + return ids + + +def get_task(task_id: str) -> Task: + """Return a deep-copy of the Task for a given ID.""" + if task_id in _TASKS: + return deepcopy(_TASKS[task_id]) + + parts = task_id.split(".") + if len(parts) != 4 or parts[0] != "oolong": + raise ValueError(f"Invalid task ID: {task_id!r}") + _, dataset, split, idx_s = parts + idx = int(idx_s) + rows = _ensure_cached(dataset, split) + if idx >= len(rows): + raise IndexError(f"Task index {idx} out of range for {dataset}/{split}") + task = _example_to_task(rows[idx], dataset, split, idx) + _TASKS[task_id] = task + return deepcopy(task) diff --git a/astraflow/core/workflow/impl/oolong/workflow.py b/astraflow/core/workflow/impl/oolong/workflow.py new file mode 100644 index 0000000..a2c539f --- /dev/null +++ b/astraflow/core/workflow/impl/oolong/workflow.py @@ -0,0 +1,626 @@ +"""Oolong recursive-agent workflow. + +Design (per Gandhi et al. 2026, "Recursive Agent Optimization", +arxiv 2605.06639): + +- Multi-turn agent loop. Each turn the model emits one + ``......`` block. The Python code + is executed in a stateful sandbox (per-agent ``exec()`` namespace). +- Tools exposed via the sandbox: + - ``context`` (str): pre-populated with the full input text + - ``finish(answer)`` -> raises FinishSignal, ending the agent + - ``await launch_subagent(goal, context)`` -> spawns a child agent + - ``asyncio`` module: for ``asyncio.gather(...)`` parallel spawns +- Aggregation: parent's ``launch_subagent`` returns the child's + ``finish(...)`` payload as a string. No inventory aliasing; sub-agents + process whatever chunk the parent passes. +- Reward (delegation-bonus): + R(X) = success(X) + lambda * mean(success(children)) + Default lambda = 0.4 (paper's choice for OOLONG-REAL). Computed in a + post-pass over the trajectory tree before per-agent rewards are emitted + to the buffer. +""" + +from __future__ import annotations + +import asyncio +import random +import re +import uuid +from dataclasses import dataclass, field +from typing import Any + +import aiofiles +import aiofiles.os +import torch +from transformers import PreTrainedTokenizerFast + +from astraflow.core.workflow.api.cli_args import GenerationHyperparameters +from astraflow.core.workflow.api.engine_api import InferenceEngine +from astraflow.core.workflow.api.io_struct import ModelRequest, ModelResponse +from astraflow.core.workflow.api.reward_api import AsyncRewardWrapper +from astraflow.core.workflow.api.workflow_api import RolloutWorkflow +from astraflow.core.workflow.registry import register_workflow +from astraflow.core.workflow.utils import logging, stats_tracker +from astraflow.core.workflow.utils.data import resolve_prompt_id +from astraflow.core.workflow.utils.dynamic_import import import_from_string +from astraflow.core.workflow.impl.oolong.env import ( + DEFAULT_STDOUT_TRUNCATE, + OolongEnv, +) +from astraflow.core.workflow.impl.oolong.tasks import Task, get_task + +logger = logging.getLogger("OolongRecursive") + + +# --------------------------------------------------------------------------- +# System prompts +# --------------------------------------------------------------------------- +# Both root and sub use the same recursive-agent prompt format. The prompt +# is taken from platoon's OolongRecursivePromptBuilder; we drop the +# "include_reasoning" branch since we always require .... + +MAIN_SYSTEM_PROMPT = """You are tasked with answering a query that requires analyzing and aggregating information from a large context. + +You have access to a REPL environment with the following pre-loaded variable: +- `context` (str): The full text context to analyze (may be very large) + + +CONTEXT ANALYSIS: +- First check if the length of the context is very large (>32K characters) using `len(context)`. +- For very large contexts (>32K characters), work with chunks rather than the entire context at once. +- Use subagents to process chunks and then aggregate the results to produce a final answer. Try not to split the context into too many chunks (32K characters per chunk is a good rule of thumb). +- If the context <= 32K characters, prefer to process your context by printing out and reading it rather than using programmatic heuristics. +- **IMPORTANT: DO NOT USE regex, string matching, etc. types of programmatic heuristics. Read the context with `print(context)` to be accurate in your answer.** + +SUBAGENT DELEGATION: +- **Do not use subagents if the context you need to process is <= 32K characters.** Just print out the context to observe it directly and answer the question by reading the context. +- You have the ability to spawn subagents (other instantiations of yourself), by providing them with their own `context`/chunk to process and a goal/instruction for what result it should return. +- You can use `await asyncio.gather(...)` to process multiple chunks simultaneously. +- Be specific about the format and type in which you expect subagents to return their results. +- Do not provide the context/chunk as part of the goal. Instead, pass it explicitly as the `context` argument to the `launch_subagent` function. + +ANSWER SUBMISSION: +- You can submit your answer using the `finish` function in the format requested in the user-provided goal. + + +You can perform printing out, peeking into the context, or launching subagents using Python code blocks. You will get multiple steps to complete the task. +For your current step, first briefly reason (~1-3 sentences) about your recursive strategy in tags, then output your code in tags. +Your code will be executed in a Jupyter-like environment and the output will be shown to you. The python code block should be formatted as follows: code block without any other tags. +Do not output anything else except for ...\n... +""" + +SUB_SYSTEM_PROMPT = MAIN_SYSTEM_PROMPT # same prompt for now; differs by initial user message + + +# --------------------------------------------------------------------------- +# Code-block parsing +# --------------------------------------------------------------------------- + +# DOTALL so code can span lines. Lazy match on the body to stop at the +# first matching tag. +_PY_RE = re.compile(r"(.*?)", re.DOTALL) +_THOUGHT_RE = re.compile(r"(.*?)", re.DOTALL) + + +@dataclass +class ParsedCode: + code: str + thought: str = "" + error: str | None = None + raw_text: str = "" + + +def parse_code(text: str) -> ParsedCode: + m = _PY_RE.search(text) + if not m: + return ParsedCode( + code="", + error="no ... block found in response", + raw_text=text, + ) + code = m.group(1) + tm = _THOUGHT_RE.search(text) + thought = tm.group(1).strip() if tm else "" + return ParsedCode(code=code, thought=thought, raw_text=m.group(0)) + + +# --------------------------------------------------------------------------- +# Step-budget tracker (shared across the whole trajectory tree) +# --------------------------------------------------------------------------- + + +@dataclass +class BudgetTracker: + total: int + used: int = 0 + reserved: int = 0 + + def remaining(self) -> int: + return max(0, self.total - self.used - self.reserved) + + def consume(self, n: int = 1) -> bool: + if self.remaining() < n: + return False + self.used += n + return True + + def reserve(self, n: int) -> bool: + if self.remaining() < n: + return False + self.reserved += n + return True + + def release(self, n: int) -> None: + self.reserved = max(0, self.reserved - n) + + +# --------------------------------------------------------------------------- +# Per-agent trajectory record +# --------------------------------------------------------------------------- + + +@dataclass +class AgentTrajectory: + traj_id: str + parent_id: str | None + depth: int + task: Task + is_root: bool + turns: list[tuple[list[int], "ModelResponse"]] = field(default_factory=list) + finish_payload: Any = None + finish_message: str = "" + error_message: str | None = None + reward: float = 0.0 + bonus: float = 0.0 + messages: list[dict[str, str]] = field(default_factory=list) + + +# --------------------------------------------------------------------------- +# Workflow +# --------------------------------------------------------------------------- + + +@register_workflow("oolong_recursive") +class OolongRecursiveWorkflow(RolloutWorkflow): + """Recursive-agent workflow for Oolong long-context aggregation.""" + + def __init__( + self, + reward_fn: str | Any = None, + tokenizer: PreTrainedTokenizerFast | None = None, + gconfig: GenerationHyperparameters | None = None, + # Task-specific knobs (matches platoon defaults for OOLONG-REAL). + max_depth: int = 2, # 0-indexed; 3 levels incl. root + max_breadth: int = 8, # safety cap on children per spawn + max_steps_per_episode: int = 50, + max_concurrent_subagents: int = 8, # RaaS queue bound + delegation_lambda: float = 0.4, # paper default for OOLONG-REAL + sub_max_steps: int = 25, # sub-agent's own step cap + stdout_truncate: int = DEFAULT_STDOUT_TRUNCATE, + enable_thinking: bool = False, + rollout_stat_scope: str = "rollout", + dump_dir: str | None = None, + dump_prob: float = 0.0, + **kwargs: Any, + ): + # Resolve reward_fn for API parity with other workflows (we + # actually use env.evaluate() for the reward signal, not this fn). + self.reward_fn = reward_fn + self.async_reward_fn: Any = None + if isinstance(reward_fn, str): + try: + self.reward_fn = import_from_string(reward_fn) + self.async_reward_fn = AsyncRewardWrapper(self.reward_fn) + except Exception as e: + logger.warning("could not import reward_fn=%r: %s", reward_fn, e) + self.reward_fn = None + + self.tokenizer = tokenizer + self.gconfig = gconfig + self.max_depth = max_depth + self.max_breadth = max_breadth + self.max_steps_per_episode = max_steps_per_episode + self.max_concurrent_subagents = max_concurrent_subagents + self.delegation_lambda = float(delegation_lambda) + self.sub_max_steps = sub_max_steps + self.stdout_truncate = stdout_truncate + self.enable_thinking = bool(enable_thinking) + self.rollout_stat_scope = rollout_stat_scope + self.dump_dir = dump_dir + self.dump_prob = float(dump_prob) + + # ------------------------------------------------------------------ utils + + def _apply_chat_template(self, messages: list[dict], add_generation_prompt: bool = True) -> list[int]: + if self.tokenizer is None: + raise RuntimeError("OolongRecursiveWorkflow has no tokenizer attached") + kwargs: dict[str, Any] = dict( + add_generation_prompt=add_generation_prompt, + return_tensors=None, + ) + # Qwen3-Instruct supports a thinking-mode toggle; default off for parity. + try: + return self.tokenizer.apply_chat_template( + messages, + tokenize=True, + enable_thinking=self.enable_thinking, + **kwargs, + ) + except TypeError: + return self.tokenizer.apply_chat_template(messages, tokenize=True, **kwargs) + + def _build_initial_messages(self, task: Task, is_root: bool) -> list[dict]: + system = MAIN_SYSTEM_PROMPT if is_root else SUB_SYSTEM_PROMPT + # Show the agent only the goal; the context is pre-loaded into the + # sandbox as `context` and can be inspected via `print(context[:N])` + # or `len(context)`. + user = f"Goal: {task.goal}\n" + return [ + {"role": "system", "content": system}, + {"role": "user", "content": user}, + ] + + def _format_observation(self, code_result, parse_error: str | None) -> str: + if parse_error is not None: + return f"ERROR: {parse_error}" + parts = [] + if code_result.stdout: + parts.append(code_result.stdout) + if code_result.error: + parts.append(f"\n[error]\n{code_result.error}") + elif code_result.stderr: + parts.append(f"\n[stderr]\n{code_result.stderr}") + if not parts: + parts.append("(no output)") + return "".join(parts) + + # ------------------------------------------------------------------ episode + + async def _run_episode( + self, + engine: InferenceEngine, + env: OolongEnv, + task: Task, + budget: BudgetTracker, + sem: asyncio.Semaphore, + all_trajs: list[AgentTrajectory], + parent_id: str | None, + depth: int, + is_root: bool, + ) -> AgentTrajectory: + traj_id = uuid.uuid4().hex + traj = AgentTrajectory( + traj_id=traj_id, parent_id=parent_id, depth=depth, task=task, is_root=is_root, + ) + all_trajs.append(traj) + + messages = self._build_initial_messages(task, is_root) + steps_taken = 0 + max_local_steps = ( + task.max_steps if task.max_steps is not None + else (self.max_steps_per_episode if is_root else self.sub_max_steps) + ) + + while not env.finished and steps_taken < max_local_steps: + if not budget.consume(1): + traj.error_message = ( + f"[budget exhausted at local step {steps_taken}; " + f"total {budget.used}/{budget.total}]" + ) + break + + input_ids = self._apply_chat_template(messages, add_generation_prompt=True) + resp = await engine.agenerate( + ModelRequest( + rid=uuid.uuid4().hex, + input_ids=input_ids, + gconfig=self.gconfig.new(n_samples=1), + tokenizer=self.tokenizer, + ) + ) + traj.turns.append((input_ids, resp)) + response_text = self.tokenizer.decode(resp.output_tokens) + + parsed = parse_code(response_text) + if parsed.error is not None: + obs = f"ERROR: {parsed.error}" + stats_tracker.get(self.rollout_stat_scope).scalar(parse_errors=1) + messages.append({"role": "assistant", "content": response_text}) + messages.append({"role": "user", "content": obs}) + steps_taken += 1 + continue + + code_result = await env.run_code(parsed.code) + obs = self._format_observation(code_result, parse_error=None) + messages.append({"role": "assistant", "content": response_text}) + + if env.finished: + # No observation after finish — the episode terminates. + traj.finish_payload = env.finish_payload + traj.finish_message = "" if env.finish_payload is None else str(env.finish_payload) + score, _info = env.evaluate() + traj.reward = float(score) + steps_taken += 1 + break + + messages.append({"role": "user", "content": obs}) + steps_taken += 1 + + traj.messages = messages + return traj + + # ------------------------------------------------------------------ spawn + + def _make_spawn_callback( + self, + engine: InferenceEngine, + budget: BudgetTracker, + sem: asyncio.Semaphore, + all_trajs: list[AgentTrajectory], + parent_id: str, + parent_depth: int, + ): + """Returns an async fn the env can call to launch one sub-agent. + + Each call spawns exactly one child and returns its finish_message + as a string. The agent can wrap multiple calls in asyncio.gather() + to parallelize. + """ + async def _launch(goal: str, context: str) -> str: + if parent_depth >= self.max_depth: + return f"ERROR: max recursion depth ({self.max_depth}) reached; cannot spawn" + # Build a fresh child task. + child_task = Task( + goal=str(goal), + id=f"{parent_id}/sub_{uuid.uuid4().hex[:8]}", + max_steps=self.sub_max_steps, + misc={"context": str(context)}, + ) + child_env = OolongEnv( + task=child_task, + spawn_callback=self._make_spawn_callback( + engine, budget, sem, all_trajs, child_task.id, parent_depth + 1 + ), + stdout_truncate=self.stdout_truncate, + ) + async with sem: + child_traj = await self._run_episode( + engine=engine, + env=child_env, + task=child_task, + budget=budget, + sem=sem, + all_trajs=all_trajs, + parent_id=parent_id, + depth=parent_depth + 1, + is_root=False, + ) + return child_traj.finish_message or (child_traj.error_message or "") + + return _launch + + # ------------------------------------------------------------------ reward + + def _apply_delegation_bonus(self, all_trajs: list[AgentTrajectory]) -> None: + """Add lambda * mean(children's success) to each agent's reward. + + Mutates each AgentTrajectory.reward in place. Eq. 1 of arxiv + 2605.06639. lambda=0 disables (pure per-agent reward). + """ + if self.delegation_lambda <= 0: + return + # Build children index by parent_id. + children: dict[str, list[AgentTrajectory]] = {} + for t in all_trajs: + if t.parent_id is not None: + children.setdefault(t.parent_id, []).append(t) + for t in all_trajs: + kids = children.get(t.traj_id, []) + if not kids: + continue + mean_child_success = sum(k.reward for k in kids) / len(kids) + bonus = self.delegation_lambda * mean_child_success + t.bonus = bonus + t.reward = t.reward + bonus + + # --------------------------------------------------------- sequence packing + + def _build_sequences_for_agent(self, ag: AgentTrajectory, reward: float) -> list[dict[str, torch.Tensor]]: + """Emit one training sequence per turn of this agent. + + Per-turn layout: [turn_input_ids (loss_mask=0)] [response_tokens (loss_mask=1)]. + Matches TextCraft's approach (see textcraft/workflow.py:_build_sequences_for_agent + for the explanation of why per-turn rather than concatenated). + """ + out: list[dict[str, torch.Tensor]] = [] + for input_ids, resp in ag.turns: + seq_ids = list(input_ids) + list(resp.output_tokens) + seq_mask = [0] * len(input_ids) + [1] * len(resp.output_tokens) + seq_logprobs = [0.0] * len(input_ids) + list(resp.output_logprobs) + seq_versions = [-1] * len(input_ids) + list(resp.output_versions) + n = len(seq_ids) + seq = { + "input_ids": torch.tensor(seq_ids, dtype=torch.int32), + "loss_mask": torch.tensor(seq_mask, dtype=torch.int32), + "logprobs": torch.tensor(seq_logprobs, dtype=torch.float32), + "versions": torch.tensor(seq_versions, dtype=torch.int32), + "attention_mask": torch.ones(n, dtype=torch.bool), + "rewards": torch.tensor(reward, dtype=torch.float32), + } + out.append({k: v.unsqueeze(0) for k, v in seq.items()}) + return out + + # ------------------------------------------------------------------ entry + + async def _run_one_rollout( + self, + engine: InferenceEngine, + data: dict[str, Any], + rollout_idx: int, + ) -> dict[str, Any]: + task = self._task_from_data(data) + budget = BudgetTracker(total=task.max_steps or self.max_steps_per_episode) + sem = asyncio.Semaphore(self.max_concurrent_subagents) + all_trajs: list[AgentTrajectory] = [] + + root_id = task.id # used as parent_id for top-level children + env = OolongEnv( + task=task, + spawn_callback=self._make_spawn_callback( + engine, budget, sem, all_trajs, root_id, parent_depth=0 + ), + stdout_truncate=self.stdout_truncate, + ) + + await self._run_episode( + engine=engine, env=env, task=task, budget=budget, sem=sem, + all_trajs=all_trajs, parent_id=None, depth=0, is_root=True, + ) + + # Apply delegation bonus across the tree. + self._apply_delegation_bonus(all_trajs) + + # Root-only training: emit ONLY the root agent's sequences for + # PPO. v2 (team-credit, bs=64) and v3 (team-credit, bs=256) both + # showed pre_filter degrading from 0.6-0.8 → 0.2-0.4 in <10 steps. + # Root tokens already include `await launch_subagent(...)` calls, + # so the model still learns to spawn from the root's gradient. + # The sub-agent's own generations don't get a gradient — they need + # a per-segment verifier (LLM judge) to train usefully, which we + # defer per [[spawn-subagent-credit]]. + root_traj = all_trajs[0] if all_trajs else None + team_reward = float(root_traj.reward) if root_traj else 0.0 + + per_agent: list[dict[str, Any]] = [] + for ag in all_trajs: + if not ag.turns or not ag.is_root: + continue + seqs = self._build_sequences_for_agent(ag, team_reward) + per_agent.append({ + "reward": team_reward, + "sequences": seqs, + "depth": ag.depth, + "is_root": ag.is_root, + }) + + return { + "per_agent": per_agent, + "all_trajs": all_trajs, + "task": task, + "root_reward": team_reward, + "n_agents": len(all_trajs), + "subagent_launched": int(env.subagent_launched), + "subagent_succeeded": float(env.subagent_succeeded), + } + + async def arun_episode( + self, engine: InferenceEngine, data: dict[str, Any] + ) -> dict[str, Any]: + n_samples = max(1, int(self.gconfig.n_samples)) + + rollouts = await asyncio.gather(*[ + self._run_one_rollout(engine, data, i) for i in range(n_samples) + ]) + + # Aggregate metrics. + root_rewards = [r["root_reward"] for r in rollouts] + n_agents_list = [r["n_agents"] for r in rollouts] + launched_total = sum(r["subagent_launched"] for r in rollouts) + + for rw in root_rewards: + stats_tracker.get(self.rollout_stat_scope).scalar(reward=rw) + stats_tracker.get(self.rollout_stat_scope).scalar(env_score=rw) + for na in n_agents_list: + stats_tracker.get(self.rollout_stat_scope).scalar(n_agents=na) + if launched_total > 0: + stats_tracker.get(self.rollout_stat_scope).scalar( + subagent_launched_per_rollout=launched_total / max(1, len(rollouts)), + ) + + # Optional dump (one rollout per group call). + if self.dump_dir is not None and self.dump_prob > 0 and random.random() < self.dump_prob: + try: + await self._dump_trajectory(rollouts[0], data) + except Exception as e: + logger.warning("dump_trajectory failed: %s", e) + + # Flatten to trajectories. + trajectories: list[dict[str, Any]] = [] + rewards_kept: list[float] = [] + for r in rollouts: + for pa in r["per_agent"]: + if not pa["sequences"]: + continue + trajectories.append({"sequences": pa["sequences"]}) + rewards_kept.append(pa["reward"]) + + prompt_id = resolve_prompt_id(data) or (rollouts[0]["task"].id if rollouts else None) + + if not trajectories: + return { + "n_trajs": 0, + "rewards": torch.tensor([], dtype=torch.float32), + "trajectories": [], + "prompt_id": prompt_id, + } + return { + "n_trajs": len(trajectories), + "rewards": torch.tensor(rewards_kept, dtype=torch.float32), + "trajectories": trajectories, + "prompt_id": prompt_id, + } + + # ------------------------------------------------------------------ helpers + + def _task_from_data(self, data: dict[str, Any]) -> Task: + """Build a Task from a dataset row. Two supported shapes: + (1) `{"task_id": "oolong.synth.validation.42"}` -> loads via tasks.get_task + (2) inline: `{"context": ..., "question": ..., "answer": ..., ...}` (rare). + """ + if "task_id" in data: + return get_task(data["task_id"]) + return Task( + goal=str(data.get("question") or data.get("goal") or ""), + id=str(data.get("id") or data.get("query_id") or uuid.uuid4().hex), + max_steps=int(data.get("max_steps", self.max_steps_per_episode)), + misc=dict(data), + ) + + async def _dump_trajectory(self, rollout: dict[str, Any], data: dict[str, Any]) -> None: + """Append a human-readable dump of one rollout for offline inspection.""" + if self.dump_dir is None: + return + await aiofiles.os.makedirs(self.dump_dir, exist_ok=True) + task = rollout["task"] + # Subdir per weight version when present in agentic dumps. + sub = "0" + try: + v = rollout["all_trajs"][0].turns[0][1].output_versions[0] + sub = str(int(v)) + except Exception: + pass + out_dir = f"{self.dump_dir}/{sub}" + await aiofiles.os.makedirs(out_dir, exist_ok=True) + out_path = f"{out_dir}/oolong-{abs(hash(task.id)) % 100_000_000:08d}.txt" + async with aiofiles.open(out_path, "w") as f: + await f.write( + f"=== Episode reward={rollout['root_reward']:.3f} n_agents={rollout['n_agents']} ===\n\n" + ) + for ag in rollout["all_trajs"]: + tag = "ROOT" if ag.is_root else f"SUB depth={ag.depth}" + await f.write( + f"--- {tag} traj_id={ag.traj_id} task='{ag.task.goal[:120]}' " + f"per_agent_reward={ag.reward:.3f} bonus={ag.bonus:.3f} steps={len(ag.turns)} ---\n" + ) + if ag.error_message: + await f.write(f" (error: {ag.error_message})\n") + if ag.finish_message: + await f.write(f" finish_message: {ag.finish_message[:400]}\n") + if ag.messages: + for j, msg in enumerate(ag.messages): + body = msg["content"] + if len(body) > 2000: + body = body[:2000] + f"\n[...truncated, total {len(msg['content'])} chars...]" + await f.write(f" [{j}] {msg['role']}:\n {body}\n") + await f.write("\n") diff --git a/astraflow/core/workflow/reward/oolong_success.py b/astraflow/core/workflow/reward/oolong_success.py new file mode 100644 index 0000000..35d7a76 --- /dev/null +++ b/astraflow/core/workflow/reward/oolong_success.py @@ -0,0 +1,23 @@ +"""Oolong reward function (API-parity stub). + +The oolong_recursive workflow computes its own reward via the platoon-ported +rule-based grader in `impl/oolong/eval_helpers.py`. This module exists so a +yaml `reward_fn: oolong_success` resolves to *something* — the workflow +won't actually call it. +""" + +from typing import Any + +from astraflow.core.workflow.registry import register_reward + + +@register_reward("oolong_success") +def oolong_success_reward_fn( + prompt: str, + completions: str, + prompt_ids: list[int], + completion_ids: list[int], + **kwargs: Any, +) -> float: + """Stub reward — oolong_recursive does not call this. Returns 0.0 if invoked.""" + return 0.0 diff --git a/astraflow/dataflow/dataset/oolong.py b/astraflow/dataflow/dataset/oolong.py new file mode 100644 index 0000000..f563830 --- /dev/null +++ b/astraflow/dataflow/dataset/oolong.py @@ -0,0 +1,98 @@ +"""Oolong dataset loaders for the oolong_recursive workflow. + +Each row references one Oolong task by `task_id`; the workflow re-loads +the full Task (including the large `context` string) via `get_task` — +keeping the per-row payload tiny and avoiding cache bloat. +""" + +from __future__ import annotations + +import json +from logging import getLogger +from pathlib import Path + +from datasets import Dataset + +from astraflow.core.workflow.impl.oolong.tasks import ( + Task, + get_task, + get_task_ids, +) +from astraflow.dataflow.dataset.utils import attach_query_ids + +logger = getLogger(__name__) + + +def _row_for_task_id(task_id: str) -> dict: + """Materialize one HF-Dataset row. Schema-uniform across rows.""" + task = get_task(task_id) + # The agent sees only the goal in the chat; `context` is pre-loaded + # into the Python sandbox by OolongEnv (not put in the prompt). + user = f"Goal: {task.goal}" + return { + "task_id": task.id, + "messages": [{"role": "user", "content": user}], + "answer": task.id, + } + + +def get_oolong_rl_dataset( + tokenizer=None, + max_length: int | None = None, + dataset: str = "synth", + split: str = "validation", + num_tasks: int | None = None, + max_context_len: int | None = None, + seed: int = 42, # unused — Oolong is deterministic + dataset_name: str = "oolong", +) -> Dataset: + """Return a HF Dataset of Oolong tasks for RL training. + + Args: + dataset: "synth" or "real" + split: "validation" or "test" (Oolong has no separate "train" split; + we use "validation" as training data, "test" as held-out) + num_tasks: cap the dataset size (None = all) + max_context_len: filter out tasks with context_window_text > this length + """ + task_ids = get_task_ids( + dataset=dataset, split=split, max_context_len=max_context_len, + ) + if num_tasks is not None: + task_ids = task_ids[:num_tasks] + rows = [_row_for_task_id(tid) for tid in task_ids] + ds = Dataset.from_list(rows) + ds = attach_query_ids(ds, dataset_name) + if max_length is not None and tokenizer is not None: + def short_enough(sample): + content = sample["messages"][0]["content"] + return len(tokenizer.encode(content)) <= max_length + ds = ds.filter(short_enough) + return ds + + +def get_oolong_eval_dataset( + tokenizer=None, + max_length: int | None = None, + dataset: str = "synth", + split: str = "test", + num_val: int | None = 100, + max_context_len: int | None = None, + seed: int = 42, + dataset_name: str = "oolong_val", +) -> Dataset: + """Return a HF Dataset of Oolong tasks for eval.""" + task_ids = get_task_ids( + dataset=dataset, split=split, max_context_len=max_context_len, + ) + if num_val is not None: + task_ids = task_ids[:num_val] + rows = [_row_for_task_id(tid) for tid in task_ids] + ds = Dataset.from_list(rows) + ds = attach_query_ids(ds, dataset_name) + if max_length is not None and tokenizer is not None: + def short_enough(sample): + content = sample["messages"][0]["content"] + return len(tokenizer.encode(content)) <= max_length + ds = ds.filter(short_enough) + return ds diff --git a/examples/oolong/qwen3-4b-recursive/scripts/1_astraflow.sh b/examples/oolong/qwen3-4b-recursive/scripts/1_astraflow.sh new file mode 100755 index 0000000..cf7df94 --- /dev/null +++ b/examples/oolong/qwen3-4b-recursive/scripts/1_astraflow.sh @@ -0,0 +1,36 @@ +#!/bin/bash +set -euo pipefail +# [1/3] Launch AstraFlow HTTP service +# +# Usage (terminal 1): +# bash examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh + +export CUDA_VISIBLE_DEVICES="" + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== AstraFlow HTTP Service ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "Port : ${ASTRAFLOW_PORT}" +echo "===============================" + +python3 -u -m astraflow \ + --config "${EXPERIMENT_CONFIG}" \ + --port "${ASTRAFLOW_PORT}" \ + --host "${ASTRAFLOW_HOST}" \ + 2>&1 | tee "${LOG_DIR}/astraflow.log" diff --git a/examples/oolong/qwen3-4b-recursive/scripts/2_raas.sh b/examples/oolong/qwen3-4b-recursive/scripts/2_raas.sh new file mode 100755 index 0000000..5d88b2b --- /dev/null +++ b/examples/oolong/qwen3-4b-recursive/scripts/2_raas.sh @@ -0,0 +1,44 @@ +#!/bin/bash +set -euo pipefail +# [2/3] Launch RaaS inference server (SGLang + TCP receiver) +# +# Usage (terminal 2, after AstraFlow is ready): +# bash examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" +export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="${ASTRAFLOW_URL:-http://127.0.0.1:${ASTRAFLOW_PORT}}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== RaaS Inference Server (SGLang + TCP receiver) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "RaaS config : ${RAAS_CONFIG}" +echo "GPUs : ${CUDA_VISIBLE_DEVICES}" +echo "Port : ${RAAS_PORT}" +echo "AstraFlow URL : ${ASTRAFLOW_URL}" +echo "=======================================================" + +python3 -u -m astraflow.raas.server \ + --host "${RAAS_HOST}" \ + --port "${RAAS_PORT}" \ + --config "${EXPERIMENT_CONFIG}" \ + --config "${RAAS_CONFIG}" \ + --engine-id "${ENGINE_ID:-default}" \ + --astraflow-url "${ASTRAFLOW_URL}" \ + 2>&1 | tee "${LOG_DIR}/raas.log" diff --git a/examples/oolong/qwen3-4b-recursive/scripts/3_trainer_model0.sh b/examples/oolong/qwen3-4b-recursive/scripts/3_trainer_model0.sh new file mode 100755 index 0000000..cb8e850 --- /dev/null +++ b/examples/oolong/qwen3-4b-recursive/scripts/3_trainer_model0.sh @@ -0,0 +1,47 @@ +#!/bin/bash +set -euo pipefail +# [3/3] Launch Trainer for model0 (TCP, sender_agent on local_rank 0) +# +# Usage (terminal 3, after AstraFlow and RaaS are ready): +# bash examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS:-4,5,6,7}" +TRAINER0_NPROC="$(echo "${CUDA_VISIBLE_DEVICES}" | awk -F',' '{print NF}')" + +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" +export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" + +# sender_agent (in trainer) listens on this HTTP port +export WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== Trainer model0 (TCP) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "GPUs : ${CUDA_VISIBLE_DEVICES} (FSDP dp${TRAINER0_NPROC})" +echo "AstraFlow : ${ASTRAFLOW_URL}" +echo "RaaS : ${ASTRAFLOW_RAAS_URL}" +echo "Sender HTTP : ${WEIGHT_TRANSFER_HTTP_PORT}" +echo "WANDB mode : ${WANDB_MODE:-online}" +echo "==========================================" + +torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ + --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ + examples/launch_trainer.py \ + --config "${EXPERIMENT_CONFIG}" \ + --trainer trainer_model0 \ + "$@" 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/oolong/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh b/examples/oolong/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh new file mode 100755 index 0000000..ced8ff7 --- /dev/null +++ b/examples/oolong/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh @@ -0,0 +1,116 @@ +#!/bin/bash +set -euo pipefail +# All-in-one launcher for AstraFlow training with the RECURSIVE-AGENT +# workflow on TextCraft (Qwen3-4B-Instruct-2507, M2PO, platoon port). +# +# Workflow: recursive_agent. Agent emits one {JSON} +# per turn (craft / get_info / view_inventory / spawn / finish). Spawn +# fans out up to 4 sub-agents in parallel via asyncio.gather, each +# inheriting the parent's inventory by reference. Tree-structured +# trajectory flattened to one trajectory with N sequences sharing the +# env-based team reward. +# +# TextCraft task data is synthesized locally on first run from the +# bundled Minecraft recipe DB (no HF download required). Files land at +# astraflow/core/workflow/impl/textcraft/textcraft_{train,val}.jsonl. +# +# Launches 3 processes: +# 1. AstraFlow HTTP service (CPU-only) +# 2. RaaS inference server (SGLang, SERVICE_CUDA_VISIBLE_DEVICES) +# 3. Trainer model0 (FSDP, TRAINER_MODEL0_GPUS) +# +# Usage: +# bash examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh + +# ============================================================================= +# Part 1: Load env and settings +# ============================================================================= +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +# Defined in examples/_common/utils.sh. +astraflow_load_experiment_env + +# ============================================================================= +# Part 2: Set up env +# ============================================================================= +# GPU assignments (default: 4 GPUs for inference, 4 for training) +export SERVICE_CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" +export TRAINER_MODEL0_GPUS="${TRAINER_MODEL0_GPUS:-4,5,6,7}" +# Ports / URLs (each component gets its own port) +export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" +export WEIGHT_TRANSFER_HTTP_PORT_MODEL0="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" + +TRAINER0_NPROC="$(echo "${TRAINER_MODEL0_GPUS}" | awk -F',' '{print NF}')" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. +# Defined in examples/_common/utils.sh. +astraflow_setup_env + +# ============================================================================= +# Part 3: Print info and clean up +# ============================================================================= +echo "=== AstraFlow (Qwen3-4B, TextCraft, M2PO, ctx32k, TCP, RECURSIVE AGENT) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "RaaS config : ${RAAS_CONFIG}" +echo "RaaS GPUs : ${SERVICE_CUDA_VISIBLE_DEVICES}" +echo "Trainer model0 GPUs : ${TRAINER_MODEL0_GPUS} (FSDP dp${TRAINER0_NPROC})" +echo "RaaS port : ${RAAS_PORT}" +echo "AstraFlow port : ${ASTRAFLOW_PORT}" +echo "Sender HTTP model0 : ${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" +echo "WANDB mode : ${WANDB_MODE:-online}" +echo "==========================================================" + +trap astraflow_cleanup_trap EXIT INT TERM + +# Kill leftover processes and shared memory from prior runs. +# Defined in examples/_common/utils.sh. +astraflow_kill_stale + +# ============================================================================= +# Part 4: Launch training +# ============================================================================= +echo "[1/3] Starting AstraFlow HTTP service..." +CUDA_VISIBLE_DEVICES="" \ + python3 -u -m astraflow \ + --config "${EXPERIMENT_CONFIG}" \ + --port "${ASTRAFLOW_PORT}" \ + --host "${ASTRAFLOW_HOST}" \ + 2>&1 | tee "${LOG_DIR}/astraflow.log" & +sleep 5 + +echo "[2/3] Starting RaaS inference server (SGLang + TCP receiver)..." +CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES}" \ + python3 -u -m astraflow.raas.server \ + --host "${RAAS_HOST}" \ + --port "${RAAS_PORT}" \ + --config "${EXPERIMENT_CONFIG}" \ + --config "${RAAS_CONFIG}" \ + --engine-id "${ENGINE_ID:-default}" \ + --astraflow-url "${ASTRAFLOW_URL}" \ + 2>&1 | tee "${LOG_DIR}/raas.log" & +sleep 15 + +export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" + +echo "[3/3] Starting trainer model0..." +CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS}" \ +WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" \ + torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ + --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ + examples/launch_trainer.py \ + --config "${EXPERIMENT_CONFIG}" \ + --trainer trainer_model0 \ + "$@" \ + 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/oolong/qwen3-4b-recursive/yaml/experiment.yaml b/examples/oolong/qwen3-4b-recursive/yaml/experiment.yaml new file mode 100644 index 0000000..56f72d0 --- /dev/null +++ b/examples/oolong/qwen3-4b-recursive/yaml/experiment.yaml @@ -0,0 +1,171 @@ +# ============================================================================ +# Experiment config — AstraFlow service + Trainer (OOLONG RECURSIVE AGENT) +# Experiment: oolong / qwen3-4b-recursive +# +# Port of platoon's OOLONG-REAL design (see arxiv 2605.06639, "Recursive +# Agent Optimization", Gandhi et al.): +# - workflow_cls: oolong_recursive +# - Python-sandbox env (exec() namespace per agent), context pre-loaded +# into the sandbox not the prompt +# - ...... action format +# - launch_subagent(goal, context) for spawn; asyncio.gather for parallel +# - Reward = success + lambda * mean(children's success), lambda=0.4 +# - Synth-only rule-based grader for v1 (oolong-real LLM judge is TODO) +# +# Model: Qwen3-4B-Instruct-2507 (same as TextCraft recipe; paper used 30B +# but we use 4B for parity with our infra). +# +# GPU layout (8 GPUs): +# SERVICE_CUDA_VISIBLE_DEVICES=0,1,2,3 -> RaaS (model0 dp=4) +# TRAINER_MODEL0_GPUS=4,5,6,7 -> Trainer (FSDP, 4 GPUs) +# ============================================================================ + +experiment: + experiment_name: astraflow-oolong + trial_name: qwen3-4b-oolong-recursive + fileroot: ./data-experiments/${experiment.experiment_name}/${experiment.trial_name} + + model_path: "Qwen/Qwen3-4B-Instruct-2507" + tokenizer_path: "Qwen/Qwen3-4B-Instruct-2507" + seed: 1 + dtype: bfloat16 + weight_transfer_mode: tcp + weight_transfer_strategies: full + +raas: + models: + model0: + backend: sglang + gconfig: + n_samples: 8 + temperature: 1.0 + max_new_tokens: 2048 # per-turn budget; recursive Oolong likes longer thinking + min_new_tokens: 0 + +dataflow: + host: "0.0.0.0" + port: 8000 + + dump_dir: "./data-experiments/${experiment.experiment_name}/${experiment.trial_name}/rollout_dumps" + + buffer: + size: 10000 + replay_size: 10000 + replay_ratio: 0 + max_staleness: 8 + filter_function: filter_zero_adv + + rollout_dataset: + dataset_fn: "astraflow.dataflow.dataset.oolong:get_oolong_rl_dataset" + # Start small: short-context validation tasks only. Once it learns to + # delegate, raise max_context_len and switch to test split. + dataset: synth + split: validation + max_context_len: 8000 # ~2K tokens; safe for 32K ctx + recursion + num_tasks: 200 # subset for fast iteration + + workflow_spec: + workflow_cls: "oolong_recursive" + reward_fn: "oolong_success" + max_depth: 2 # paper: 2 (0-indexed; 3 levels incl. root) + max_breadth: 4 # safety cap + max_steps_per_episode: 25 # root step cap + sub_max_steps: 15 # sub step cap (paper used 15 for sub) + max_concurrent_subagents: 8 + # With team-credit (workflow assigns root_reward to all agents), + # delegation_lambda is redundant: root_reward = root_success + λ·mean(0) = root_success + # since sub-agents have no node-local verifier without an LLM judge. + # Set to 0 to keep semantics explicit. Re-enable when LLM judge lands. + delegation_lambda: 0.0 + stdout_truncate: 8000 + enable_thinking: false + # v1 dump rate. Bump to inspect agent behavior. + dump_prob: 0.02 + + eval_workflows: + oolong_eval: + workflow_cls: "oolong_recursive" + reward_fn: "oolong_success" + max_depth: 2 + max_breadth: 4 + max_steps_per_episode: 25 + sub_max_steps: 15 + delegation_lambda: 0.0 # eval: only root reward counts + stdout_truncate: 8000 + enable_thinking: false + dump_prob: 0.05 + gconfig_overrides: + n_samples: 1 + temperature: 0.6 + + eval_datasets: + oolong_val: + dataset_fn: "astraflow.dataflow.dataset.oolong:get_oolong_eval_dataset" + dataset: synth + split: test + max_context_len: 8000 + num_val: 50 + repeat: 1 + eval_workflow: oolong_eval + +trainer_base: + total_train_steps: 200 + # v2 with bs=64 collapsed (pre_filter 0.80→0.30 in 19 steps). With + # team-credit + recursive trees, each rollout produces ~15-30 sequences, + # so bs=64 covers only ~2-4 unique prompts/step — too few unique groups + # to survive filter_zero_adv. v20 (TextCraft) used bs=512 successfully; + # using bs=256 here as a balance. + train_batch_size: 256 + n_samples: 8 + engine: + backend: fsdp + data_parallel_size: 4 + + actor: + gradient_checkpointing: true + mb_spec: + max_tokens_per_mb: 32768 + optimizer: + type: adam + lr: 1e-6 # v2-v4 at 3e-6 degraded fast; Oolong has low headroom (~30%) and noisy reward, needs smaller updates + weight_decay: 0.0 + beta1: 0.9 + beta2: 0.95 + eps: 1e-8 + lr_scheduler_type: constant + gradient_clipping: 1.0 + # M2PO (same as TextCraft) + m2_threshold: 0.01 + eps_clip: 100.0 + eps_clip_higher: 100.0 + reward_scaling: 1 + reward_bias: 0 + kl_ctl: 0.00 + kl_penalty_coef: 0.001 + ppo_n_minibatches: 4 # bs=256 / 4 = 64 per minibatch (matches v20 ratio) + reward_norm: { mean_level: group, std_level: group } + adv_norm: { mean_level: batch, std_level: batch } + + ref: + path: "Qwen/Qwen3-4B-Instruct-2507" + mb_spec: + max_tokens_per_mb: 32768 + + recover: + mode: auto + freq_steps: 25 + + evaluator: + eval_at_start: false # skip v0 eval per [[eval-at-start-default-false]] + freq_steps: 20 + + stats_logger: + wandb: + mode: online + id_suffix: "uid" + +trainer_model0: + model_id: model0 + stats_logger: + wandb: + tags: ["oolong", "oolong-synth", "recursive-agent", "qwen3-4b", "m2po", "platoon-port"] diff --git a/examples/oolong/qwen3-4b-recursive/yaml/raas.yaml b/examples/oolong/qwen3-4b-recursive/yaml/raas.yaml new file mode 100644 index 0000000..396637d --- /dev/null +++ b/examples/oolong/qwen3-4b-recursive/yaml/raas.yaml @@ -0,0 +1,30 @@ +# ============================================================================ +# RaaS config — Inference serving instance (hardware/resources) +# Experiment: oolong / qwen3-4b-recursive +# +# Hardware: 4x GPU, TP=1; model0 DP=4 +# Merged with experiment.yaml at launch (--config experiment.yaml --config raas.yaml) +# ============================================================================ + +rollout: + max_concurrent_rollouts: 1024 + max_concurrent_evals: 64 + pause_grace_period: 3 + enable_adaptive_availability: true + target_waiting_queue_per_dp: 4 + adaptive_step_size: 4 + load_cache_ttl_ms: 100 + +engine: + model0: + backend: sglang + data_parallel_size: 4 + +sglang: + # 32K context: matches paper's OOLONG-REAL training context window. + # Initial Oolong tasks have context_len <= ~8K chars (~2K tokens) so + # plenty of headroom even with recursion + per-turn observation history. + context_length: 32768 + mem_fraction_static: 0.65 + max_running_requests: null + skip_tokenizer_init: true From bd5e94ed14750bf12ec87b18b020652980011771 Mon Sep 17 00:00:00 2001 From: Haizhong Date: Wed, 27 May 2026 13:54:10 -0400 Subject: [PATCH 14/35] feat: add TextCraft recursive-agent recipe variants (gen4k, lr5e6) Two sweep variants of qwen3-4b-recursive: - gen4k: per-turn max_new_tokens 1024 -> 4096 for longer agent thinking - lr5e6: lr 3e-6 -> 5e-6 (earlier exploration) Recipe-only additions, no library code changes. --- .../scripts/1_astraflow.sh | 36 ++++ .../scripts/2_raas.sh | 44 +++++ .../scripts/3_trainer_model0.sh | 47 +++++ .../scripts/run_qwen3-4b-recursive.sh | 116 ++++++++++++ .../yaml/experiment.yaml | 166 ++++++++++++++++++ .../qwen3-4b-recursive-gen4k/yaml/raas.yaml | 35 ++++ .../scripts/1_astraflow.sh | 36 ++++ .../scripts/2_raas.sh | 44 +++++ .../scripts/3_trainer_model0.sh | 47 +++++ .../scripts/run_qwen3-4b-recursive.sh | 116 ++++++++++++ .../yaml/experiment.yaml | 166 ++++++++++++++++++ .../qwen3-4b-recursive-lr5e6/yaml/raas.yaml | 35 ++++ 12 files changed, 888 insertions(+) create mode 100755 examples/textcraft/qwen3-4b-recursive-gen4k/scripts/1_astraflow.sh create mode 100755 examples/textcraft/qwen3-4b-recursive-gen4k/scripts/2_raas.sh create mode 100755 examples/textcraft/qwen3-4b-recursive-gen4k/scripts/3_trainer_model0.sh create mode 100755 examples/textcraft/qwen3-4b-recursive-gen4k/scripts/run_qwen3-4b-recursive.sh create mode 100644 examples/textcraft/qwen3-4b-recursive-gen4k/yaml/experiment.yaml create mode 100644 examples/textcraft/qwen3-4b-recursive-gen4k/yaml/raas.yaml create mode 100755 examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/1_astraflow.sh create mode 100755 examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/2_raas.sh create mode 100755 examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/3_trainer_model0.sh create mode 100755 examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/run_qwen3-4b-recursive.sh create mode 100644 examples/textcraft/qwen3-4b-recursive-lr5e6/yaml/experiment.yaml create mode 100644 examples/textcraft/qwen3-4b-recursive-lr5e6/yaml/raas.yaml diff --git a/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/1_astraflow.sh b/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/1_astraflow.sh new file mode 100755 index 0000000..cf7df94 --- /dev/null +++ b/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/1_astraflow.sh @@ -0,0 +1,36 @@ +#!/bin/bash +set -euo pipefail +# [1/3] Launch AstraFlow HTTP service +# +# Usage (terminal 1): +# bash examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh + +export CUDA_VISIBLE_DEVICES="" + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== AstraFlow HTTP Service ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "Port : ${ASTRAFLOW_PORT}" +echo "===============================" + +python3 -u -m astraflow \ + --config "${EXPERIMENT_CONFIG}" \ + --port "${ASTRAFLOW_PORT}" \ + --host "${ASTRAFLOW_HOST}" \ + 2>&1 | tee "${LOG_DIR}/astraflow.log" diff --git a/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/2_raas.sh b/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/2_raas.sh new file mode 100755 index 0000000..5d88b2b --- /dev/null +++ b/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/2_raas.sh @@ -0,0 +1,44 @@ +#!/bin/bash +set -euo pipefail +# [2/3] Launch RaaS inference server (SGLang + TCP receiver) +# +# Usage (terminal 2, after AstraFlow is ready): +# bash examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" +export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="${ASTRAFLOW_URL:-http://127.0.0.1:${ASTRAFLOW_PORT}}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== RaaS Inference Server (SGLang + TCP receiver) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "RaaS config : ${RAAS_CONFIG}" +echo "GPUs : ${CUDA_VISIBLE_DEVICES}" +echo "Port : ${RAAS_PORT}" +echo "AstraFlow URL : ${ASTRAFLOW_URL}" +echo "=======================================================" + +python3 -u -m astraflow.raas.server \ + --host "${RAAS_HOST}" \ + --port "${RAAS_PORT}" \ + --config "${EXPERIMENT_CONFIG}" \ + --config "${RAAS_CONFIG}" \ + --engine-id "${ENGINE_ID:-default}" \ + --astraflow-url "${ASTRAFLOW_URL}" \ + 2>&1 | tee "${LOG_DIR}/raas.log" diff --git a/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/3_trainer_model0.sh b/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/3_trainer_model0.sh new file mode 100755 index 0000000..cb8e850 --- /dev/null +++ b/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/3_trainer_model0.sh @@ -0,0 +1,47 @@ +#!/bin/bash +set -euo pipefail +# [3/3] Launch Trainer for model0 (TCP, sender_agent on local_rank 0) +# +# Usage (terminal 3, after AstraFlow and RaaS are ready): +# bash examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS:-4,5,6,7}" +TRAINER0_NPROC="$(echo "${CUDA_VISIBLE_DEVICES}" | awk -F',' '{print NF}')" + +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" +export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" + +# sender_agent (in trainer) listens on this HTTP port +export WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== Trainer model0 (TCP) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "GPUs : ${CUDA_VISIBLE_DEVICES} (FSDP dp${TRAINER0_NPROC})" +echo "AstraFlow : ${ASTRAFLOW_URL}" +echo "RaaS : ${ASTRAFLOW_RAAS_URL}" +echo "Sender HTTP : ${WEIGHT_TRANSFER_HTTP_PORT}" +echo "WANDB mode : ${WANDB_MODE:-online}" +echo "==========================================" + +torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ + --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ + examples/launch_trainer.py \ + --config "${EXPERIMENT_CONFIG}" \ + --trainer trainer_model0 \ + "$@" 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/run_qwen3-4b-recursive.sh b/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/run_qwen3-4b-recursive.sh new file mode 100755 index 0000000..ced8ff7 --- /dev/null +++ b/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/run_qwen3-4b-recursive.sh @@ -0,0 +1,116 @@ +#!/bin/bash +set -euo pipefail +# All-in-one launcher for AstraFlow training with the RECURSIVE-AGENT +# workflow on TextCraft (Qwen3-4B-Instruct-2507, M2PO, platoon port). +# +# Workflow: recursive_agent. Agent emits one {JSON} +# per turn (craft / get_info / view_inventory / spawn / finish). Spawn +# fans out up to 4 sub-agents in parallel via asyncio.gather, each +# inheriting the parent's inventory by reference. Tree-structured +# trajectory flattened to one trajectory with N sequences sharing the +# env-based team reward. +# +# TextCraft task data is synthesized locally on first run from the +# bundled Minecraft recipe DB (no HF download required). Files land at +# astraflow/core/workflow/impl/textcraft/textcraft_{train,val}.jsonl. +# +# Launches 3 processes: +# 1. AstraFlow HTTP service (CPU-only) +# 2. RaaS inference server (SGLang, SERVICE_CUDA_VISIBLE_DEVICES) +# 3. Trainer model0 (FSDP, TRAINER_MODEL0_GPUS) +# +# Usage: +# bash examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh + +# ============================================================================= +# Part 1: Load env and settings +# ============================================================================= +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +# Defined in examples/_common/utils.sh. +astraflow_load_experiment_env + +# ============================================================================= +# Part 2: Set up env +# ============================================================================= +# GPU assignments (default: 4 GPUs for inference, 4 for training) +export SERVICE_CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" +export TRAINER_MODEL0_GPUS="${TRAINER_MODEL0_GPUS:-4,5,6,7}" +# Ports / URLs (each component gets its own port) +export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" +export WEIGHT_TRANSFER_HTTP_PORT_MODEL0="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" + +TRAINER0_NPROC="$(echo "${TRAINER_MODEL0_GPUS}" | awk -F',' '{print NF}')" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. +# Defined in examples/_common/utils.sh. +astraflow_setup_env + +# ============================================================================= +# Part 3: Print info and clean up +# ============================================================================= +echo "=== AstraFlow (Qwen3-4B, TextCraft, M2PO, ctx32k, TCP, RECURSIVE AGENT) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "RaaS config : ${RAAS_CONFIG}" +echo "RaaS GPUs : ${SERVICE_CUDA_VISIBLE_DEVICES}" +echo "Trainer model0 GPUs : ${TRAINER_MODEL0_GPUS} (FSDP dp${TRAINER0_NPROC})" +echo "RaaS port : ${RAAS_PORT}" +echo "AstraFlow port : ${ASTRAFLOW_PORT}" +echo "Sender HTTP model0 : ${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" +echo "WANDB mode : ${WANDB_MODE:-online}" +echo "==========================================================" + +trap astraflow_cleanup_trap EXIT INT TERM + +# Kill leftover processes and shared memory from prior runs. +# Defined in examples/_common/utils.sh. +astraflow_kill_stale + +# ============================================================================= +# Part 4: Launch training +# ============================================================================= +echo "[1/3] Starting AstraFlow HTTP service..." +CUDA_VISIBLE_DEVICES="" \ + python3 -u -m astraflow \ + --config "${EXPERIMENT_CONFIG}" \ + --port "${ASTRAFLOW_PORT}" \ + --host "${ASTRAFLOW_HOST}" \ + 2>&1 | tee "${LOG_DIR}/astraflow.log" & +sleep 5 + +echo "[2/3] Starting RaaS inference server (SGLang + TCP receiver)..." +CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES}" \ + python3 -u -m astraflow.raas.server \ + --host "${RAAS_HOST}" \ + --port "${RAAS_PORT}" \ + --config "${EXPERIMENT_CONFIG}" \ + --config "${RAAS_CONFIG}" \ + --engine-id "${ENGINE_ID:-default}" \ + --astraflow-url "${ASTRAFLOW_URL}" \ + 2>&1 | tee "${LOG_DIR}/raas.log" & +sleep 15 + +export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" + +echo "[3/3] Starting trainer model0..." +CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS}" \ +WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" \ + torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ + --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ + examples/launch_trainer.py \ + --config "${EXPERIMENT_CONFIG}" \ + --trainer trainer_model0 \ + "$@" \ + 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/textcraft/qwen3-4b-recursive-gen4k/yaml/experiment.yaml b/examples/textcraft/qwen3-4b-recursive-gen4k/yaml/experiment.yaml new file mode 100644 index 0000000..2288f97 --- /dev/null +++ b/examples/textcraft/qwen3-4b-recursive-gen4k/yaml/experiment.yaml @@ -0,0 +1,166 @@ +# ============================================================================ +# Experiment config — AstraFlow service + Trainer (RECURSIVE AGENT on TextCraft) +# Experiment: textcraft / qwen3-4b-recursive +# +# Recursive agent reproduction of platoon's design (see +# claude-doc/recursive-agent-textcraft-plan.md): +# - workflow_cls: recursive_agent +# - TextCraft stateful env (in-process inventory dict + recipe DB) +# - Up to 4 sub-agents per spawn, depth <= 3 +# - Team reward (env.evaluate()) broadcast across the trajectory tree +# +# Model + dataset + hyperparams match platoon where compatible: +# - Qwen3-4B-Instruct-2507 (no thinking) +# - TextCraft 1000 train / 100 val tasks (synthesized locally from +# bundled Minecraft recipes; no HF download needed) +# - LR 3e-5, β (0.9, 0.95), batch 32, group_size 8, max_steps 50 +# +# Trainer is M2PO + full-FT + SGLang+AstraFlow (substrate differences +# from platoon: CISPO + LoRA + Tinker). See docs page for details. +# +# GPU layout (default, 8 GPUs): +# SERVICE_CUDA_VISIBLE_DEVICES=0,1,2,3 -> RaaS (model0 dp=4) +# TRAINER_MODEL0_GPUS=4,5,6,7 -> Trainer model0 (FSDP, 4 GPUs) +# ============================================================================ + +experiment: + experiment_name: astraflow-textcraft + trial_name: qwen3-4b-recursive-gen4k + fileroot: ./data-experiments/${experiment.experiment_name}/${experiment.trial_name} + + model_path: "Qwen/Qwen3-4B-Instruct-2507" # = platoon + tokenizer_path: "Qwen/Qwen3-4B-Instruct-2507" # = platoon + seed: 1 + dtype: bfloat16 + weight_transfer_mode: tcp + weight_transfer_strategies: full + +raas: + models: + model0: + backend: sglang + gconfig: + n_samples: 8 # = platoon group_size (train) + temperature: 1.0 + max_new_tokens: 4096 # per-turn budget for the recursive agent (4k variant) + min_new_tokens: 0 + +dataflow: + host: "0.0.0.0" + port: 8000 + + # Rollout dump dir for recursive-agent sanity checking. The dataflow + # loader substitutes ${experiment.*} placeholders and propagates this + # into workflow_spec.dump_dir. + dump_dir: "./data-experiments/${experiment.experiment_name}/${experiment.trial_name}/rollout_dumps" + + buffer: + size: 10000 + replay_size: 10000 + replay_ratio: 0 + max_staleness: 8 # = platoon max_staleness + filter_function: filter_zero_adv + + rollout_dataset: + dataset_fn: "astraflow.dataflow.dataset.textcraft:get_textcraft_rl_dataset" + num_tasks: 1000 # = platoon + num_val: 100 + seed: 42 + + workflow_spec: + workflow_cls: "recursive_agent" + reward_fn: "textcraft_success" # stub; recursive_agent uses env.evaluate() + enable_thinking: false # = platoon + max_depth: 3 # AstraFlow safety cap (platoon: unbounded) + max_breadth: 4 # AstraFlow safety cap (platoon: unbounded) + max_steps_per_episode: 50 # = platoon max_steps + max_concurrent_subagents: 8 # bounds K^N RaaS queue blowup + delegation_reward_cap: 0.0 # = platoon _TEXTCRAFT_DELEGATION_REWARD_CAP + depth_level_weighting: false # disabled: was applying 1/(depth+1) to raw reward, which gives sub-agents backwards credit. Platoon applies a different (mass-preserving inverse-traj-count) formula on advantages, not raw rewards — porting that properly is a separate change. + # Sampling rate for rollout dumps. 1.0 for v1 validation; for + # multi-hundred-step runs we lower to keep disk usage bounded. + dump_prob: 0.02 + + eval_workflows: + textcraft_eval: + workflow_cls: "recursive_agent" + reward_fn: "textcraft_success" + enable_thinking: false + max_depth: 3 + max_breadth: 4 + max_steps_per_episode: 50 + delegation_reward_cap: 0.0 + depth_level_weighting: false # eval doesn't need weighting + dump_prob: 0.05 + gconfig_overrides: + n_samples: 1 # = platoon eval group_size + # Stochastic eval with moderate temperature, like our math + # recipes. Adds some per-task noise (≈2% floor on a 100-task + # set) but gives a softer view of capability than greedy. + temperature: 0.6 + + eval_datasets: + textcraft_val: + dataset_fn: "astraflow.dataflow.dataset.textcraft:get_textcraft_eval_dataset" + num_val: 100 # = platoon + num_train: 1000 + seed: 42 + repeat: 1 + eval_workflow: textcraft_eval + +trainer_base: + total_train_steps: 1000 # extended from 100 to continue v20 + train_batch_size: 512 # = platoon batch_size + n_samples: 8 + engine: + backend: fsdp + data_parallel_size: 4 + + actor: + gradient_checkpointing: true + mb_spec: + max_tokens_per_mb: 32768 # match raas.context_length=32768; recursive agent rollouts can be ~20k+ tokens + optimizer: + type: adam + lr: 3e-6 # = platoon + weight_decay: 0.0 + beta1: 0.9 # = platoon + beta2: 0.95 # = platoon + eps: 1e-8 + lr_scheduler_type: constant + gradient_clipping: 1.0 # standard PPO grad clip. v16 saw grad_norm spikes up to 18.6 destabilizing policy. (DO NOT SET TO 0 — that clips ALL grads to ZERO so the optimizer step never moves the weights.) + # M2PO (ours; platoon uses CISPO) + m2_threshold: 0.01 + eps_clip: 100.0 + eps_clip_higher: 100.0 + reward_scaling: 1 + reward_bias: 0 + kl_ctl: 0.00 + kl_penalty_coef: 0.001 # platoon default + ppo_n_minibatches: 4 # = platoon num_minibatches + reward_norm: { mean_level: group, std_level: group } + adv_norm: { mean_level: batch, std_level: batch } + + ref: + path: "Qwen/Qwen3-4B-Instruct-2507" # explicit so KL(actor||ref) is computed against frozen base + mb_spec: + max_tokens_per_mb: 32768 # match raas.context_length=32768; recursive agent rollouts can be ~20k+ tokens + + recover: + mode: auto + freq_steps: 25 # = platoon checkpoint every: 5 + + evaluator: + eval_at_start: true # baseline at v0 + freq_steps: 20 # = platoon eval every: 20 + + stats_logger: + wandb: + mode: online + id_suffix: "uid" + +trainer_model0: + model_id: model0 + stats_logger: + wandb: + tags: ["textcraft", "recursive-agent", "qwen3-4b", "m2po", "platoon-port"] diff --git a/examples/textcraft/qwen3-4b-recursive-gen4k/yaml/raas.yaml b/examples/textcraft/qwen3-4b-recursive-gen4k/yaml/raas.yaml new file mode 100644 index 0000000..93693ef --- /dev/null +++ b/examples/textcraft/qwen3-4b-recursive-gen4k/yaml/raas.yaml @@ -0,0 +1,35 @@ +# ============================================================================ +# RaaS config — Inference serving instance (hardware/resources) +# Experiment: textcraft / qwen3-4b-recursive +# +# Hardware: 4x GPU, TP=1 +# model0: DP=4, TP=1 +# +# Merged with experiment.yaml at launch (--config experiment.yaml --config raas.yaml) +# experiment.yaml provides: model_path, tokenizer_path, seed, dtype, models/gconfig +# ============================================================================ + +rollout: + # n_samples=8 × train_batch_size=32 × MAX_BREADTH=4 worst-case branching + # could exceed the math recipe's 1024 cap during deep spawns. + max_concurrent_rollouts: 2048 + max_concurrent_evals: 64 + pause_grace_period: 3 + enable_adaptive_availability: true + target_waiting_queue_per_dp: 4 + adaptive_step_size: 4 + load_cache_ttl_ms: 100 + +engine: + model0: + backend: sglang + data_parallel_size: 4 + +sglang: + # 32k context: recursion + per-turn observation history accumulate. + # Each turn appends action + observation to chat history, which can + # reach a few thousand tokens per agent over a 50-step episode. + context_length: 32768 + mem_fraction_static: 0.8 + max_running_requests: null + skip_tokenizer_init: true diff --git a/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/1_astraflow.sh b/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/1_astraflow.sh new file mode 100755 index 0000000..cf7df94 --- /dev/null +++ b/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/1_astraflow.sh @@ -0,0 +1,36 @@ +#!/bin/bash +set -euo pipefail +# [1/3] Launch AstraFlow HTTP service +# +# Usage (terminal 1): +# bash examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh + +export CUDA_VISIBLE_DEVICES="" + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== AstraFlow HTTP Service ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "Port : ${ASTRAFLOW_PORT}" +echo "===============================" + +python3 -u -m astraflow \ + --config "${EXPERIMENT_CONFIG}" \ + --port "${ASTRAFLOW_PORT}" \ + --host "${ASTRAFLOW_HOST}" \ + 2>&1 | tee "${LOG_DIR}/astraflow.log" diff --git a/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/2_raas.sh b/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/2_raas.sh new file mode 100755 index 0000000..5d88b2b --- /dev/null +++ b/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/2_raas.sh @@ -0,0 +1,44 @@ +#!/bin/bash +set -euo pipefail +# [2/3] Launch RaaS inference server (SGLang + TCP receiver) +# +# Usage (terminal 2, after AstraFlow is ready): +# bash examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" +export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="${ASTRAFLOW_URL:-http://127.0.0.1:${ASTRAFLOW_PORT}}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== RaaS Inference Server (SGLang + TCP receiver) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "RaaS config : ${RAAS_CONFIG}" +echo "GPUs : ${CUDA_VISIBLE_DEVICES}" +echo "Port : ${RAAS_PORT}" +echo "AstraFlow URL : ${ASTRAFLOW_URL}" +echo "=======================================================" + +python3 -u -m astraflow.raas.server \ + --host "${RAAS_HOST}" \ + --port "${RAAS_PORT}" \ + --config "${EXPERIMENT_CONFIG}" \ + --config "${RAAS_CONFIG}" \ + --engine-id "${ENGINE_ID:-default}" \ + --astraflow-url "${ASTRAFLOW_URL}" \ + 2>&1 | tee "${LOG_DIR}/raas.log" diff --git a/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/3_trainer_model0.sh b/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/3_trainer_model0.sh new file mode 100755 index 0000000..cb8e850 --- /dev/null +++ b/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/3_trainer_model0.sh @@ -0,0 +1,47 @@ +#!/bin/bash +set -euo pipefail +# [3/3] Launch Trainer for model0 (TCP, sender_agent on local_rank 0) +# +# Usage (terminal 3, after AstraFlow and RaaS are ready): +# bash examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS:-4,5,6,7}" +TRAINER0_NPROC="$(echo "${CUDA_VISIBLE_DEVICES}" | awk -F',' '{print NF}')" + +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" +export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" + +# sender_agent (in trainer) listens on this HTTP port +export WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== Trainer model0 (TCP) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "GPUs : ${CUDA_VISIBLE_DEVICES} (FSDP dp${TRAINER0_NPROC})" +echo "AstraFlow : ${ASTRAFLOW_URL}" +echo "RaaS : ${ASTRAFLOW_RAAS_URL}" +echo "Sender HTTP : ${WEIGHT_TRANSFER_HTTP_PORT}" +echo "WANDB mode : ${WANDB_MODE:-online}" +echo "==========================================" + +torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ + --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ + examples/launch_trainer.py \ + --config "${EXPERIMENT_CONFIG}" \ + --trainer trainer_model0 \ + "$@" 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/run_qwen3-4b-recursive.sh b/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/run_qwen3-4b-recursive.sh new file mode 100755 index 0000000..ced8ff7 --- /dev/null +++ b/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/run_qwen3-4b-recursive.sh @@ -0,0 +1,116 @@ +#!/bin/bash +set -euo pipefail +# All-in-one launcher for AstraFlow training with the RECURSIVE-AGENT +# workflow on TextCraft (Qwen3-4B-Instruct-2507, M2PO, platoon port). +# +# Workflow: recursive_agent. Agent emits one {JSON} +# per turn (craft / get_info / view_inventory / spawn / finish). Spawn +# fans out up to 4 sub-agents in parallel via asyncio.gather, each +# inheriting the parent's inventory by reference. Tree-structured +# trajectory flattened to one trajectory with N sequences sharing the +# env-based team reward. +# +# TextCraft task data is synthesized locally on first run from the +# bundled Minecraft recipe DB (no HF download required). Files land at +# astraflow/core/workflow/impl/textcraft/textcraft_{train,val}.jsonl. +# +# Launches 3 processes: +# 1. AstraFlow HTTP service (CPU-only) +# 2. RaaS inference server (SGLang, SERVICE_CUDA_VISIBLE_DEVICES) +# 3. Trainer model0 (FSDP, TRAINER_MODEL0_GPUS) +# +# Usage: +# bash examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh + +# ============================================================================= +# Part 1: Load env and settings +# ============================================================================= +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +# Defined in examples/_common/utils.sh. +astraflow_load_experiment_env + +# ============================================================================= +# Part 2: Set up env +# ============================================================================= +# GPU assignments (default: 4 GPUs for inference, 4 for training) +export SERVICE_CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" +export TRAINER_MODEL0_GPUS="${TRAINER_MODEL0_GPUS:-4,5,6,7}" +# Ports / URLs (each component gets its own port) +export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" +export WEIGHT_TRANSFER_HTTP_PORT_MODEL0="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" + +TRAINER0_NPROC="$(echo "${TRAINER_MODEL0_GPUS}" | awk -F',' '{print NF}')" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. +# Defined in examples/_common/utils.sh. +astraflow_setup_env + +# ============================================================================= +# Part 3: Print info and clean up +# ============================================================================= +echo "=== AstraFlow (Qwen3-4B, TextCraft, M2PO, ctx32k, TCP, RECURSIVE AGENT) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "RaaS config : ${RAAS_CONFIG}" +echo "RaaS GPUs : ${SERVICE_CUDA_VISIBLE_DEVICES}" +echo "Trainer model0 GPUs : ${TRAINER_MODEL0_GPUS} (FSDP dp${TRAINER0_NPROC})" +echo "RaaS port : ${RAAS_PORT}" +echo "AstraFlow port : ${ASTRAFLOW_PORT}" +echo "Sender HTTP model0 : ${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" +echo "WANDB mode : ${WANDB_MODE:-online}" +echo "==========================================================" + +trap astraflow_cleanup_trap EXIT INT TERM + +# Kill leftover processes and shared memory from prior runs. +# Defined in examples/_common/utils.sh. +astraflow_kill_stale + +# ============================================================================= +# Part 4: Launch training +# ============================================================================= +echo "[1/3] Starting AstraFlow HTTP service..." +CUDA_VISIBLE_DEVICES="" \ + python3 -u -m astraflow \ + --config "${EXPERIMENT_CONFIG}" \ + --port "${ASTRAFLOW_PORT}" \ + --host "${ASTRAFLOW_HOST}" \ + 2>&1 | tee "${LOG_DIR}/astraflow.log" & +sleep 5 + +echo "[2/3] Starting RaaS inference server (SGLang + TCP receiver)..." +CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES}" \ + python3 -u -m astraflow.raas.server \ + --host "${RAAS_HOST}" \ + --port "${RAAS_PORT}" \ + --config "${EXPERIMENT_CONFIG}" \ + --config "${RAAS_CONFIG}" \ + --engine-id "${ENGINE_ID:-default}" \ + --astraflow-url "${ASTRAFLOW_URL}" \ + 2>&1 | tee "${LOG_DIR}/raas.log" & +sleep 15 + +export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" + +echo "[3/3] Starting trainer model0..." +CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS}" \ +WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" \ + torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ + --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ + examples/launch_trainer.py \ + --config "${EXPERIMENT_CONFIG}" \ + --trainer trainer_model0 \ + "$@" \ + 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/textcraft/qwen3-4b-recursive-lr5e6/yaml/experiment.yaml b/examples/textcraft/qwen3-4b-recursive-lr5e6/yaml/experiment.yaml new file mode 100644 index 0000000..d11bbf0 --- /dev/null +++ b/examples/textcraft/qwen3-4b-recursive-lr5e6/yaml/experiment.yaml @@ -0,0 +1,166 @@ +# ============================================================================ +# Experiment config — AstraFlow service + Trainer (RECURSIVE AGENT on TextCraft) +# Experiment: textcraft / qwen3-4b-recursive +# +# Recursive agent reproduction of platoon's design (see +# claude-doc/recursive-agent-textcraft-plan.md): +# - workflow_cls: recursive_agent +# - TextCraft stateful env (in-process inventory dict + recipe DB) +# - Up to 4 sub-agents per spawn, depth <= 3 +# - Team reward (env.evaluate()) broadcast across the trajectory tree +# +# Model + dataset + hyperparams match platoon where compatible: +# - Qwen3-4B-Instruct-2507 (no thinking) +# - TextCraft 1000 train / 100 val tasks (synthesized locally from +# bundled Minecraft recipes; no HF download needed) +# - LR 3e-5, β (0.9, 0.95), batch 32, group_size 8, max_steps 50 +# +# Trainer is M2PO + full-FT + SGLang+AstraFlow (substrate differences +# from platoon: CISPO + LoRA + Tinker). See docs page for details. +# +# GPU layout (default, 8 GPUs): +# SERVICE_CUDA_VISIBLE_DEVICES=0,1,2,3 -> RaaS (model0 dp=4) +# TRAINER_MODEL0_GPUS=4,5,6,7 -> Trainer model0 (FSDP, 4 GPUs) +# ============================================================================ + +experiment: + experiment_name: astraflow-textcraft + trial_name: qwen3-4b-recursive-lr5e6 + fileroot: ./data-experiments/${experiment.experiment_name}/${experiment.trial_name} + + model_path: "Qwen/Qwen3-4B-Instruct-2507" # = platoon + tokenizer_path: "Qwen/Qwen3-4B-Instruct-2507" # = platoon + seed: 1 + dtype: bfloat16 + weight_transfer_mode: tcp + weight_transfer_strategies: full + +raas: + models: + model0: + backend: sglang + gconfig: + n_samples: 8 # = platoon group_size (train) + temperature: 1.0 + max_new_tokens: 1024 # per-turn budget for the recursive agent + min_new_tokens: 0 + +dataflow: + host: "0.0.0.0" + port: 8000 + + # Rollout dump dir for recursive-agent sanity checking. The dataflow + # loader substitutes ${experiment.*} placeholders and propagates this + # into workflow_spec.dump_dir. + dump_dir: "./data-experiments/${experiment.experiment_name}/${experiment.trial_name}/rollout_dumps" + + buffer: + size: 10000 + replay_size: 10000 + replay_ratio: 0 + max_staleness: 8 # = platoon max_staleness + filter_function: filter_zero_adv + + rollout_dataset: + dataset_fn: "astraflow.dataflow.dataset.textcraft:get_textcraft_rl_dataset" + num_tasks: 1000 # = platoon + num_val: 100 + seed: 42 + + workflow_spec: + workflow_cls: "recursive_agent" + reward_fn: "textcraft_success" # stub; recursive_agent uses env.evaluate() + enable_thinking: false # = platoon + max_depth: 3 # AstraFlow safety cap (platoon: unbounded) + max_breadth: 4 # AstraFlow safety cap (platoon: unbounded) + max_steps_per_episode: 50 # = platoon max_steps + max_concurrent_subagents: 8 # bounds K^N RaaS queue blowup + delegation_reward_cap: 0.0 # = platoon _TEXTCRAFT_DELEGATION_REWARD_CAP + depth_level_weighting: false # disabled: was applying 1/(depth+1) to raw reward, which gives sub-agents backwards credit. Platoon applies a different (mass-preserving inverse-traj-count) formula on advantages, not raw rewards — porting that properly is a separate change. + # Sampling rate for rollout dumps. 1.0 for v1 validation; for + # multi-hundred-step runs we lower to keep disk usage bounded. + dump_prob: 0.02 + + eval_workflows: + textcraft_eval: + workflow_cls: "recursive_agent" + reward_fn: "textcraft_success" + enable_thinking: false + max_depth: 3 + max_breadth: 4 + max_steps_per_episode: 50 + delegation_reward_cap: 0.0 + depth_level_weighting: false # eval doesn't need weighting + dump_prob: 0.05 + gconfig_overrides: + n_samples: 1 # = platoon eval group_size + # Stochastic eval with moderate temperature, like our math + # recipes. Adds some per-task noise (≈2% floor on a 100-task + # set) but gives a softer view of capability than greedy. + temperature: 0.6 + + eval_datasets: + textcraft_val: + dataset_fn: "astraflow.dataflow.dataset.textcraft:get_textcraft_eval_dataset" + num_val: 100 # = platoon + num_train: 1000 + seed: 42 + repeat: 1 + eval_workflow: textcraft_eval + +trainer_base: + total_train_steps: 1000 # extended from 100 to continue v20 + train_batch_size: 512 # = platoon batch_size + n_samples: 8 + engine: + backend: fsdp + data_parallel_size: 4 + + actor: + gradient_checkpointing: true + mb_spec: + max_tokens_per_mb: 32768 # match raas.context_length=32768; recursive agent rollouts can be ~20k+ tokens + optimizer: + type: adam + lr: 5e-6 # variant: bumped from 3e-6 for parallel comparison on flame-28 + weight_decay: 0.0 + beta1: 0.9 # = platoon + beta2: 0.95 # = platoon + eps: 1e-8 + lr_scheduler_type: constant + gradient_clipping: 1.0 # standard PPO grad clip. v16 saw grad_norm spikes up to 18.6 destabilizing policy. (DO NOT SET TO 0 — that clips ALL grads to ZERO so the optimizer step never moves the weights.) + # M2PO (ours; platoon uses CISPO) + m2_threshold: 0.01 + eps_clip: 100.0 + eps_clip_higher: 100.0 + reward_scaling: 1 + reward_bias: 0 + kl_ctl: 0.00 + kl_penalty_coef: 0.001 # platoon default + ppo_n_minibatches: 4 # = platoon num_minibatches + reward_norm: { mean_level: group, std_level: group } + adv_norm: { mean_level: batch, std_level: batch } + + ref: + path: "Qwen/Qwen3-4B-Instruct-2507" # explicit so KL(actor||ref) is computed against frozen base + mb_spec: + max_tokens_per_mb: 32768 # match raas.context_length=32768; recursive agent rollouts can be ~20k+ tokens + + recover: + mode: auto + freq_steps: 25 # = platoon checkpoint every: 5 + + evaluator: + eval_at_start: true # baseline at v0 + freq_steps: 20 # = platoon eval every: 20 + + stats_logger: + wandb: + mode: online + id_suffix: "uid" + +trainer_model0: + model_id: model0 + stats_logger: + wandb: + tags: ["textcraft", "recursive-agent", "qwen3-4b", "m2po", "platoon-port"] diff --git a/examples/textcraft/qwen3-4b-recursive-lr5e6/yaml/raas.yaml b/examples/textcraft/qwen3-4b-recursive-lr5e6/yaml/raas.yaml new file mode 100644 index 0000000..93693ef --- /dev/null +++ b/examples/textcraft/qwen3-4b-recursive-lr5e6/yaml/raas.yaml @@ -0,0 +1,35 @@ +# ============================================================================ +# RaaS config — Inference serving instance (hardware/resources) +# Experiment: textcraft / qwen3-4b-recursive +# +# Hardware: 4x GPU, TP=1 +# model0: DP=4, TP=1 +# +# Merged with experiment.yaml at launch (--config experiment.yaml --config raas.yaml) +# experiment.yaml provides: model_path, tokenizer_path, seed, dtype, models/gconfig +# ============================================================================ + +rollout: + # n_samples=8 × train_batch_size=32 × MAX_BREADTH=4 worst-case branching + # could exceed the math recipe's 1024 cap during deep spawns. + max_concurrent_rollouts: 2048 + max_concurrent_evals: 64 + pause_grace_period: 3 + enable_adaptive_availability: true + target_waiting_queue_per_dp: 4 + adaptive_step_size: 4 + load_cache_ttl_ms: 100 + +engine: + model0: + backend: sglang + data_parallel_size: 4 + +sglang: + # 32k context: recursion + per-turn observation history accumulate. + # Each turn appends action + observation to chat history, which can + # reach a few thousand tokens per agent over a 50-step episode. + context_length: 32768 + mem_fraction_static: 0.8 + max_running_requests: null + skip_tokenizer_init: true From adbb4fb57d737acfa8de2e03d8366d9c2ff55b73 Mon Sep 17 00:00:00 2001 From: Haizhong Date: Wed, 27 May 2026 14:39:28 -0400 Subject: [PATCH 15/35] feat: add minimal LLM-as-judge library at astraEnv/judge.py Two public functions: - judge(system, user, ...) -> str: posts a (system, user) pair to Fireworks and returns the raw assistant content. Retries on 429/5xx with exponential backoff (3 attempts). Falls back to reasoning_content when content is empty (handles gpt-oss-120b's reasoning-model quirk). - extract_json(text) -> dict: parses JSON out of an LLM response, tolerating ```json``` and plain ``` fence wrapping. Default model: accounts/fireworks/models/gpt-oss-120b (2s/call avg, vs 4s for deepseek-v4-pro and 8s for kimi-k2p6 on the same Fireworks account). max_tokens default 2048 to give reasoning models enough headroom. Each caller writes its own system prompt and parses what it expects -- no central rubric registry, no JudgeRewardEnv mixin, no caching, no budget gate. Matches platoon's pattern. Includes: - test_judge.py: 7 unit tests for extract_json + API-key guard, plus one live end-to-end test skipped without FIREWORKS_API_KEY. - judge_example.py: runnable script with 9 calibration cases, prints full input/output for each, supports --user / --system / --model flags for custom cases. See claude-doc/minimal-llm-judge-plan.md for design rationale. --- astraEnv/judge.py | 151 ++++++++++++++++++++++++++++ astraEnv/judge_example.py | 203 ++++++++++++++++++++++++++++++++++++++ astraEnv/test_judge.py | 88 +++++++++++++++++ 3 files changed, 442 insertions(+) create mode 100644 astraEnv/judge.py create mode 100644 astraEnv/judge_example.py create mode 100644 astraEnv/test_judge.py diff --git a/astraEnv/judge.py b/astraEnv/judge.py new file mode 100644 index 0000000..4e94888 --- /dev/null +++ b/astraEnv/judge.py @@ -0,0 +1,151 @@ +"""Minimal LLM-as-a-judge utility. + +Two functions. Both stateless. + +- `judge(system, user, ...)` posts a (system, user) pair to Fireworks and + returns the raw assistant content string. +- `extract_json(text)` parses JSON out of an LLM response, tolerating + common code-fence wrapping. + +Callers write their own rubric prompts and parse what they expect. +See claude-doc/minimal-llm-judge-plan.md for the design rationale. + +Usage: + from astraEnv.judge import judge, extract_json + + response = await judge( + system='You grade outputs. Return JSON {"score", "reason"}.', + user=f"Goal: {goal}\\n\\nOutput: {output}", + ) + parsed = extract_json(response) + score = float(parsed["score"]) + +Requires the env var `FIREWORKS_API_KEY`. +""" + +from __future__ import annotations + +import asyncio +import json +import os +import re +from typing import Any + +import httpx + +_API_URL = "https://api.fireworks.ai/inference/v1/chat/completions" +_DEFAULT_MODEL = "accounts/fireworks/models/gpt-oss-120b" +_RETRY_STATUSES = {429, 500, 502, 503, 504} +_MAX_ATTEMPTS = 3 + + +class JudgeError(RuntimeError): + """Raised when the judge call cannot return a usable response.""" + + +async def judge( + system: str, + user: str, + *, + model: str = _DEFAULT_MODEL, + temperature: float = 0.0, + max_tokens: int = 2048, + timeout_s: float = 60.0, +) -> str: + """Send (system, user) to Fireworks; return the raw assistant content. + + Retries up to 3 times with exponential backoff on transient failures + (429, 5xx, network errors). Raises JudgeError on persistent failure. + + Default `max_tokens` is set generously (2048) because reasoning models + like gpt-oss-120b consume tokens for internal chain-of-thought before + emitting the final answer; too-tight budgets truncate before content. + + For reasoning models that put their chain-of-thought into a separate + `reasoning_content` field, this function returns `content` if non-empty, + otherwise falls back to `reasoning_content`. extract_json() handles + both shapes. + """ + api_key = os.environ.get("FIREWORKS_API_KEY") + if not api_key: + raise JudgeError("FIREWORKS_API_KEY environment variable is not set") + + payload = { + "model": model, + "temperature": temperature, + "max_tokens": max_tokens, + "messages": [ + {"role": "system", "content": system}, + {"role": "user", "content": user}, + ], + } + headers = {"Authorization": f"Bearer {api_key}"} + + last_err: Exception | None = None + async with httpx.AsyncClient(timeout=timeout_s) as client: + for attempt in range(_MAX_ATTEMPTS): + try: + resp = await client.post(_API_URL, json=payload, headers=headers) + except httpx.RequestError as exc: + last_err = exc + await asyncio.sleep(2**attempt) + continue + + if resp.status_code == 200: + try: + message = resp.json()["choices"][0]["message"] + except (KeyError, IndexError, ValueError) as exc: + raise JudgeError( + f"Unexpected response shape: {resp.text[:500]}" + ) from exc + # Prefer the canonical `content` field. Reasoning models + # (e.g. gpt-oss-120b) may emit only `reasoning_content` + # when truncated; fall back to that so extract_json can + # still find a JSON snippet inside the chain-of-thought. + content = message.get("content") or message.get("reasoning_content") + if not content: + raise JudgeError( + f"Empty assistant content: {resp.text[:500]}" + ) + return content + + if resp.status_code in _RETRY_STATUSES: + last_err = JudgeError( + f"Fireworks returned {resp.status_code}: {resp.text[:200]}" + ) + await asyncio.sleep(2**attempt) + continue + + raise JudgeError( + f"Fireworks returned {resp.status_code}: {resp.text[:500]}" + ) + + raise JudgeError( + f"judge() failed after {_MAX_ATTEMPTS} attempts: {last_err}" + ) from last_err + + +def extract_json(text: str) -> dict[str, Any]: + """Parse JSON out of an LLM response, tolerating common fence wrapping. + + Strategy (first success wins): + 1. json.loads on the trimmed text + 2. strip ```json ... ``` fences and retry + 3. strip plain ``` ... ``` fences and retry + 4. re-raise the original JSONDecodeError + """ + text = text.strip() + try: + return json.loads(text) + except json.JSONDecodeError: + pass + + fenced = re.search(r"```json\s*(.*?)\s*```", text, re.DOTALL | re.IGNORECASE) + if fenced: + return json.loads(fenced.group(1).strip()) + + fenced = re.search(r"```\s*(.*?)\s*```", text, re.DOTALL) + if fenced: + return json.loads(fenced.group(1).strip()) + + return json.loads(text) diff --git a/astraEnv/judge_example.py b/astraEnv/judge_example.py new file mode 100644 index 0000000..8e32fda --- /dev/null +++ b/astraEnv/judge_example.py @@ -0,0 +1,203 @@ +"""Runnable example for astraEnv.judge. + +Run with: + # source your Fireworks key first + set -a && source ~/.fireworks_key && set +a + + python astraEnv/judge_example.py + +To try your own cases, edit the CASES list below or pass arbitrary +(system, user) text via --system / --user flags. +""" + +from __future__ import annotations + +import argparse +import asyncio +import sys + +from astraEnv.judge import extract_json, judge + +# ---------------------------------------------------------------------- +# Default rubric — a generic "did the output satisfy the goal" grader. +# Replace with whatever fits your task. +# ---------------------------------------------------------------------- + +DEFAULT_SYSTEM = """You grade a sub-agent's output against its delegated goal. +Return ONLY JSON in this exact format: +{"score": float in [0, 1], "reason": ""} + +Scoring guide: + 1.0 = output fully and correctly satisfies the goal + 0.5 = output partially correct or partially complete + 0.0 = output is wrong, empty, or a refusal + +Do not include any other text — JSON only.""" + + +# ---------------------------------------------------------------------- +# Example cases — (goal, output, what you expect) +# Add your own here. +# ---------------------------------------------------------------------- + +CASES: list[tuple[str, str, str]] = [ + # math + ("Compute the sum of [3, 7, 12].", "22", "high"), + ("Compute the sum of [3, 7, 12].", "21", "low (off by one)"), + ("Compute the sum of [3, 7, 12].", "I am not sure.", "low (refusal)"), + # listing + ("List the first 3 prime numbers.", "[2, 3, 5]", "high"), + ("List the first 3 prime numbers.", "[1, 2, 3]", "low (1 is not prime)"), + # translation + ('Translate "hello" to French.', "bonjour", "high"), + ('Translate "hello" to French.', "hola", "low (Spanish, not French)"), + # extraction + ( + "Extract all dates from: 'meeting on 2024-03-15, follow-up 2024-04-02'.", + '["2024-03-15", "2024-04-02"]', + "high", + ), + ( + "Extract all dates from: 'meeting on 2024-03-15, follow-up 2024-04-02'.", + "There are no dates.", + "low", + ), +] + + +# ---------------------------------------------------------------------- +# Runner +# ---------------------------------------------------------------------- + + +async def grade_one( + system: str, goal: str, output: str +) -> tuple[str, str, float, str]: + """Return (user_message, raw_response, score, reason).""" + user = f"GOAL: {goal}\n\nOUTPUT: {output}" + response = await judge(system=system, user=user) + parsed = extract_json(response) + return user, response, float(parsed["score"]), str(parsed.get("reason", "")).strip() + + +def _hr(char: str = "─", n: int = 80) -> str: + return char * n + + +async def run_batch(system: str, cases: list[tuple[str, str, str]]) -> None: + # Print the system prompt once at the top — it's the same for every case. + print(_hr("═")) + print("SYSTEM PROMPT (sent with every case)") + print(_hr("═")) + print(system) + print() + + # Fire all grades in parallel. + tasks = [grade_one(system, goal, output) for goal, output, _ in cases] + results = await asyncio.gather(*tasks, return_exceptions=True) + + # Per-case detail: user message + raw response + parsed. + for i, ((goal, output, expected), result) in enumerate(zip(cases, results), 1): + print(_hr("═")) + print(f"CASE {i}/{len(cases)} (expected: {expected})") + print(_hr("═")) + print("[USER MESSAGE]") + print(f"GOAL: {goal}") + print() + print(f"OUTPUT: {output}") + print() + + if isinstance(result, Exception): + print(f"[FAIL] {type(result).__name__}: {result}") + print() + continue + + user_msg, raw, score, reason = result + print("[RAW MODEL RESPONSE]") + print(raw) + print() + print("[PARSED]") + print(f" score: {score:.2f}") + print(f" reason: {reason}") + print() + + # Compact summary table at the end. + print(_hr("═")) + print("SUMMARY") + print(_hr("═")) + print(f'{"score":>5} {"output":40} {"expected":35}') + print(_hr("-")) + for (goal, output, expected), result in zip(cases, results): + if isinstance(result, Exception): + print(f" FAIL {output[:40]:40} {expected[:35]:35}") + continue + _, _, score, _ = result + print(f"{score:5.2f} {output[:40]:40} {expected[:35]:35}") + + +async def run_single(system: str, user: str) -> None: + print(_hr("═")) + print("[SYSTEM MESSAGE]") + print(_hr("═")) + print(system) + print() + print(_hr("═")) + print("[USER MESSAGE]") + print(_hr("═")) + print(user) + print() + response = await judge(system=system, user=user) + print(_hr("═")) + print("[RAW MODEL RESPONSE]") + print(_hr("═")) + print(response) + print() + try: + parsed = extract_json(response) + print(_hr("═")) + print("[PARSED JSON]") + print(_hr("═")) + for k, v in parsed.items(): + print(f" {k}: {v}") + except Exception as e: + print(f"=== Could not parse JSON: {e} ===") + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--system", + help="Custom system prompt. If omitted, uses the built-in default rubric.", + ) + parser.add_argument( + "--user", + help="Custom user prompt. If given, runs a single grade instead of the batch.", + ) + parser.add_argument( + "--model", + default=None, + help="Override model (e.g. accounts/fireworks/models/deepseek-v4-pro).", + ) + args = parser.parse_args() + + system = args.system or DEFAULT_SYSTEM + + # Single-call mode if --user is provided + if args.user: + if args.model: + # judge() doesn't take model via this helper — simplest: monkey-patch + from astraEnv import judge as judge_module + judge_module._DEFAULT_MODEL = args.model + asyncio.run(run_single(system, args.user)) + return 0 + + # Batch mode + if args.model: + from astraEnv import judge as judge_module + judge_module._DEFAULT_MODEL = args.model + asyncio.run(run_batch(system, CASES)) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/astraEnv/test_judge.py b/astraEnv/test_judge.py new file mode 100644 index 0000000..6bca2a0 --- /dev/null +++ b/astraEnv/test_judge.py @@ -0,0 +1,88 @@ +"""Smoke tests for astraEnv.judge. + +Run with: + pytest astraEnv/test_judge.py -v + +The end-to-end Fireworks test is skipped automatically when +FIREWORKS_API_KEY is not set. +""" + +from __future__ import annotations + +import asyncio +import json +import os + +import pytest + +from astraEnv.judge import JudgeError, extract_json, judge + + +# -------------------------------------------------------------------------- +# extract_json — pure, no network +# -------------------------------------------------------------------------- + + +def test_extract_json_bare(): + assert extract_json('{"score": 0.8, "reason": "ok"}') == { + "score": 0.8, + "reason": "ok", + } + + +def test_extract_json_with_whitespace(): + assert extract_json(' \n {"score": 1}\n ') == {"score": 1} + + +def test_extract_json_fenced_json(): + text = 'sure thing!\n```json\n{"score": 0.5, "reason": "partial"}\n```\nend' + assert extract_json(text) == {"score": 0.5, "reason": "partial"} + + +def test_extract_json_fenced_plain(): + text = '```\n{"score": 0}\n```' + assert extract_json(text) == {"score": 0} + + +def test_extract_json_fenced_uppercase(): + text = '```JSON\n{"x": 1}\n```' + assert extract_json(text) == {"x": 1} + + +def test_extract_json_raises_on_garbage(): + with pytest.raises(json.JSONDecodeError): + extract_json("not json at all") + + +# -------------------------------------------------------------------------- +# judge — network, gated on API key +# -------------------------------------------------------------------------- + + +_HAS_KEY = bool(os.environ.get("FIREWORKS_API_KEY")) + + +def test_judge_raises_without_api_key(monkeypatch): + monkeypatch.delenv("FIREWORKS_API_KEY", raising=False) + with pytest.raises(JudgeError, match="FIREWORKS_API_KEY"): + asyncio.run(judge(system="x", user="y")) + + +@pytest.mark.skipif(not _HAS_KEY, reason="FIREWORKS_API_KEY not set") +def test_judge_end_to_end_returns_json(): + response = asyncio.run( + judge( + system=( + 'You grade outputs. Return ONLY JSON: ' + '{"score": float in [0,1], "reason": ""}' + ), + user="GOAL: name a primary color\n\nOUTPUT: red", + temperature=0.0, + max_tokens=100, + ) + ) + parsed = extract_json(response) + assert "score" in parsed + assert 0.0 <= float(parsed["score"]) <= 1.0 + # "red" should score high — sanity check the judge is sensible + assert float(parsed["score"]) >= 0.5, f"Unexpectedly low score: {parsed}" From b0e2a31bf2062c9a295b6de6b3872b81c5e297b0 Mon Sep 17 00:00:00 2001 From: Haizhong Date: Wed, 27 May 2026 16:03:36 -0400 Subject: [PATCH 16/35] feat: add reward_mode selector + LLM judge for Oolong sub-agents Two user-facing reward systems, selected by reward_mode in workflow_spec: team_credit (default) All agents share the root's rule-based reward. No LLM judge calls. Cheap, simple, every agent gets some signal. per_agent_judge Root keeps its rule-based reward; each sub-agent is scored by an LLM judge (astraEnv.judge) on its own (goal, output). True per-agent credit assignment at the cost of API calls per sub-agent. env.py changes: - evaluate() is now async; sub-agent branch routes to the LLM judge when use_llm_judge=True, else returns the legacy 0.0 placeholder. - _grade_subagent_with_llm() catches all exceptions and clamps to [0, 1] so a flaky judge never crashes a rollout. - Adds use_llm_judge and judge_model kwargs. workflow.py changes: - New reward_mode kwarg with validation (raises ValueError on unknown modes, including the now-dropped 'root_only'). - use_llm_judge is derived from reward_mode -- never set independently. - Sequence emission no longer filters out sub-agent trajectories; all agents are emitted with their own reward from _reward_for_agent(), which picks root vs own based on reward_mode. Tests: - test_env.py: 10 tests (judge enabled/disabled, parse failures, network failures, clamping, model override, synth path unchanged). - test_workflow.py: 12 tests (default mode, validation, two-mode tree matrix). All LLM calls are mocked -- no API key required to run. Backwards-compatible defaults: yaml without reward_mode gets team_credit, which corresponds to "broadcast root reward to all agents". Note this differs from v5's root-only training (sub-agents were filtered out); root_only is no longer a supported mode. --- astraflow/core/workflow/impl/oolong/env.py | 67 ++++- .../core/workflow/impl/oolong/test_env.py | 237 ++++++++++++++++++ .../workflow/impl/oolong/test_workflow.py | 150 +++++++++++ .../core/workflow/impl/oolong/workflow.py | 68 +++-- 4 files changed, 502 insertions(+), 20 deletions(-) create mode 100644 astraflow/core/workflow/impl/oolong/test_env.py create mode 100644 astraflow/core/workflow/impl/oolong/test_workflow.py diff --git a/astraflow/core/workflow/impl/oolong/env.py b/astraflow/core/workflow/impl/oolong/env.py index e658d2e..079e3e2 100644 --- a/astraflow/core/workflow/impl/oolong/env.py +++ b/astraflow/core/workflow/impl/oolong/env.py @@ -32,6 +32,21 @@ synth_process_response, ) from astraflow.core.workflow.impl.oolong.tasks import Task +from astraEnv.judge import extract_json, judge + + +# Rubric sent to the LLM judge when grading a sub-agent's finish_message +# against its delegated goal. Sub-agents have no rule-based verifier (their +# goals are free-form strings produced by the parent), so we ask an external +# LLM to score the answer. Keep this short and unambiguous. +_SUBAGENT_RUBRIC_SYSTEM = ( + "You grade a sub-agent's output against its delegated goal.\n" + 'Return ONLY JSON: {"score": float in [0,1], "reason": ""}\n' + "1.0 = output fully and correctly satisfies the goal. " + "0.5 = partially correct. " + "0.0 = wrong, empty, or a refusal.\n" + "Do not include any other text — JSON only." +) # Sentinel exception used to terminate the agent's code when finish() is @@ -70,10 +85,17 @@ def __init__( task: Task, spawn_callback: SpawnCallback | None = None, stdout_truncate: int = DEFAULT_STDOUT_TRUNCATE, + use_llm_judge: bool = False, + judge_model: str | None = None, ): self.task = task self.stdout_truncate = stdout_truncate self._spawn_cb = spawn_callback + # When True, sub-agent tasks (task_id without the "oolong." prefix) + # are graded by an LLM judge via astraEnv.judge. When False, they + # return score=0.0 with a placeholder reason (legacy behavior). + self.use_llm_judge = bool(use_llm_judge) + self.judge_model = judge_model self.finished: bool = False self.finish_payload: Any | None = None @@ -161,14 +183,15 @@ async def run_code(self, code: str) -> ExecResult: # ----------------------------- evaluation --------------------------------- - def evaluate(self) -> tuple[float, dict[str, Any]]: + async def evaluate(self) -> tuple[float, dict[str, Any]]: """Reward for THIS agent. Called at the agent's finish() time. Routes to the right grader based on task_id prefix: - oolong.synth.* -> rule-based synth_process_response - oolong.real.* -> dnd_process_response (placeholder for now) - - synthetic sub-agent task ids (no "oolong." prefix) -> 0.0 - placeholder; will need an LLM judge per the paper (Appendix A.7). + - synthetic sub-agent task ids (no "oolong." prefix) -> + LLM judge via astraEnv.judge if self.use_llm_judge, + else 0.0 placeholder. """ if not self.finished: return 0.0, {"reason": "agent never called finish()"} @@ -180,8 +203,42 @@ def evaluate(self) -> tuple[float, dict[str, Any]]: r = synth_process_response(self.task.misc, output) elif task_id.startswith("oolong.real."): r = dnd_process_response(self.task.misc, output) + elif self.use_llm_judge: + r = await self._grade_subagent_with_llm(output) else: - # Sub-agent task — no root verifier available without an LLM judge. - r = {"score": 0.0, "reason": "no node-local verifier (LLM judge not yet wired)"} + r = {"score": 0.0, "reason": "no node-local verifier (LLM judge disabled)"} return float(r.get("score", 0.0)), r + + async def _grade_subagent_with_llm(self, output: str) -> dict[str, Any]: + """Send (goal, output) to the LLM judge and parse the score. + + On any failure (network, parse, missing field) returns score=0.0 + with the error in `reason` so a flaky judge never crashes a rollout. + """ + user = f"GOAL: {self.task.goal}\n\nOUTPUT: {output}" + judge_kwargs: dict[str, Any] = {} + if self.judge_model: + judge_kwargs["model"] = self.judge_model + try: + raw = await judge( + system=_SUBAGENT_RUBRIC_SYSTEM, user=user, **judge_kwargs + ) + except Exception as e: + return {"score": 0.0, "reason": f"judge call failed: {e}"} + try: + parsed = extract_json(raw) + score = float(parsed["score"]) + except Exception as e: + return { + "score": 0.0, + "reason": f"judge response unparseable: {e}", + "judge_raw": raw, + } + # Clamp defensively in case the model returns out-of-range. + score = max(0.0, min(1.0, score)) + return { + "score": score, + "reason": str(parsed.get("reason", "")), + "judge_raw": raw, + } diff --git a/astraflow/core/workflow/impl/oolong/test_env.py b/astraflow/core/workflow/impl/oolong/test_env.py new file mode 100644 index 0000000..2c63ed9 --- /dev/null +++ b/astraflow/core/workflow/impl/oolong/test_env.py @@ -0,0 +1,237 @@ +"""Unit tests for OolongEnv.evaluate(), focused on the LLM-judge integration. + +The LLM judge call is mocked — these tests do not hit Fireworks. + +Run: + pytest astraflow/core/workflow/impl/oolong/test_env.py -v +""" + +from __future__ import annotations + +import asyncio +from unittest.mock import patch + +import pytest + +from astraflow.core.workflow.impl.oolong import env as env_module +from astraflow.core.workflow.impl.oolong.env import OolongEnv +from astraflow.core.workflow.impl.oolong.tasks import Task + + +# -------------------------------------------------------------------------- +# helpers +# -------------------------------------------------------------------------- + + +def _subagent_task(goal: str = "find the capital of France") -> Task: + """Sub-agent task ids do NOT start with 'oolong.' — that's how the env + routes to the LLM-judge path.""" + return Task(goal=goal, id="parent/sub_abc123", misc={"context": ""}) + + +def _synth_task() -> Task: + """A real oolong-synth task id — should always go through rule-based grader, + regardless of the use_llm_judge flag.""" + return Task( + goal="count items", + id="oolong.synth.validation.0", + misc={ + "context": "", + "answer": "[1]", + "answer_type": "ANSWER_TYPE.NUMERIC", + }, + ) + + +def _finished(env: OolongEnv, payload: str) -> OolongEnv: + env.finished = True + env.finish_payload = payload + return env + + +def _run(coro): + return asyncio.run(coro) + + +# -------------------------------------------------------------------------- +# sub-agent path +# -------------------------------------------------------------------------- + + +def test_subagent_judge_disabled_returns_zero(): + """Default (use_llm_judge=False) preserves the legacy placeholder behavior.""" + env = _finished(OolongEnv(task=_subagent_task()), "Paris") + score, info = _run(env.evaluate()) + assert score == 0.0 + assert "disabled" in info["reason"] + + +def test_subagent_judge_enabled_parses_score(): + """With the judge enabled and a sensible JSON response, the score flows + through and reason is preserved.""" + env = _finished( + OolongEnv(task=_subagent_task(), use_llm_judge=True), "Paris" + ) + + async def fake_judge(system, user, **kwargs): + # Smoke-check: the prompt actually contains the goal and the output. + assert "find the capital of France" in user + assert "Paris" in user + return '{"score": 0.9, "reason": "Correct capital of France."}' + + with patch.object(env_module, "judge", side_effect=fake_judge): + score, info = _run(env.evaluate()) + + assert score == pytest.approx(0.9) + assert "Correct" in info["reason"] + assert "judge_raw" in info + + +def test_subagent_judge_clamps_out_of_range(): + """Defensive clamping: if the model returns 1.5 or -0.3, we clamp to [0,1].""" + env = _finished( + OolongEnv(task=_subagent_task(), use_llm_judge=True), "answer" + ) + + async def fake_judge(system, user, **kwargs): + return '{"score": 1.5, "reason": "over the top"}' + + with patch.object(env_module, "judge", side_effect=fake_judge): + score, _info = _run(env.evaluate()) + assert score == 1.0 + + async def fake_judge_neg(system, user, **kwargs): + return '{"score": -0.3, "reason": "negative"}' + + with patch.object(env_module, "judge", side_effect=fake_judge_neg): + score, _info = _run(env.evaluate()) + assert score == 0.0 + + +def test_subagent_judge_network_failure_returns_zero(): + """A flaky judge call must not crash the rollout — return 0.0 with reason.""" + env = _finished( + OolongEnv(task=_subagent_task(), use_llm_judge=True), "answer" + ) + + async def boom(system, user, **kwargs): + raise RuntimeError("network down") + + with patch.object(env_module, "judge", side_effect=boom): + score, info = _run(env.evaluate()) + + assert score == 0.0 + assert "judge call failed" in info["reason"] + assert "network down" in info["reason"] + + +def test_subagent_judge_unparseable_response_returns_zero(): + """If the model returns garbage, return 0.0 and keep the raw text for audit.""" + env = _finished( + OolongEnv(task=_subagent_task(), use_llm_judge=True), "answer" + ) + + async def fake_judge(system, user, **kwargs): + return "this is not json at all" + + with patch.object(env_module, "judge", side_effect=fake_judge): + score, info = _run(env.evaluate()) + + assert score == 0.0 + assert "unparseable" in info["reason"] + assert info["judge_raw"] == "this is not json at all" + + +def test_subagent_judge_missing_score_field_returns_zero(): + """Malformed JSON (no score key) → 0.0 with a parse-failure reason.""" + env = _finished( + OolongEnv(task=_subagent_task(), use_llm_judge=True), "answer" + ) + + async def fake_judge(system, user, **kwargs): + return '{"reason": "I forgot the score field"}' + + with patch.object(env_module, "judge", side_effect=fake_judge): + score, info = _run(env.evaluate()) + + assert score == 0.0 + assert "unparseable" in info["reason"] + + +def test_subagent_judge_passes_custom_model(): + """When judge_model is set on the env, it is forwarded to judge() as `model=`.""" + env = _finished( + OolongEnv( + task=_subagent_task(), + use_llm_judge=True, + judge_model="accounts/fireworks/models/deepseek-v4-pro", + ), + "answer", + ) + + captured = {} + + async def fake_judge(system, user, **kwargs): + captured.update(kwargs) + return '{"score": 0.5, "reason": "ok"}' + + with patch.object(env_module, "judge", side_effect=fake_judge): + _run(env.evaluate()) + + assert captured.get("model") == "accounts/fireworks/models/deepseek-v4-pro" + + +def test_subagent_judge_no_model_override_passes_none(): + """When judge_model is None, no `model=` kwarg is forwarded (judge uses its default).""" + env = _finished( + OolongEnv(task=_subagent_task(), use_llm_judge=True), "answer" + ) + + captured = {} + + async def fake_judge(system, user, **kwargs): + captured.update(kwargs) + return '{"score": 0.5, "reason": "ok"}' + + with patch.object(env_module, "judge", side_effect=fake_judge): + _run(env.evaluate()) + + assert "model" not in captured + + +# -------------------------------------------------------------------------- +# non-sub-agent paths — judge flag must be irrelevant +# -------------------------------------------------------------------------- + + +def test_synth_task_ignores_judge_flag(): + """A real oolong-synth task must use the rule-based grader even when + use_llm_judge is True — the judge MUST NOT be called.""" + env = _finished( + OolongEnv(task=_synth_task(), use_llm_judge=True), "1" + ) + + async def boom(system, user, **kwargs): + raise AssertionError("judge() must not be called for oolong.synth tasks") + + with patch.object(env_module, "judge", side_effect=boom): + score, info = _run(env.evaluate()) + + # synth_process_response should accept the gold answer "1" and return 1.0 + assert score == 1.0 + assert "judge_raw" not in info + + +def test_unfinished_env_returns_zero_regardless_of_flag(): + """Unfinished agent — no grading happens, judge MUST NOT be called.""" + env = OolongEnv(task=_subagent_task(), use_llm_judge=True) + # NOT calling _finished — agent never called finish() + + async def boom(system, user, **kwargs): + raise AssertionError("judge() must not be called for unfinished agent") + + with patch.object(env_module, "judge", side_effect=boom): + score, info = _run(env.evaluate()) + + assert score == 0.0 + assert "never called finish" in info["reason"] diff --git a/astraflow/core/workflow/impl/oolong/test_workflow.py b/astraflow/core/workflow/impl/oolong/test_workflow.py new file mode 100644 index 0000000..b028ec2 --- /dev/null +++ b/astraflow/core/workflow/impl/oolong/test_workflow.py @@ -0,0 +1,150 @@ +"""Unit tests for OolongRecursiveWorkflow reward_mode dispatch. + +Focuses on the per-agent reward selection logic. The full rollout is +not exercised — that requires a tokenizer, an inference engine, and a +running RaaS, which belongs in integration tests. + +Run: + pytest astraflow/core/workflow/impl/oolong/test_workflow.py -v +""" + +from __future__ import annotations + +import pytest + +from astraflow.core.workflow.impl.oolong.tasks import Task +from astraflow.core.workflow.impl.oolong.workflow import ( + AgentTrajectory, + OolongRecursiveWorkflow, +) + + +# -------------------------------------------------------------------------- +# helpers +# -------------------------------------------------------------------------- + + +def _wf(mode: str | None = None) -> OolongRecursiveWorkflow: + """Build a minimal workflow; pass mode=None to test the default.""" + kwargs: dict = {} + if mode is not None: + kwargs["reward_mode"] = mode + return OolongRecursiveWorkflow(**kwargs) + + +def _agent( + traj_id: str = "root", + parent_id: str | None = None, + depth: int = 0, + is_root: bool = True, + reward: float = 0.0, + goal: str = "g", + task_id: str = "oolong.synth.validation.0", +) -> AgentTrajectory: + return AgentTrajectory( + traj_id=traj_id, + parent_id=parent_id, + depth=depth, + task=Task(goal=goal, id=task_id), + is_root=is_root, + reward=reward, + ) + + +# -------------------------------------------------------------------------- +# reward_mode validation +# -------------------------------------------------------------------------- + + +def test_default_reward_mode_is_team_credit(): + wf = _wf() # no reward_mode kwarg + assert wf.reward_mode == "team_credit" + assert wf.use_llm_judge is False + + +def test_team_credit_does_not_enable_judge(): + wf = _wf("team_credit") + assert wf.use_llm_judge is False + + +def test_per_agent_judge_enables_judge(): + wf = _wf("per_agent_judge") + assert wf.use_llm_judge is True + + +def test_unknown_reward_mode_raises(): + with pytest.raises(ValueError, match="reward_mode"): + _wf("nonsense") + + +def test_root_only_no_longer_supported(): + """root_only was dropped — must raise to surface stale configs.""" + with pytest.raises(ValueError, match="reward_mode"): + _wf("root_only") + + +# -------------------------------------------------------------------------- +# _reward_for_agent — the per-agent selection logic +# -------------------------------------------------------------------------- + + +def test_team_credit_uses_root_reward_for_root(): + wf = _wf("team_credit") + root = _agent(is_root=True, reward=0.9) + assert wf._reward_for_agent(root, root_reward=0.9) == 0.9 + + +def test_team_credit_broadcasts_root_reward_to_sub_agents(): + """Sub-agent's own reward is ignored; everyone uses root_reward.""" + wf = _wf("team_credit") + sub = _agent(traj_id="sub1", parent_id="root", depth=1, is_root=False, reward=0.2) + assert wf._reward_for_agent(sub, root_reward=0.9) == 0.9 + + +def test_per_agent_judge_uses_own_reward_for_root(): + wf = _wf("per_agent_judge") + root = _agent(is_root=True, reward=1.0) + assert wf._reward_for_agent(root, root_reward=1.0) == 1.0 + + +def test_per_agent_judge_uses_own_reward_for_sub_agents(): + """Each sub gets its own LLM-judge score, independent of root.""" + wf = _wf("per_agent_judge") + sub = _agent(traj_id="sub1", is_root=False, reward=0.7) + # root_reward differs from sub.reward; should pick sub.reward. + assert wf._reward_for_agent(sub, root_reward=0.0) == 0.7 + + +def test_per_agent_judge_handles_none_reward_defensively(): + """A sub-agent whose reward was never set (None) defaults to 0.0, + not a crash.""" + wf = _wf("per_agent_judge") + sub = _agent(traj_id="sub1", is_root=False) + sub.reward = None # type: ignore[assignment] + assert wf._reward_for_agent(sub, root_reward=0.5) == 0.0 + + +# -------------------------------------------------------------------------- +# end-to-end matrix on a small tree +# -------------------------------------------------------------------------- + + +def test_team_credit_full_tree(): + """Root (reward=0.8) + 2 subs (rewards=0.1, 0.2). All three should + receive 0.8.""" + wf = _wf("team_credit") + root = _agent(traj_id="r", is_root=True, reward=0.8) + sub_a = _agent(traj_id="a", parent_id="r", depth=1, is_root=False, reward=0.1) + sub_b = _agent(traj_id="b", parent_id="r", depth=1, is_root=False, reward=0.2) + rewards = [wf._reward_for_agent(ag, root_reward=0.8) for ag in (root, sub_a, sub_b)] + assert rewards == [0.8, 0.8, 0.8] + + +def test_per_agent_judge_full_tree(): + """Same tree under per_agent_judge — each agent keeps its own reward.""" + wf = _wf("per_agent_judge") + root = _agent(traj_id="r", is_root=True, reward=0.8) + sub_a = _agent(traj_id="a", parent_id="r", depth=1, is_root=False, reward=0.1) + sub_b = _agent(traj_id="b", parent_id="r", depth=1, is_root=False, reward=0.2) + rewards = [wf._reward_for_agent(ag, root_reward=0.8) for ag in (root, sub_a, sub_b)] + assert rewards == [0.8, 0.1, 0.2] diff --git a/astraflow/core/workflow/impl/oolong/workflow.py b/astraflow/core/workflow/impl/oolong/workflow.py index a2c539f..1994924 100644 --- a/astraflow/core/workflow/impl/oolong/workflow.py +++ b/astraflow/core/workflow/impl/oolong/workflow.py @@ -229,6 +229,29 @@ def __init__( self.rollout_stat_scope = rollout_stat_scope self.dump_dir = dump_dir self.dump_prob = float(dump_prob) + # Reward mode — selects which credit-assignment scheme to use. + # + # "team_credit" All agents in the tree share the root's + # rule-based reward. No LLM judge calls. + # Cheap; noisy per-agent credit but every + # agent gets some signal. + # + # "per_agent_judge" Root keeps its rule-based reward; each + # sub-agent is scored by an LLM judge + # (astraEnv.judge) on its own (goal, output). + # True per-agent credit; costs API $$ per + # sub-agent rollout. + # + # `use_llm_judge` for the env is derived from this — never set it + # independently. + self.reward_mode: str = str(kwargs.pop("reward_mode", "team_credit")) + if self.reward_mode not in ("team_credit", "per_agent_judge"): + raise ValueError( + f"reward_mode must be 'team_credit' or 'per_agent_judge', " + f"got {self.reward_mode!r}" + ) + self.use_llm_judge = self.reward_mode == "per_agent_judge" + self.judge_model = kwargs.pop("judge_model", None) # ------------------------------------------------------------------ utils @@ -339,7 +362,7 @@ async def _run_episode( # No observation after finish — the episode terminates. traj.finish_payload = env.finish_payload traj.finish_message = "" if env.finish_payload is None else str(env.finish_payload) - score, _info = env.evaluate() + score, _info = await env.evaluate() traj.reward = float(score) steps_taken += 1 break @@ -383,6 +406,8 @@ async def _launch(goal: str, context: str) -> str: engine, budget, sem, all_trajs, child_task.id, parent_depth + 1 ), stdout_truncate=self.stdout_truncate, + use_llm_judge=self.use_llm_judge, + judge_model=self.judge_model, ) async with sem: child_traj = await self._run_episode( @@ -471,6 +496,8 @@ async def _run_one_rollout( engine, budget, sem, all_trajs, root_id, parent_depth=0 ), stdout_truncate=self.stdout_truncate, + use_llm_judge=self.use_llm_judge, + judge_model=self.judge_model, ) await self._run_episode( @@ -478,27 +505,24 @@ async def _run_one_rollout( all_trajs=all_trajs, parent_id=None, depth=0, is_root=True, ) - # Apply delegation bonus across the tree. + # Apply delegation bonus across the tree (modifies root.reward + # in-place; sub-agents keep their own per-agent rewards). self._apply_delegation_bonus(all_trajs) - # Root-only training: emit ONLY the root agent's sequences for - # PPO. v2 (team-credit, bs=64) and v3 (team-credit, bs=256) both - # showed pre_filter degrading from 0.6-0.8 → 0.2-0.4 in <10 steps. - # Root tokens already include `await launch_subagent(...)` calls, - # so the model still learns to spawn from the root's gradient. - # The sub-agent's own generations don't get a gradient — they need - # a per-segment verifier (LLM judge) to train usefully, which we - # defer per [[spawn-subagent-credit]]. + # Emit one (reward, sequences) entry per agent that produced any + # turns. Both modes emit all agents — the difference is which + # reward each agent's tokens receive (see _reward_for_agent). root_traj = all_trajs[0] if all_trajs else None - team_reward = float(root_traj.reward) if root_traj else 0.0 + root_reward = float(root_traj.reward) if root_traj else 0.0 per_agent: list[dict[str, Any]] = [] for ag in all_trajs: - if not ag.turns or not ag.is_root: + if not ag.turns: continue - seqs = self._build_sequences_for_agent(ag, team_reward) + agent_reward = self._reward_for_agent(ag, root_reward) + seqs = self._build_sequences_for_agent(ag, agent_reward) per_agent.append({ - "reward": team_reward, + "reward": agent_reward, "sequences": seqs, "depth": ag.depth, "is_root": ag.is_root, @@ -508,12 +532,26 @@ async def _run_one_rollout( "per_agent": per_agent, "all_trajs": all_trajs, "task": task, - "root_reward": team_reward, + "root_reward": root_reward, "n_agents": len(all_trajs), "subagent_launched": int(env.subagent_launched), "subagent_succeeded": float(env.subagent_succeeded), } + def _reward_for_agent(self, ag: AgentTrajectory, root_reward: float) -> float: + """Pick the training reward for one agent based on reward_mode. + + - team_credit: every agent (root + subs) trains on root's reward + - per_agent_judge: each agent trains on its own env.evaluate() reward + (root: rule-based; sub: LLM judge) + """ + if self.reward_mode == "team_credit": + return root_reward + # per_agent_judge — defensive default if a sub's reward never set + if ag.reward is None: + return 0.0 + return float(ag.reward) + async def arun_episode( self, engine: InferenceEngine, data: dict[str, Any] ) -> dict[str, Any]: From b3b64247d8527928039f75ff3077c2ed1ade6767 Mon Sep 17 00:00:00 2001 From: Haizhong Date: Thu, 28 May 2026 00:28:43 -0400 Subject: [PATCH 17/35] feat: add CMU RAG search client and ai-rubric checklist grader to astraEnv Two new utilities shared by the DeepDive pipeline: - search.py: minimal httpx client for the CMU RAG server with a 256-concurrency semaphore and 3-attempt exponential backoff. Backoff sleeps release the semaphore so degraded server periods don't thundering-herd onto starved slots. - checklist.py: ChecklistGrader, an ai-rubric-style RubricChecklistFast port. A single LLM call generates 3-5 atomic criteria from the goal and scores them in one response, returning a holistic overall_score in [0, 1]. System prompt is verbatim from ai_rubric 0.2.4. --- astraEnv/checklist.py | 172 +++++++++++++++++++++++++++++++ astraEnv/search.py | 175 ++++++++++++++++++++++++++++++++ astraEnv/test_checklist.py | 200 +++++++++++++++++++++++++++++++++++++ astraEnv/test_search.py | 163 ++++++++++++++++++++++++++++++ 4 files changed, 710 insertions(+) create mode 100644 astraEnv/checklist.py create mode 100644 astraEnv/search.py create mode 100644 astraEnv/test_checklist.py create mode 100644 astraEnv/test_search.py diff --git a/astraEnv/checklist.py b/astraEnv/checklist.py new file mode 100644 index 0000000..5c203cf --- /dev/null +++ b/astraEnv/checklist.py @@ -0,0 +1,172 @@ +"""Single-call auto-checklist grader — local replacement for +``ai-rubric``'s ``rubric.core.checklist.RubricChecklistFast``. + +Matches the upstream package's behavior: + + - **One LLM call** (not two) — the model generates the checklist and + scores every item in a single response. + - **Continuous per-item scores** (0-1, not binary pass/fail) so the LLM + can reflect partial satisfaction. + - **Holistic ``overall_score``** chosen by the LLM, not mechanical + ``passed / total`` (lets critical items dominate non-critical ones). + - **No caching** — fresh checklist every call (matches upstream). + +System prompt ported verbatim from +``ai_rubric-0.2.4/rubric/prompts/generate-rubric-checklist-fast-system.jinja``. + +Usage:: + + from astraEnv.checklist import ChecklistGrader + + grader = ChecklistGrader(goal="find the actor's birth year") + score, reason = await grader.aevaluate(context=trajectory_text) + +Uses ``astraEnv.judge.judge`` for the LLM call so we keep our retry / key +handling. Temperature defaults to 1.0 for parity with the upstream package. +""" + +from __future__ import annotations + +from typing import Any + +from astraEnv.judge import extract_json, judge + + +# Verbatim from ai-rubric 0.2.4: +# rubric/prompts/generate-rubric-checklist-fast-system.jinja +_SYSTEM_PROMPT = ( + "We are building a rubric to evaluate a task. We will do this by " + "decomposing success criteria for the task into a checklist\n" + "and reasoning about the task success using this checklist. The " + "checklist should comprehensively test that the task is successfully " + "completed.\n\n" + "The rubric checklist should be as comprehensive as possible, and " + "should be able to evaluate the task in a way that is fair and accurate.\n\n" + "The rubric checklist should be as concise as possible, and should be " + "able to be easily understood by a human.\n\n" + "The rubric checklist should be as easy to evaluate as possible.\n\n" + "To evaluate a task on a checklist, you may consider the following " + "procedure:\n" + "1. For each criterion, reason whether it is critical or non-critical.\n" + "2. For each criterion, provide a score between 0 and 1 for how well " + "the task satisfies the criterion.\n" + "3. Consider the overall progress towards task completion and allow " + "for partial credit when generating the overall score.\n\n" + "# Output Format\n" + "```json\n" + "{\n" + ' "checklist": [\n' + ' "...", // a list of strings\n' + " ],\n" + ' "checklist_scores": [\n' + " 0.0, // between 0 and 1\n" + " ],\n" + ' "reasoning": "...",\n' + ' "overall_score": 0.0 // between 0 and 1\n' + "}\n" + "```" +) + + +def _build_user_prompt(task: str, context: str) -> str: + """Mirrors generate-rubric-checklist-fast-user.jinja.""" + return f"# Task\n{task}\n\n{context}\n\n# Your Evaluation Output" + + +class ChecklistGrader: + """Single-call checklist grader matching ai-rubric's RubricChecklistFast. + + Parameters + ---------- + goal : str + The task goal the agent was given. + judge_model : str | None + Optional override for the judge model. None = astraEnv.judge default. + temperature : float + Sampling temperature. 1.0 matches the upstream package's default. + """ + + def __init__( + self, + goal: str, + *, + judge_model: str | None = None, + temperature: float = 1.0, + ): + self.goal = goal + self.judge_model = judge_model + self.temperature = temperature + # Most-recent parsed response — exposed for inspection / debugging. + self.last_checklist: list[str] = [] + self.last_checklist_scores: list[float] = [] + self.last_reasoning: str = "" + self.last_overall_score: float | None = None + + def _judge_kwargs(self) -> dict[str, Any]: + kw: dict[str, Any] = {"temperature": self.temperature} + if self.judge_model: + kw["model"] = self.judge_model + return kw + + async def aevaluate(self, *, context: str) -> tuple[float, str]: + """Run one LLM call that generates+scores the checklist. + + Returns + ------- + score : float in [0, 1] + The LLM's holistic ``overall_score``. + reason : str + The LLM's reasoning. Empty string on failure. + + On any failure (network, parse, out-of-range score) returns + ``(0.0, error_message)`` — never raises. + """ + user = _build_user_prompt(self.goal, context) + try: + raw = await judge( + system=_SYSTEM_PROMPT, user=user, **self._judge_kwargs() + ) + except Exception as e: + return 0.0, f"checklist call failed: {e}" + + try: + parsed = extract_json(raw) + except Exception as e: + return 0.0, f"checklist response unparseable: {e}" + + try: + overall = float(parsed.get("overall_score", 0.0)) + except (TypeError, ValueError) as e: + return 0.0, f"overall_score not a number: {e}" + + # Clamp defensively; the upstream package raises if out of [0,1], + # but we prefer to log and continue so a flaky judge response + # never crashes the rollout. + overall = max(0.0, min(1.0, overall)) + + # Stash for inspection. + checklist = parsed.get("checklist") or [] + scores = parsed.get("checklist_scores") or [] + self.last_checklist = [str(x) for x in checklist if isinstance(x, (str, int, float))] + self.last_checklist_scores = [] + for s in scores: + try: + self.last_checklist_scores.append(float(s)) + except (TypeError, ValueError): + continue + self.last_reasoning = str(parsed.get("reasoning", "")) + self.last_overall_score = overall + + return overall, self.last_reasoning + + +async def grade_with_checklist( + goal: str, + context: str, + *, + judge_model: str | None = None, + temperature: float = 1.0, +) -> tuple[float, str]: + """Convenience wrapper: build a grader and evaluate in one call.""" + grader = ChecklistGrader(goal, judge_model=judge_model, temperature=temperature) + return await grader.aevaluate(context=context) diff --git a/astraEnv/search.py b/astraEnv/search.py new file mode 100644 index 0000000..cf8aabd --- /dev/null +++ b/astraEnv/search.py @@ -0,0 +1,175 @@ +"""Minimal client for the CMU RAG search server. + +One public function: `search(query, n_docs=5, ...) -> list[dict]`. +Each result is `{"text": str, "source": str, "score": float, ...}`. + +Backed by a process-global semaphore (default 256 concurrent) calibrated +to the server's measured ceiling — going higher tends to degrade latency +without raising throughput. Retries 3 times with exponential backoff on +transient failures (429 / 5xx / timeouts). + +Requires the env var `CMU_SEARCH_API_KEY` (stored in ~/.cmu_search_key). + +Usage: + from astraEnv.search import search + + passages = await search("who painted the mona lisa?", n_docs=5) + for p in passages: + print(f"[{p['score']:.2f}] ({p['source']}) {p['text'][:120]}...") +""" + +from __future__ import annotations + +import asyncio +import os +from typing import Any + +import httpx + +_URL = os.environ.get( + "CMU_SEARCH_URL", "http://catalyst-fleet1.cs.cmu.edu:30888/search" +) +_RETRY_STATUSES = {429, 500, 502, 503, 504} +_MAX_ATTEMPTS = 3 +_MAX_CONCURRENT = 256 # measured ceiling — going higher does not help throughput + +# Module-level semaphore + lock for lazy init from the right event loop. +_semaphore: asyncio.Semaphore | None = None +_sem_lock = asyncio.Lock() + + +class SearchError(RuntimeError): + """Raised when the search call cannot return a usable response.""" + + +async def _get_semaphore() -> asyncio.Semaphore: + global _semaphore + async with _sem_lock: + if _semaphore is None: + _semaphore = asyncio.Semaphore(_MAX_CONCURRENT) + return _semaphore + + +async def search( + query: str, + n_docs: int = 5, + *, + backend: str = "faiss", + nprobe: int = 128, + min_words: int = 20, + timeout_s: float = 30.0, +) -> list[dict[str, Any]]: + """Query the CMU RAG server; return a flat list of passages. + + Each returned dict has at minimum: + - text: str the full passage + - source: str dataset name the passage came from + - score: float similarity score (higher = better) + plus whatever extra fields the server provides (filename, passage_id, etc.). + + Raises: + SearchError on persistent failure (after retries) or unparseable response. + """ + api_key = os.environ.get("CMU_SEARCH_API_KEY") + if not api_key: + raise SearchError("CMU_SEARCH_API_KEY environment variable is not set") + + payload = { + "query": query, + "n_docs": n_docs, + "backend": backend, + "nprobe": nprobe, + "min_words": min_words, + } + headers = {"X-API-Key": api_key, "Content-Type": "application/json"} + + sem = await _get_semaphore() + last_err: Exception | None = None + + # Retry loop is OUTSIDE the semaphore so that backoff sleeps don't + # starve other concurrent searches. If the server is degraded, this + # prevents a thundering-herd where all semaphore slots stall on + # exponential backoff at once (locking out searches that would + # otherwise succeed). The semaphore is re-acquired per attempt. + for attempt in range(_MAX_ATTEMPTS): + async with sem: + async with httpx.AsyncClient( + timeout=httpx.Timeout(timeout_s, connect=5.0) + ) as client: + try: + resp = await client.post(_URL, json=payload, headers=headers) + except httpx.RequestError as exc: + last_err = exc + resp = None + + if resp is not None: + if resp.status_code == 200: + try: + data = resp.json() + except ValueError as exc: + raise SearchError( + f"Server returned non-JSON: {resp.text[:300]}" + ) from exc + return _flatten_results(data) + + if resp.status_code in _RETRY_STATUSES: + last_err = SearchError( + f"Server returned {resp.status_code}: {resp.text[:200]}" + ) + else: + # Non-retryable status (e.g. 401/403/404). + raise SearchError( + f"Server returned {resp.status_code}: {resp.text[:500]}" + ) + + # Backoff happens OUTSIDE the semaphore: other searches can run. + if attempt < _MAX_ATTEMPTS - 1: + await asyncio.sleep(2**attempt) + + raise SearchError( + f"search() failed after {_MAX_ATTEMPTS} attempts: {last_err}" + ) from last_err + + +def _flatten_results(data: dict[str, Any]) -> list[dict[str, Any]]: + """Normalize the server's nested response into a flat list of passages. + + Server response shape: + { + "results": { + "passages": [[ {text, source, ...}, ... ]], # outer list = per-query + "scores": [[ float, ... ]], + ... + }, + ... + } + + We send one query at a time, so we take `passages[0]` and zip with + `scores[0]` to attach the similarity score to each passage. + """ + results = data.get("results") + if not isinstance(results, dict): + raise SearchError(f"Missing 'results' in response: {str(data)[:300]}") + + passages_outer = results.get("passages") + scores_outer = results.get("scores") + if not passages_outer: + return [] + + # First (and only) query's passages. + passages = passages_outer[0] if isinstance(passages_outer[0], list) else [] + scores = ( + scores_outer[0] + if scores_outer and isinstance(scores_outer[0], list) + else [None] * len(passages) + ) + + out: list[dict[str, Any]] = [] + for p, s in zip(passages, scores): + if not isinstance(p, dict): + continue + entry = dict(p) + if "score" not in entry and s is not None: + entry["score"] = float(s) + out.append(entry) + return out diff --git a/astraEnv/test_checklist.py b/astraEnv/test_checklist.py new file mode 100644 index 0000000..7df8bad --- /dev/null +++ b/astraEnv/test_checklist.py @@ -0,0 +1,200 @@ +"""Tests for astraEnv.checklist — judge call mocked, no network. + +Matches ai-rubric 0.2.4's RubricChecklistFast single-call semantics. + +Run: + pytest astraEnv/test_checklist.py -v +""" + +from __future__ import annotations + +import asyncio +from unittest.mock import patch + +import pytest + +from astraEnv import checklist as cl_module +from astraEnv.checklist import ChecklistGrader, grade_with_checklist + + +def _run(coro): + return asyncio.run(coro) + + +_OK_RESPONSE = ( + '{' + '"checklist": ["finds dates", "right format", "completeness"],' + '"checklist_scores": [1.0, 1.0, 0.5],' + '"reasoning": "Found dates in correct format; partially complete.",' + '"overall_score": 0.8' + '}' +) + + +# -------------------------------------------------------------------------- +# Single-call structure +# -------------------------------------------------------------------------- + + +def test_single_judge_call_returns_overall_score(): + """One LLM call; score from overall_score field.""" + n_calls = {"n": 0} + + async def fake_judge(system, user, **kwargs): + n_calls["n"] += 1 + return _OK_RESPONSE + + with patch.object(cl_module, "judge", side_effect=fake_judge): + score, reason = _run(ChecklistGrader(goal="goal").aevaluate(context="ctx")) + + assert n_calls["n"] == 1 + assert score == pytest.approx(0.8) + assert "Found dates" in reason + + +def test_system_prompt_is_the_ai_rubric_one(): + """Verify we send ai-rubric's verbatim system prompt.""" + captured = {} + + async def fake_judge(system, user, **kwargs): + captured["system"] = system + captured["user"] = user + return _OK_RESPONSE + + with patch.object(cl_module, "judge", side_effect=fake_judge): + _run(ChecklistGrader(goal="g").aevaluate(context="ctx")) + + # Hallmark phrases from the verbatim prompt: + assert "decomposing success criteria for the task into a checklist" in captured["system"] + assert "checklist_scores" in captured["system"] + assert "overall_score" in captured["system"] + # User prompt format: + assert "# Task\ng" in captured["user"] + assert "ctx" in captured["user"] + assert "# Your Evaluation Output" in captured["user"] + + +# -------------------------------------------------------------------------- +# Parsing variants +# -------------------------------------------------------------------------- + + +def test_overall_score_clamped_to_unit_interval(): + """Defensive: if the LLM returns >1 or <0, we clamp instead of raising.""" + async def fake_high(system, user, **kwargs): + return '{"checklist": [], "checklist_scores": [], "reasoning": "x", "overall_score": 1.7}' + + with patch.object(cl_module, "judge", side_effect=fake_high): + score, _ = _run(ChecklistGrader(goal="g").aevaluate(context="ctx")) + assert score == 1.0 + + async def fake_neg(system, user, **kwargs): + return '{"checklist": [], "checklist_scores": [], "reasoning": "x", "overall_score": -0.3}' + + with patch.object(cl_module, "judge", side_effect=fake_neg): + score, _ = _run(ChecklistGrader(goal="g").aevaluate(context="ctx")) + assert score == 0.0 + + +def test_missing_overall_score_returns_zero(): + async def fake_judge(system, user, **kwargs): + return '{"checklist": ["a"], "checklist_scores": [1.0], "reasoning": "no overall"}' + + with patch.object(cl_module, "judge", side_effect=fake_judge): + score, _ = _run(ChecklistGrader(goal="g").aevaluate(context="ctx")) + assert score == 0.0 # defaults to 0.0 per .get(..., 0.0) + + +def test_last_checklist_and_scores_exposed(): + async def fake_judge(system, user, **kwargs): + return _OK_RESPONSE + + g = ChecklistGrader(goal="g") + with patch.object(cl_module, "judge", side_effect=fake_judge): + _run(g.aevaluate(context="ctx")) + + assert g.last_checklist == ["finds dates", "right format", "completeness"] + assert g.last_checklist_scores == [1.0, 1.0, 0.5] + assert g.last_overall_score == pytest.approx(0.8) + assert "Found dates" in g.last_reasoning + + +# -------------------------------------------------------------------------- +# Failure modes — never raise; return (0.0, reason) +# -------------------------------------------------------------------------- + + +def test_network_failure_returns_zero(): + async def boom(system, user, **kwargs): + raise ConnectionError("network down") + + with patch.object(cl_module, "judge", side_effect=boom): + score, reason = _run(ChecklistGrader(goal="g").aevaluate(context="ctx")) + assert score == 0.0 + assert "call failed" in reason + assert "network down" in reason + + +def test_unparseable_response_returns_zero(): + async def fake_judge(system, user, **kwargs): + return "not json at all" + + with patch.object(cl_module, "judge", side_effect=fake_judge): + score, reason = _run(ChecklistGrader(goal="g").aevaluate(context="ctx")) + assert score == 0.0 + assert "unparseable" in reason + + +def test_non_numeric_overall_score_returns_zero(): + async def fake_judge(system, user, **kwargs): + return '{"overall_score": "not a number", "reasoning": ""}' + + with patch.object(cl_module, "judge", side_effect=fake_judge): + score, reason = _run(ChecklistGrader(goal="g").aevaluate(context="ctx")) + assert score == 0.0 + assert "not a number" in reason + + +# -------------------------------------------------------------------------- +# Wrapper + passthrough +# -------------------------------------------------------------------------- + + +def test_grade_with_checklist_helper(): + async def fake_judge(system, user, **kwargs): + return _OK_RESPONSE + + with patch.object(cl_module, "judge", side_effect=fake_judge): + score, reason = _run(grade_with_checklist("goal", "ctx")) + + assert score == pytest.approx(0.8) + + +def test_temperature_and_model_forwarded(): + captured: list[dict] = [] + + async def fake_judge(system, user, **kwargs): + captured.append(dict(kwargs)) + return _OK_RESPONSE + + g = ChecklistGrader(goal="g", judge_model="custom-model", temperature=1.0) + with patch.object(cl_module, "judge", side_effect=fake_judge): + _run(g.aevaluate(context="ctx")) + + assert captured[0].get("model") == "custom-model" + assert captured[0].get("temperature") == 1.0 + + +def test_no_caching_between_evaluations(): + """Each aevaluate() call makes a fresh judge call (no checklist cache).""" + n_calls = {"n": 0} + + async def fake_judge(system, user, **kwargs): + n_calls["n"] += 1 + return _OK_RESPONSE + + with patch.object(cl_module, "judge", side_effect=fake_judge): + _run(grade_with_checklist("same goal", "ctx1")) + _run(grade_with_checklist("same goal", "ctx2")) + + assert n_calls["n"] == 2 # no caching diff --git a/astraEnv/test_search.py b/astraEnv/test_search.py new file mode 100644 index 0000000..c8a1913 --- /dev/null +++ b/astraEnv/test_search.py @@ -0,0 +1,163 @@ +"""Tests for astraEnv.search. + +Run with: + pytest astraEnv/test_search.py -v + +The live smoke test is skipped automatically when CMU_SEARCH_API_KEY is +not set. +""" + +from __future__ import annotations + +import asyncio +import os +from unittest.mock import AsyncMock, patch + +import httpx +import pytest + +from astraEnv.search import SearchError, _flatten_results, search + + +# -------------------------------------------------------------------------- +# _flatten_results — pure, no network +# -------------------------------------------------------------------------- + + +def test_flatten_normal_shape(): + data = { + "results": { + "passages": [ + [ + {"text": "p1", "source": "wiki"}, + {"text": "p2", "source": "c4"}, + ] + ], + "scores": [[1.4, 1.3]], + }, + } + out = _flatten_results(data) + assert len(out) == 2 + assert out[0]["text"] == "p1" + assert out[0]["source"] == "wiki" + assert out[0]["score"] == pytest.approx(1.4) + assert out[1]["score"] == pytest.approx(1.3) + + +def test_flatten_preserves_existing_score(): + """If server already attached a score on the passage, don't overwrite.""" + data = { + "results": { + "passages": [[{"text": "p1", "score": 0.99}]], + "scores": [[0.5]], + } + } + out = _flatten_results(data) + assert out[0]["score"] == pytest.approx(0.99) # passage's own wins + + +def test_flatten_empty_passages(): + assert _flatten_results({"results": {"passages": []}}) == [] + + +def test_flatten_no_scores_array(): + """Server can omit scores; passages just don't get a score field.""" + data = {"results": {"passages": [[{"text": "p1", "source": "x"}]]}} + out = _flatten_results(data) + assert out[0]["text"] == "p1" + assert "score" not in out[0] + + +def test_flatten_missing_results_key_raises(): + with pytest.raises(SearchError, match="Missing 'results'"): + _flatten_results({"query": "foo"}) + + +# -------------------------------------------------------------------------- +# search — network, mocked +# -------------------------------------------------------------------------- + + +def _make_ok_response(passages, scores) -> httpx.Response: + return httpx.Response( + status_code=200, + json={"results": {"passages": [passages], "scores": [scores]}}, + ) + + +def test_search_raises_without_api_key(monkeypatch): + monkeypatch.delenv("CMU_SEARCH_API_KEY", raising=False) + with pytest.raises(SearchError, match="CMU_SEARCH_API_KEY"): + asyncio.run(search("anything")) + + +def test_search_returns_normalized_passages(monkeypatch): + monkeypatch.setenv("CMU_SEARCH_API_KEY", "fake") + mock_resp = _make_ok_response( + passages=[{"text": "hello", "source": "wiki"}], + scores=[0.9], + ) + with patch("httpx.AsyncClient.post", new=AsyncMock(return_value=mock_resp)): + out = asyncio.run(search("test query", n_docs=1)) + assert out == [{"text": "hello", "source": "wiki", "score": 0.9}] + + +def test_search_propagates_non_retryable_error(monkeypatch): + monkeypatch.setenv("CMU_SEARCH_API_KEY", "fake") + bad = httpx.Response(status_code=403, text="forbidden") + with patch("httpx.AsyncClient.post", new=AsyncMock(return_value=bad)): + with pytest.raises(SearchError, match="403"): + asyncio.run(search("test")) + + +def test_search_retries_on_429(monkeypatch): + """First call returns 429, second succeeds — we should get the success.""" + monkeypatch.setenv("CMU_SEARCH_API_KEY", "fake") + responses = [ + httpx.Response(status_code=429, text="rate limited"), + _make_ok_response(passages=[{"text": "ok", "source": "x"}], scores=[1.0]), + ] + call_count = {"n": 0} + + async def fake_post(self, *args, **kwargs): + i = call_count["n"] + call_count["n"] += 1 + return responses[i] + + with patch("httpx.AsyncClient.post", new=fake_post), \ + patch("asyncio.sleep", new=AsyncMock()): # skip backoff sleep + out = asyncio.run(search("retry-me")) + assert out == [{"text": "ok", "source": "x", "score": 1.0}] + assert call_count["n"] == 2 + + +def test_search_exhausts_retries_then_raises(monkeypatch): + monkeypatch.setenv("CMU_SEARCH_API_KEY", "fake") + bad = httpx.Response(status_code=503, text="unavailable") + with patch("httpx.AsyncClient.post", new=AsyncMock(return_value=bad)), \ + patch("asyncio.sleep", new=AsyncMock()): + with pytest.raises(SearchError): + asyncio.run(search("nope")) + + +# -------------------------------------------------------------------------- +# Live smoke — only runs if CMU_SEARCH_API_KEY is set +# -------------------------------------------------------------------------- + + +_HAS_KEY = bool(os.environ.get("CMU_SEARCH_API_KEY")) + + +@pytest.mark.skipif(not _HAS_KEY, reason="CMU_SEARCH_API_KEY not set") +def test_search_live_smoke(): + out = asyncio.run(search("who painted the mona lisa?", n_docs=3)) + assert len(out) > 0 + first = out[0] + assert "text" in first + assert len(first["text"]) > 50 # passages should be substantive + # Heuristic: a query about the Mona Lisa should return at least one + # passage that mentions "Leonardo" or "da Vinci". + joined = " ".join(p["text"] for p in out) + assert "Leonardo" in joined or "da Vinci" in joined, ( + f"Unexpected results: {joined[:300]}" + ) From 9bcfff78631bba293327310dc207a931173cf40e Mon Sep 17 00:00:00 2001 From: Haizhong Date: Thu, 28 May 2026 00:28:54 -0400 Subject: [PATCH 18/35] feat: add DeepDive recursive-agent workflow + Qwen3-4B recipe Port of platoon's DeepDive RL recipe to AstraFlow. - workflow_cls "deepdive_recursive": recursive web-research agent loop with {JSON} format. - env.py: search (CMU RAG), spawn (sub-agent), finish actions. Reward routing: root task -> binary-success LLM judge against ground truth (verbatim platoon rubric); sub-agent task -> ChecklistGrader. - Workflow stamps sample-weighted group_reward_mean over root rewards and group_reward_std=1.0 on every emitted sequence, matching platoon's mean-only centering (no std normalization). - reward_mode selector (team_credit | per_agent_judge) for credit assignment experiments. - Recipe: qwen3-4b-recursive with bs=256, lr=3e-6, total 500 steps, filter_zero_adv re-enabled, delegation_lambda=0. --- .gitignore | 3 + astraflow/core/workflow/__init__.py | 2 + .../core/workflow/impl/deepdive/__init__.py | 0 astraflow/core/workflow/impl/deepdive/env.py | 265 +++++++ .../core/workflow/impl/deepdive/tasks.py | 120 +++ .../core/workflow/impl/deepdive/test_env.py | 353 +++++++++ .../workflow/impl/deepdive/test_workflow.py | 123 ++++ .../core/workflow/impl/deepdive/workflow.py | 694 ++++++++++++++++++ .../core/workflow/reward/deepdive_success.py | 23 + astraflow/dataflow/dataset/deepdive.py | 76 ++ .../qwen3-4b-recursive/scripts/1_astraflow.sh | 36 + .../qwen3-4b-recursive/scripts/2_raas.sh | 44 ++ .../scripts/3_trainer_model0.sh | 47 ++ .../scripts/run_qwen3-4b-recursive.sh | 132 ++++ .../qwen3-4b-recursive/yaml/experiment.yaml | 170 +++++ .../qwen3-4b-recursive/yaml/raas.yaml | 30 + 16 files changed, 2118 insertions(+) create mode 100644 astraflow/core/workflow/impl/deepdive/__init__.py create mode 100644 astraflow/core/workflow/impl/deepdive/env.py create mode 100644 astraflow/core/workflow/impl/deepdive/tasks.py create mode 100644 astraflow/core/workflow/impl/deepdive/test_env.py create mode 100644 astraflow/core/workflow/impl/deepdive/test_workflow.py create mode 100644 astraflow/core/workflow/impl/deepdive/workflow.py create mode 100644 astraflow/core/workflow/reward/deepdive_success.py create mode 100644 astraflow/dataflow/dataset/deepdive.py create mode 100755 examples/deepdive/qwen3-4b-recursive/scripts/1_astraflow.sh create mode 100755 examples/deepdive/qwen3-4b-recursive/scripts/2_raas.sh create mode 100755 examples/deepdive/qwen3-4b-recursive/scripts/3_trainer_model0.sh create mode 100755 examples/deepdive/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh create mode 100644 examples/deepdive/qwen3-4b-recursive/yaml/experiment.yaml create mode 100644 examples/deepdive/qwen3-4b-recursive/yaml/raas.yaml diff --git a/.gitignore b/.gitignore index fe2c281..75074d6 100644 --- a/.gitignore +++ b/.gitignore @@ -234,3 +234,6 @@ torchinductor_* # Oolong HF dataset cache (auto-downloaded, multi-GB) astraflow/core/workflow/impl/oolong/oolong_*.jsonl + +# DeepDive HF dataset cache (auto-downloaded) +astraflow/core/workflow/impl/deepdive/deepdive_*.jsonl diff --git a/astraflow/core/workflow/__init__.py b/astraflow/core/workflow/__init__.py index b9b7bef..1b5aa58 100644 --- a/astraflow/core/workflow/__init__.py +++ b/astraflow/core/workflow/__init__.py @@ -27,6 +27,7 @@ import astraflow.core.workflow.impl.spawn import astraflow.core.workflow.impl.textcraft.workflow # registers recursive_agent import astraflow.core.workflow.impl.oolong.workflow # registers oolong_recursive +import astraflow.core.workflow.impl.deepdive.workflow # registers deepdive_recursive import astraflow.core.workflow.impl.vision_rlvr import astraflow.core.workflow.reward.clevr_count_70k import astraflow.core.workflow.reward.geometry3k @@ -35,3 +36,4 @@ import astraflow.core.workflow.reward.livecodebench_reward import astraflow.core.workflow.reward.textcraft_success # noqa: F401 import astraflow.core.workflow.reward.oolong_success # noqa: F401 +import astraflow.core.workflow.reward.deepdive_success # noqa: F401 diff --git a/astraflow/core/workflow/impl/deepdive/__init__.py b/astraflow/core/workflow/impl/deepdive/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/astraflow/core/workflow/impl/deepdive/env.py b/astraflow/core/workflow/impl/deepdive/env.py new file mode 100644 index 0000000..d41096c --- /dev/null +++ b/astraflow/core/workflow/impl/deepdive/env.py @@ -0,0 +1,265 @@ +"""Per-agent action-based env for DeepDive web research. + +Action format (TextCraft-style): each turn the agent emits exactly one +``{JSON args}`` block. The workflow parses +the block and calls the matching method on this env, which returns a +text observation that becomes the next user message. + +Actions (the only valid types): + - ``search`` args: {"query": str, "n_docs": int = 5} + Calls astraEnv.search; observation is the formatted list of passages. + - ``spawn`` args: {"goal": str} + Spawns one sub-agent (recursive researcher); observation is + the sub's finish_message string. + - ``finish`` args: {"answer": str} + Submits the final answer and ends the episode. + +Reward at finish() time: + - Root tasks (id starts with "deepdive." and no "/sub_" marker) → + binary-success LLM judge compares the agent's answer to the ground + truth (platoon's verbatim rubric). + - Sub-agent tasks (id contains "/sub_") → ChecklistGrader: a single + LLM call that generates a per-goal checklist and scores it (ai-rubric + RubricChecklistFast semantics). + +The judge is always required (no rule-based grader exists for DeepDive). +""" + +from __future__ import annotations + +from typing import Any, Awaitable, Callable + +from astraEnv.checklist import ChecklistGrader +from astraEnv.judge import extract_json, judge +from astraEnv.search import search as cmu_search +from astraflow.core.workflow.impl.deepdive.tasks import Task + + +# Rubric for grading the ROOT agent's answer against the ground truth. +# Ported verbatim from platoon's deepdive judge prompt (plugins/deepdive/ +# platoon/deepdive/env.py:323-334). Binary success — matches platoon's +# Stage 1 calibration for parity. +_ROOT_RUBRIC_SYSTEM = ( + "We need to judge the performance of an deepresearch agent on a task. " + "The task requires searching the web for information across various sources " + "and synthesizing information together to answer a question.\n" + "The agent may use subagents to solve parts of the task. Do not penalize the " + "model for relying on subagents, unless the subtasks delegated to the subagents " + "are not meaningful or useful for the task.\n" + "You will be given the ground truth answer to the task and the agent's answer " + "to the task.\n" + "When comparing the agent's answer to the ground truth answer, it is acceptable " + "to have minor formatting differences as long as the core information is equivalent.\n" + "Please provide a reason and success flag (boolean value) in the following format:\n" + "```json\n" + "{\n" + ' "reason": "Brief reasoning for success flag here.",\n' + ' "success": \n' + "}\n" + "```" +) + +# Sub-agent grading uses ChecklistGrader (astraEnv.checklist) — an auto- +# generated per-goal checklist via two LLM calls (generate + evaluate). +# This matches platoon's RubricChecklistFast pattern. No fixed rubric +# constant needed here. + + +# Cap how many search results' text we surface in one observation. The +# CMU server returns ~1-2KB passages; with n_docs=5 that's ~10KB per +# search. We truncate each passage to keep contexts bounded. +DEFAULT_PASSAGE_TRUNCATE = 600 + +# Hard caps for action args. +MAX_SEARCH_N_DOCS = 20 +DEFAULT_SEARCH_N_DOCS = 5 + + +# Signature: launch_subagent(goal) -> finish_message string. +SpawnCallback = Callable[[str], Awaitable[str]] + + +class DeepDiveEnv: + """Action-based env for one DeepDive research agent. + + No Python sandbox — the workflow calls action methods directly based + on the parsed action block. Each method returns a text observation. + """ + + def __init__( + self, + task: Task, + spawn_callback: SpawnCallback | None = None, + passage_truncate: int = DEFAULT_PASSAGE_TRUNCATE, + judge_model: str | None = None, + ): + self.task = task + self.passage_truncate = passage_truncate + self._spawn_cb = spawn_callback + self.judge_model = judge_model + + self.finished: bool = False + self.finish_payload: Any | None = None + + # Per-agent telemetry. + self.subagent_launched: int = 0 + self.subagent_succeeded: float = 0.0 + self.search_calls: int = 0 + + # ----------------------------------------------------------------- actions + + async def search(self, query: str, n_docs: int = DEFAULT_SEARCH_N_DOCS) -> str: + """Run a CMU RAG search; return formatted passages as one text block. + + Errors are returned as text observations (NOT raised), so a flaky + search call never crashes the rollout. + """ + n = max(1, min(MAX_SEARCH_N_DOCS, int(n_docs))) + q = str(query).strip() + if not q: + return "ERROR: search query is empty" + self.search_calls += 1 + try: + passages = await cmu_search(q, n_docs=n) + except Exception as e: + return f"ERROR: search failed: {type(e).__name__}: {e}" + if not passages: + return f"(no results for query: {q!r})" + return self._format_passages(q, passages) + + async def spawn(self, goal: str) -> str: + """Spawn one sub-agent; return its finish_message string.""" + if self._spawn_cb is None: + return "ERROR: spawn unavailable (no spawn_callback)" + g = str(goal).strip() + if not g: + return "ERROR: spawn goal is empty" + self.subagent_launched += 1 + try: + return await self._spawn_cb(g) + except Exception as e: + return f"ERROR: sub-agent crashed: {type(e).__name__}: {e}" + + def finish(self, answer: Any) -> None: + """Mark this agent finished with `answer` as the payload.""" + self.finished = True + self.finish_payload = answer + + # ----------------------------------------------------------------- format + + def _format_passages(self, query: str, passages: list[dict]) -> str: + """Render a list of passages into one text observation.""" + lines = [f"Search results for: {query!r}"] + for i, p in enumerate(passages, 1): + src = p.get("source", "?") + score = p.get("score") # None when missing — distinguishable from a real NaN + text = str(p.get("text", "")).strip() + if len(text) > self.passage_truncate: + text = text[: self.passage_truncate] + f"... [truncated, total {len(p.get('text', ''))} chars]" + if score is None: + score_str = "?" + else: + try: + f_score = float(score) + score_str = "?" if f_score != f_score else f"{f_score:.2f}" # NaN check + except (TypeError, ValueError): + score_str = "?" + lines.append(f"[{i}] (source={src} score={score_str}) {text}") + return "\n".join(lines) + + # ----------------------------------------------------------------- evaluation + + async def evaluate(self) -> tuple[float, dict[str, Any]]: + """Reward for THIS agent. Always uses an LLM judge. + + Routes: + - root tasks: id starts with "deepdive." and has NO "/sub_" marker + → root rubric vs ground_truth + - sub-agent tasks: id contains "/sub_" + → sub-agent rubric vs goal + """ + if not self.finished: + return 0.0, {"reason": "agent never called finish()"} + + task_id = self.task.id or "" + output = "" if self.finish_payload is None else str(self.finish_payload) + + is_subagent = "/sub_" in task_id + if not is_subagent and task_id.startswith("deepdive."): + r = await self._grade_root_with_llm(output) + else: + r = await self._grade_subagent_with_llm(output) + + return float(r.get("score", 0.0)), r + + async def _grade_root_with_llm(self, output: str) -> dict[str, Any]: + ground_truth = str(self.task.misc.get("ground_truth", "")).strip() + user = ( + f"QUESTION: {self.task.goal}\n\n" + f"GROUND TRUTH ANSWER: {ground_truth}\n\n" + f"AGENT'S ANSWER: {output}" + ) + return await self._call_judge(_ROOT_RUBRIC_SYSTEM, user) + + async def _grade_subagent_with_llm(self, output: str) -> dict[str, Any]: + """Grade a sub-agent via the ai-rubric-style auto-generated checklist. + + Single LLM call (per `ai_rubric.core.checklist.RubricChecklistFast`): + the model generates 3-5 atomic criteria from the goal AND scores + them in one response. Returns its holistic `overall_score` in [0,1]. + + Falls back gracefully on any failure (returns {"score": 0.0, ...}). + """ + grader = ChecklistGrader( + goal=self.task.goal, + judge_model=self.judge_model, + temperature=1.0, # platoon parity + ) + # Context: just the finish_message for now. Adding action history + # (turns the agent took) would match platoon more closely; deferred. + context = f"Final Message:\n{output}" + score, reason = await grader.aevaluate(context=context) + return { + "score": max(0.0, min(1.0, float(score))), + "reason": reason, + } + + async def _call_judge(self, system: str, user: str) -> dict[str, Any]: + """Common judge invocation. Parses platoon-style binary success. + + Expected response JSON: {"reason": str, "success": bool}. + Score = 1.0 if success is True, else 0.0. + + Falls back to legacy continuous "score" field if "success" missing, + so test fixtures with continuous scores still parse — but the + production rubrics now ask for binary success. + """ + judge_kwargs: dict[str, Any] = {"temperature": 1.0} # platoon parity + if self.judge_model: + judge_kwargs["model"] = self.judge_model + try: + raw = await judge(system=system, user=user, **judge_kwargs) + except Exception as e: + return {"score": 0.0, "reason": f"judge call failed: {e}"} + try: + parsed = extract_json(raw) + if "success" in parsed: + score = 1.0 if bool(parsed["success"]) else 0.0 + elif "score" in parsed: + # Legacy continuous score path — kept for test fixtures and + # for any future rubric that returns continuous scores. + score = float(parsed["score"]) + score = max(0.0, min(1.0, score)) + else: + raise KeyError("response missing both 'success' and 'score'") + except Exception as e: + return { + "score": 0.0, + "reason": f"judge response unparseable: {e}", + "judge_raw": raw, + } + return { + "score": score, + "reason": str(parsed.get("reason", "")), + "judge_raw": raw, + } diff --git a/astraflow/core/workflow/impl/deepdive/tasks.py b/astraflow/core/workflow/impl/deepdive/tasks.py new file mode 100644 index 0000000..7e43bf3 --- /dev/null +++ b/astraflow/core/workflow/impl/deepdive/tasks.py @@ -0,0 +1,120 @@ +"""Task loader for DeepDive (`zai-org/DeepDive`) — Q&A web-research benchmark. + +Mirrors the platoon loader. Splits: + - qa_rl : intended for RL training (used as our train split) + - qa_sft : intended for SFT / eval (used as our held-out eval split) + +A `Task` here is a lightweight dataclass: + Task(goal=question, id=task_id, max_steps=..., misc={"ground_truth": answer, ...}) + +On first call we hit HuggingFace, cache the rows to a local JSONL, and +from then on load from disk. The cache file is gitignored. +""" + +from __future__ import annotations + +import json +import os +from copy import deepcopy +from dataclasses import dataclass, field +from pathlib import Path +from typing import Any, Literal + +_DATA_DIR = Path(__file__).parent +_VALID_SPLITS = ("qa_rl", "qa_sft") +_DEFAULT_MAX_STEPS = 50 +_HF_DATASET = "zai-org/DeepDive" + +_TASKS: dict[str, "Task"] = {} +_RAW_BY_FILE: dict[Path, list[dict[str, Any]]] = {} + + +@dataclass +class Task: + """Lightweight task carrier matching platoon's shape.""" + goal: str + id: str + max_steps: int = _DEFAULT_MAX_STEPS + misc: dict[str, Any] = field(default_factory=dict) + + +def _load_from_hf(split: str) -> list[dict[str, Any]]: + try: + from datasets import load_dataset # type: ignore[import-untyped] + except ImportError as exc: + raise ImportError( + "datasets library is required. Install with: pip install datasets" + ) from exc + ds = load_dataset(_HF_DATASET, split=split) + return [dict(ex) for ex in ds] + + +def _cache_path(split: str) -> Path: + return _DATA_DIR / f"deepdive_{split}.jsonl" + + +def _ensure_cached(split: str) -> list[dict[str, Any]]: + path = _cache_path(split) + if path in _RAW_BY_FILE: + return _RAW_BY_FILE[path] + + if not path.exists(): + rows = _load_from_hf(split) + tmp = path.with_suffix(".jsonl.tmp") + with open(tmp, "w") as f: + for row in rows: + f.write(json.dumps(row) + "\n") + os.replace(tmp, path) + else: + rows = [] + with open(path) as f: + for line in f: + line = line.strip() + if line: + rows.append(json.loads(line)) + + _RAW_BY_FILE[path] = rows + return rows + + +def _example_to_task(example: dict[str, Any], split: str, idx: int) -> Task: + task_id = f"deepdive.{split}.{idx}" + misc = dict(example) + # Normalize: ground truth goes under a predictable key for the grader. + misc["ground_truth"] = str(example.get("answer", "")) + misc["dataset_split"] = split + misc["dataset_index"] = idx + return Task( + goal=str(example.get("question", "")), + id=task_id, + max_steps=_DEFAULT_MAX_STEPS, + misc=misc, + ) + + +def get_task_ids(split: Literal["qa_rl", "qa_sft"] = "qa_rl") -> list[str]: + """Return the ordered list of task IDs for a split.""" + if split not in _VALID_SPLITS: + raise ValueError(f"split must be in {_VALID_SPLITS}, got {split!r}") + rows = _ensure_cached(split) + return [f"deepdive.{split}.{idx}" for idx in range(len(rows))] + + +def get_task(task_id: str) -> Task: + """Return a deep-copy of the Task for a given ID.""" + if task_id in _TASKS: + return deepcopy(_TASKS[task_id]) + + parts = task_id.split(".") + if len(parts) != 3 or parts[0] != "deepdive": + raise ValueError(f"Invalid task ID: {task_id!r}") + _, split, idx_s = parts + if split not in _VALID_SPLITS: + raise ValueError(f"Invalid DeepDive split: {split!r}") + idx = int(idx_s) + rows = _ensure_cached(split) + if idx >= len(rows): + raise IndexError(f"Task index {idx} out of range for split {split}") + task = _example_to_task(rows[idx], split, idx) + _TASKS[task_id] = task + return deepcopy(task) diff --git a/astraflow/core/workflow/impl/deepdive/test_env.py b/astraflow/core/workflow/impl/deepdive/test_env.py new file mode 100644 index 0000000..c21fd48 --- /dev/null +++ b/astraflow/core/workflow/impl/deepdive/test_env.py @@ -0,0 +1,353 @@ +"""Unit tests for action-based DeepDiveEnv — judge + cmu_search mocked. + +Run: + pytest astraflow/core/workflow/impl/deepdive/test_env.py -v +""" + +from __future__ import annotations + +import asyncio +from unittest.mock import patch + +import pytest + +from astraflow.core.workflow.impl.deepdive import env as env_module +from astraflow.core.workflow.impl.deepdive.env import DeepDiveEnv +from astraflow.core.workflow.impl.deepdive.tasks import Task + + +def _root_task(goal: str = "who painted mona lisa", gt: str = "Leonardo da Vinci") -> Task: + return Task( + goal=goal, + id="deepdive.qa_rl.0", + misc={"ground_truth": gt, "answer": gt}, + ) + + +def _subagent_task(goal: str = "find dates in this email") -> Task: + return Task(goal=goal, id="deepdive.qa_rl.0/sub_abc123", misc={}) + + +def _run(coro): + return asyncio.run(coro) + + +# -------------------------------------------------------------------------- +# evaluate() routing — root vs sub-agent (judge mocked) +# -------------------------------------------------------------------------- + + +def test_evaluate_routes_root_task_to_root_rubric(): + env = DeepDiveEnv(task=_root_task()) + env.finish("Leonardo da Vinci") + captured = {} + + async def fake_judge(system, user, **kwargs): + captured["system"] = system + captured["user"] = user + return '{"success": true, "reason": "Correct."}' + + with patch.object(env_module, "judge", side_effect=fake_judge): + score, info = _run(env.evaluate()) + + # Root rubric mentions ground truth comparison. + assert "ground truth" in captured["system"].lower() + assert "QUESTION:" in captured["user"] + assert "GROUND TRUTH ANSWER:" in captured["user"] + assert "Leonardo da Vinci" in captured["user"] + # Binary success → score 1.0 + assert score == 1.0 + + +def test_evaluate_routes_subagent_through_checklist_grader(): + """Sub-agent grading uses ChecklistGrader (single LLM call, ai-rubric-style).""" + from astraEnv import checklist as cl_module + + env = DeepDiveEnv(task=_subagent_task()) + env.finish("2024-03-15, 2024-04-02") + + n_calls = {"n": 0} + + # The checklist grader uses astraEnv.judge directly (not env_module.judge). + async def fake_judge(system, user, **kwargs): + n_calls["n"] += 1 + # Single-call response: checklist + per-item scores + overall_score + return ( + '{' + '"checklist": ["finds dates", "right format", "completeness"],' + '"checklist_scores": [1.0, 1.0, 0.5],' + '"reasoning": "Found two dates; partially complete.",' + '"overall_score": 0.8' + '}' + ) + + with patch.object(cl_module, "judge", side_effect=fake_judge): + score, _info = _run(env.evaluate()) + + assert n_calls["n"] == 1 # single call, ai-rubric semantics + assert score == pytest.approx(0.8) + + +def test_evaluate_root_success_false_returns_zero(): + """Binary: success=false → score 0.0.""" + env = DeepDiveEnv(task=_root_task()) + env.finish("wrong answer") + + async def fake_judge(system, user, **kwargs): + return '{"success": false, "reason": "Answer is incorrect."}' + + with patch.object(env_module, "judge", side_effect=fake_judge): + score, _info = _run(env.evaluate()) + assert score == 0.0 + + +def test_evaluate_temperature_passed_as_one(): + """temp=1 is required for platoon parity.""" + env = DeepDiveEnv(task=_root_task()) + env.finish("answer") + captured = {} + + async def fake_judge(system, user, **kwargs): + captured.update(kwargs) + return '{"success": true, "reason": "ok"}' + + with patch.object(env_module, "judge", side_effect=fake_judge): + _run(env.evaluate()) + assert captured.get("temperature") == 1.0 + + +def test_evaluate_legacy_continuous_score_still_parses(): + """Backward compat: judges returning {"score": float} still work.""" + env = DeepDiveEnv(task=_root_task()) + env.finish("answer") + + async def fake_judge(system, user, **kwargs): + return '{"score": 0.7, "reason": "partial"}' + + with patch.object(env_module, "judge", side_effect=fake_judge): + score, _info = _run(env.evaluate()) + assert score == pytest.approx(0.7) + + +def test_evaluate_unfinished_returns_zero(): + env = DeepDiveEnv(task=_root_task()) # not finished + + async def boom(system, user, **kwargs): + raise AssertionError("judge must not be called for unfinished agent") + + with patch.object(env_module, "judge", side_effect=boom): + score, info = _run(env.evaluate()) + assert score == 0.0 + assert "never called finish" in info["reason"] + + +def test_evaluate_judge_failure_returns_zero(): + env = DeepDiveEnv(task=_root_task()) + env.finish("anything") + + async def boom(system, user, **kwargs): + raise RuntimeError("fireworks 503") + + with patch.object(env_module, "judge", side_effect=boom): + score, info = _run(env.evaluate()) + assert score == 0.0 + assert "judge call failed" in info["reason"] + + +def test_evaluate_clamps_out_of_range_score(): + env = DeepDiveEnv(task=_root_task()) + env.finish("answer") + + async def hi(system, user, **kwargs): + return '{"score": 1.7, "reason": "over"}' + + with patch.object(env_module, "judge", side_effect=hi): + score, _info = _run(env.evaluate()) + assert score == 1.0 + + async def lo(system, user, **kwargs): + return '{"score": -0.3, "reason": "below"}' + + env2 = DeepDiveEnv(task=_root_task()) + env2.finish("answer") + with patch.object(env_module, "judge", side_effect=lo): + score, _info = _run(env2.evaluate()) + assert score == 0.0 + + +def test_evaluate_unparseable_response_returns_zero(): + env = DeepDiveEnv(task=_root_task()) + env.finish("answer") + + async def fake_judge(system, user, **kwargs): + return "definitely not json" + + with patch.object(env_module, "judge", side_effect=fake_judge): + score, info = _run(env.evaluate()) + assert score == 0.0 + assert "unparseable" in info["reason"] + assert info["judge_raw"] == "definitely not json" + + +def test_evaluate_judge_model_override_forwarded(): + env = DeepDiveEnv( + task=_root_task(), + judge_model="accounts/fireworks/models/deepseek-v4-pro", + ) + env.finish("answer") + captured = {} + + async def fake_judge(system, user, **kwargs): + captured.update(kwargs) + return '{"score": 0.5, "reason": "ok"}' + + with patch.object(env_module, "judge", side_effect=fake_judge): + _run(env.evaluate()) + + assert captured.get("model") == "accounts/fireworks/models/deepseek-v4-pro" + + +# -------------------------------------------------------------------------- +# search() action (cmu_search mocked) +# -------------------------------------------------------------------------- + + +def test_search_action_calls_cmu_search_and_counts(): + env = DeepDiveEnv(task=_root_task()) + captured = {} + + async def fake_search(query, n_docs=5, **kwargs): + captured["query"] = query + captured["n_docs"] = n_docs + return [ + {"text": "leonardo painted it in 1503", "source": "wiki", "score": 0.9}, + {"text": "louvre", "source": "c4", "score": 0.85}, + ] + + with patch.object(env_module, "cmu_search", side_effect=fake_search): + obs = _run(env.search("who painted mona lisa", n_docs=2)) + + assert captured["query"] == "who painted mona lisa" + assert captured["n_docs"] == 2 + assert env.search_calls == 1 + # Observation is formatted text, includes query + numbered passages + sources. + assert "Search results for" in obs + assert "leonardo painted it in 1503" in obs + assert "[1]" in obs and "[2]" in obs + assert "wiki" in obs + assert "0.90" in obs + + +def test_search_action_clamps_n_docs(): + env = DeepDiveEnv(task=_root_task()) + captured = {} + + async def fake_search(query, n_docs=5, **kwargs): + captured["n_docs"] = n_docs + return [] + + with patch.object(env_module, "cmu_search", side_effect=fake_search): + _run(env.search("q", n_docs=999)) + assert captured["n_docs"] == 20 # MAX_SEARCH_N_DOCS + + with patch.object(env_module, "cmu_search", side_effect=fake_search): + _run(env.search("q", n_docs=0)) + assert captured["n_docs"] == 1 + + +def test_search_action_empty_query_returns_error_not_raises(): + env = DeepDiveEnv(task=_root_task()) + + async def boom(*args, **kwargs): + raise AssertionError("cmu_search must not be called for empty query") + + with patch.object(env_module, "cmu_search", side_effect=boom): + obs = _run(env.search(" ", n_docs=5)) + assert "ERROR" in obs + assert env.search_calls == 0 + + +def test_search_action_network_failure_returns_error_text(): + env = DeepDiveEnv(task=_root_task()) + + async def boom(*args, **kwargs): + raise ConnectionError("network down") + + with patch.object(env_module, "cmu_search", side_effect=boom): + obs = _run(env.search("anything")) + assert "ERROR" in obs + assert "search failed" in obs + assert env.search_calls == 1 # counter incremented before the call + + +def test_search_action_no_results_returns_friendly_text(): + env = DeepDiveEnv(task=_root_task()) + + async def fake_search(*args, **kwargs): + return [] + + with patch.object(env_module, "cmu_search", side_effect=fake_search): + obs = _run(env.search("obscure query")) + assert "no results" in obs + + +def test_search_action_truncates_long_passages(): + env = DeepDiveEnv(task=_root_task(), passage_truncate=50) + long_text = "x" * 1000 + + async def fake_search(*args, **kwargs): + return [{"text": long_text, "source": "x", "score": 1.0}] + + with patch.object(env_module, "cmu_search", side_effect=fake_search): + obs = _run(env.search("q")) + # Long passage should be truncated; full length noted. + assert "truncated" in obs + assert "total 1000 chars" in obs + + +# -------------------------------------------------------------------------- +# spawn() action +# -------------------------------------------------------------------------- + + +def test_spawn_calls_callback_and_counts(): + captured = {} + + async def fake_spawn(goal: str) -> str: + captured["goal"] = goal + return "the answer from the sub" + + env = DeepDiveEnv(task=_root_task(), spawn_callback=fake_spawn) + obs = _run(env.spawn("find the birth year")) + assert obs == "the answer from the sub" + assert env.subagent_launched == 1 + assert captured["goal"] == "find the birth year" + + +def test_spawn_without_callback_returns_error(): + env = DeepDiveEnv(task=_root_task(), spawn_callback=None) + obs = _run(env.spawn("anything")) + assert "ERROR" in obs + + +def test_spawn_with_empty_goal_returns_error_without_launching(): + async def boom(goal): + raise AssertionError("spawn callback must not be invoked for empty goal") + + env = DeepDiveEnv(task=_root_task(), spawn_callback=boom) + obs = _run(env.spawn(" ")) + assert "ERROR" in obs + assert env.subagent_launched == 0 + + +# -------------------------------------------------------------------------- +# finish() action (sync) +# -------------------------------------------------------------------------- + + +def test_finish_sets_state_and_is_sync(): + env = DeepDiveEnv(task=_root_task()) + assert not env.finished + env.finish("the answer") + assert env.finished + assert env.finish_payload == "the answer" diff --git a/astraflow/core/workflow/impl/deepdive/test_workflow.py b/astraflow/core/workflow/impl/deepdive/test_workflow.py new file mode 100644 index 0000000..844837c --- /dev/null +++ b/astraflow/core/workflow/impl/deepdive/test_workflow.py @@ -0,0 +1,123 @@ +"""Unit tests for DeepDiveRecursiveWorkflow reward_mode dispatch. + +Run: + pytest astraflow/core/workflow/impl/deepdive/test_workflow.py -v +""" + +from __future__ import annotations + +import pytest + +from astraflow.core.workflow.impl.deepdive.tasks import Task +from astraflow.core.workflow.impl.deepdive.workflow import ( + AgentTrajectory, + DeepDiveRecursiveWorkflow, +) + + +def _wf(mode: str | None = None) -> DeepDiveRecursiveWorkflow: + kwargs: dict = {} + if mode is not None: + kwargs["reward_mode"] = mode + return DeepDiveRecursiveWorkflow(**kwargs) + + +def _agent( + traj_id: str = "root", + parent_id: str | None = None, + depth: int = 0, + is_root: bool = True, + reward: float = 0.0, + goal: str = "g", + task_id: str = "deepdive.qa_rl.0", +) -> AgentTrajectory: + return AgentTrajectory( + traj_id=traj_id, + parent_id=parent_id, + depth=depth, + task=Task(goal=goal, id=task_id), + is_root=is_root, + reward=reward, + ) + + +# -------------------------------------------------------------------------- +# reward_mode validation +# -------------------------------------------------------------------------- + + +def test_default_reward_mode_is_team_credit(): + wf = _wf() + assert wf.reward_mode == "team_credit" + + +def test_per_agent_judge_accepted(): + wf = _wf("per_agent_judge") + assert wf.reward_mode == "per_agent_judge" + + +def test_unknown_reward_mode_raises(): + with pytest.raises(ValueError, match="reward_mode"): + _wf("nonsense") + + +def test_root_only_no_longer_supported(): + with pytest.raises(ValueError, match="reward_mode"): + _wf("root_only") + + +# -------------------------------------------------------------------------- +# delegation_lambda default matches platoon (0.0) +# -------------------------------------------------------------------------- + + +def test_default_delegation_lambda_is_zero(): + wf = _wf() + assert wf.delegation_lambda == 0.0 + + +# -------------------------------------------------------------------------- +# _reward_for_agent +# -------------------------------------------------------------------------- + + +def test_team_credit_broadcasts_root_to_subs(): + wf = _wf("team_credit") + sub = _agent(is_root=False, reward=0.1) + assert wf._reward_for_agent(sub, root_reward=0.9) == 0.9 + + +def test_per_agent_judge_uses_own_reward(): + wf = _wf("per_agent_judge") + sub = _agent(is_root=False, reward=0.7) + assert wf._reward_for_agent(sub, root_reward=0.0) == 0.7 + + +def test_per_agent_judge_handles_none_reward(): + wf = _wf("per_agent_judge") + sub = _agent(is_root=False) + sub.reward = None # type: ignore[assignment] + assert wf._reward_for_agent(sub, root_reward=0.5) == 0.0 + + +# -------------------------------------------------------------------------- +# full-tree matrix +# -------------------------------------------------------------------------- + + +def test_team_credit_full_tree(): + wf = _wf("team_credit") + root = _agent(traj_id="r", is_root=True, reward=0.8) + sub_a = _agent(traj_id="a", parent_id="r", depth=1, is_root=False, reward=0.1) + sub_b = _agent(traj_id="b", parent_id="r", depth=1, is_root=False, reward=0.2) + rewards = [wf._reward_for_agent(ag, root_reward=0.8) for ag in (root, sub_a, sub_b)] + assert rewards == [0.8, 0.8, 0.8] + + +def test_per_agent_judge_full_tree(): + wf = _wf("per_agent_judge") + root = _agent(traj_id="r", is_root=True, reward=0.8) + sub_a = _agent(traj_id="a", parent_id="r", depth=1, is_root=False, reward=0.1) + sub_b = _agent(traj_id="b", parent_id="r", depth=1, is_root=False, reward=0.2) + rewards = [wf._reward_for_agent(ag, root_reward=0.8) for ag in (root, sub_a, sub_b)] + assert rewards == [0.8, 0.1, 0.2] diff --git a/astraflow/core/workflow/impl/deepdive/workflow.py b/astraflow/core/workflow/impl/deepdive/workflow.py new file mode 100644 index 0000000..2558d70 --- /dev/null +++ b/astraflow/core/workflow/impl/deepdive/workflow.py @@ -0,0 +1,694 @@ +"""DeepDive recursive-agent workflow (action-based format, TextCraft-style). + +Each turn the model emits ONE action block: + {JSON args} + +Action types (the only valid ones): + - search {"query": str, "n_docs": int = 5} + - spawn {"goal": str} + - finish {"answer": str} + +The workflow parses the block, dispatches to the matching env method, and +returns the observation as the next user message. No Python sandbox — the +agent cannot "forget to print" search results. + +reward_mode controls which reward each agent's tokens train on: + - team_credit: every agent trains on root's LLM-judged reward + - per_agent_judge: each agent trains on its own LLM-judged reward +""" + +from __future__ import annotations + +import asyncio +import json +import random +import re +import uuid +from dataclasses import dataclass, field +from typing import Any + +import aiofiles +import aiofiles.os +import torch +from transformers import PreTrainedTokenizerFast + +from astraflow.core.workflow.api.cli_args import GenerationHyperparameters +from astraflow.core.workflow.api.engine_api import InferenceEngine +from astraflow.core.workflow.api.io_struct import ModelRequest, ModelResponse +from astraflow.core.workflow.api.reward_api import AsyncRewardWrapper +from astraflow.core.workflow.api.workflow_api import RolloutWorkflow +from astraflow.core.workflow.registry import register_workflow +from astraflow.core.workflow.utils import logging, stats_tracker +from astraflow.core.workflow.utils.data import resolve_prompt_id +from astraflow.core.workflow.utils.dynamic_import import import_from_string +from astraflow.core.workflow.impl.deepdive.env import ( + DEFAULT_PASSAGE_TRUNCATE, + DeepDiveEnv, +) +from astraflow.core.workflow.impl.deepdive.tasks import Task, get_task + +logger = logging.getLogger("DeepDiveRecursive") + + +# --------------------------------------------------------------------------- +# System prompts +# --------------------------------------------------------------------------- + +MAIN_SYSTEM_PROMPT = """You are a research agent answering a factual question using a knowledge corpus. + +You act by emitting EXACTLY ONE action block per turn, in this format: + {JSON args} + +After each action you will receive an observation as the next user message. Use it to decide your next action. + +Available actions: + +- search — Query the knowledge corpus. Returns up to n_docs passages, each with text + source + score. + {"query": "first president of the united states", "n_docs": 5} + +- spawn — Delegate a focused sub-question to a child researcher. Returns the child's final answer string. + {"goal": "find the birth year of the actor who played Robin Hood in Disney's 1973 animated film"} + +- finish — Submit your final answer and end the episode. + {"answer": "George Washington"} + +Strategy: +- ALWAYS call `search` at least once before `finish`. Do NOT answer from memory alone. +- If a search returns nothing useful, REPHRASE the query (different keywords) and try again. +- Cross-check key claims across multiple passages when possible. +- Only `spawn` for clearly independent sub-questions; do not just forward the whole task. +- Keep your final answer concise and direct; semantic accuracy matters, formatting does not. + +Do not output any text outside the ... block. +""" + +SUB_SYSTEM_PROMPT = """You are a sub-research-agent dispatched by a parent agent to answer a focused sub-question. + +You act by emitting EXACTLY ONE action block per turn (same format as the parent): + {JSON args} + +Available actions: + +- search {"query": "...", "n_docs": 5} +- spawn {"goal": "..."} (you MAY recurse; depth-limited) +- finish {"answer": "..."} + +Strategy: +- ALWAYS search at least once before finishing. +- Your `finish` answer is the ONLY thing the parent will see — be concise but complete. +- You have a tight step budget; do not over-search. + +Do not output any text outside the ... block. +""" + + +# --------------------------------------------------------------------------- +# Action parsing (cloned from TextCraft's parse_action) +# --------------------------------------------------------------------------- + +_ACTION_RE = re.compile( + r"\s*(\{.*?\})\s*", + re.DOTALL, +) +_VALID_TYPES = frozenset({"search", "spawn", "finish"}) + + +@dataclass +class ParsedAction: + type: str + args: dict[str, Any] + error: str | None = None + raw_text: str = "" + + +def parse_action(text: str) -> ParsedAction: + """Extract the first {json} block.""" + m = _ACTION_RE.search(text) + if not m: + return ParsedAction( + type="__noaction__", + args={}, + error='no {...} block found in response', + raw_text=text, + ) + action_type = m.group(1) + try: + args = json.loads(m.group(2)) + except json.JSONDecodeError as e: + return ParsedAction( + type=action_type, + args={}, + error=f"action JSON decode failed: {e}", + raw_text=m.group(0), + ) + if not isinstance(args, dict): + return ParsedAction( + type=action_type, + args={}, + error=f"action args must be a JSON object, got {type(args).__name__}", + raw_text=m.group(0), + ) + return ParsedAction(type=action_type, args=args, raw_text=m.group(0)) + + +def validate_action(action: ParsedAction) -> str | None: + """Return None if valid, else an error string the model can learn from.""" + if action.error is not None: + return action.error + if action.type not in _VALID_TYPES: + return f"unknown action type: {action.type!r}; valid: search / spawn / finish" + if action.type == "search": + q = action.args.get("query") + if not isinstance(q, str) or not q.strip(): + return "search: 'query' must be a non-empty string" + n = action.args.get("n_docs", 5) + if not isinstance(n, int) or n < 1 or n > 20: + return "search: 'n_docs' must be an int in [1, 20]" + elif action.type == "spawn": + g = action.args.get("goal") + if not isinstance(g, str) or not g.strip(): + return "spawn: 'goal' must be a non-empty string" + elif action.type == "finish": + # answer can be any JSON-serializable scalar; coerce to string later + if "answer" not in action.args: + return "finish: 'answer' is required" + return None + + +# --------------------------------------------------------------------------- +# Step-budget tracker (shared across the whole trajectory tree) +# --------------------------------------------------------------------------- + + +@dataclass +class BudgetTracker: + total: int + used: int = 0 + reserved: int = 0 + + def remaining(self) -> int: + return max(0, self.total - self.used - self.reserved) + + def consume(self, n: int = 1) -> bool: + if self.remaining() < n: + return False + self.used += n + return True + + def reserve(self, n: int) -> bool: + if self.remaining() < n: + return False + self.reserved += n + return True + + def release(self, n: int) -> None: + self.reserved = max(0, self.reserved - n) + + +# --------------------------------------------------------------------------- +# Per-agent trajectory record +# --------------------------------------------------------------------------- + + +@dataclass +class AgentTrajectory: + traj_id: str + parent_id: str | None + depth: int + task: Task + is_root: bool + turns: list[tuple[list[int], "ModelResponse"]] = field(default_factory=list) + finish_payload: Any = None + finish_message: str = "" + error_message: str | None = None + reward: float = 0.0 + bonus: float = 0.0 + messages: list[dict[str, str]] = field(default_factory=list) + # Judge output captured at evaluate() time — contains "reason" and + # (for sub-agents) the checklist details. Surfaced in rollout dumps + # so we can debug why a reward was 0 vs 1 without re-running the + # judge by hand. + eval_info: dict[str, Any] = field(default_factory=dict) + + +# --------------------------------------------------------------------------- +# Workflow +# --------------------------------------------------------------------------- + + +@register_workflow("deepdive_recursive") +class DeepDiveRecursiveWorkflow(RolloutWorkflow): + """Recursive web-research workflow over the DeepDive Q&A benchmark.""" + + def __init__( + self, + reward_fn: str | Any = None, + tokenizer: PreTrainedTokenizerFast | None = None, + gconfig: GenerationHyperparameters | None = None, + max_depth: int = 4, + max_steps_per_episode: int = 25, + max_concurrent_subagents: int = 4, + delegation_lambda: float = 0.0, + sub_max_steps: int = 15, + passage_truncate: int = DEFAULT_PASSAGE_TRUNCATE, + enable_thinking: bool = False, + rollout_stat_scope: str = "rollout", + dump_dir: str | None = None, + dump_prob: float = 0.0, + **kwargs: Any, + ): + self.reward_fn = reward_fn + self.async_reward_fn: Any = None + if isinstance(reward_fn, str): + try: + self.reward_fn = import_from_string(reward_fn) + self.async_reward_fn = AsyncRewardWrapper(self.reward_fn) + except Exception as e: + logger.warning("could not import reward_fn=%r: %s", reward_fn, e) + self.reward_fn = None + + self.tokenizer = tokenizer + self.gconfig = gconfig + self.max_depth = max_depth + # max_breadth intentionally absent: DeepDive's spawn action is + # one-goal-per-turn (unlike TextCraft's batched spawn), so the + # bound that matters is total budget + max_depth + the + # max_concurrent_subagents semaphore. A per-agent breadth cap is + # not wired up — dropped from config rather than left as dead code. + self.max_steps_per_episode = max_steps_per_episode + self.max_concurrent_subagents = max_concurrent_subagents + self.delegation_lambda = float(delegation_lambda) + self.sub_max_steps = sub_max_steps + self.passage_truncate = passage_truncate + self.enable_thinking = bool(enable_thinking) + self.rollout_stat_scope = rollout_stat_scope + self.dump_dir = dump_dir + self.dump_prob = float(dump_prob) + self.reward_mode: str = str(kwargs.pop("reward_mode", "team_credit")) + if self.reward_mode not in ("team_credit", "per_agent_judge"): + raise ValueError( + f"reward_mode must be 'team_credit' or 'per_agent_judge', " + f"got {self.reward_mode!r}" + ) + self.judge_model = kwargs.pop("judge_model", None) + + # ------------------------------------------------------------------ utils + + def _apply_chat_template(self, messages: list[dict], add_generation_prompt: bool = True) -> list[int]: + if self.tokenizer is None: + raise RuntimeError("DeepDiveRecursiveWorkflow has no tokenizer attached") + kwargs: dict[str, Any] = dict( + add_generation_prompt=add_generation_prompt, + return_tensors=None, + ) + try: + return self.tokenizer.apply_chat_template( + messages, + tokenize=True, + enable_thinking=self.enable_thinking, + **kwargs, + ) + except TypeError: + return self.tokenizer.apply_chat_template(messages, tokenize=True, **kwargs) + + def _build_initial_messages(self, task: Task, is_root: bool) -> list[dict]: + system = MAIN_SYSTEM_PROMPT if is_root else SUB_SYSTEM_PROMPT + if is_root: + user = f"Question: {task.goal}\n" + else: + user = f"Sub-task assigned by parent: {task.goal}\n" + return [ + {"role": "system", "content": system}, + {"role": "user", "content": user}, + ] + + # ------------------------------------------------------------------ episode + + async def _run_episode( + self, + engine: InferenceEngine, + env: DeepDiveEnv, + task: Task, + budget: BudgetTracker, + sem: asyncio.Semaphore, + all_trajs: list[AgentTrajectory], + parent_id: str | None, + depth: int, + is_root: bool, + ) -> AgentTrajectory: + traj_id = uuid.uuid4().hex + traj = AgentTrajectory( + traj_id=traj_id, parent_id=parent_id, depth=depth, task=task, is_root=is_root, + ) + all_trajs.append(traj) + + messages = self._build_initial_messages(task, is_root) + steps_taken = 0 + max_local_steps = ( + task.max_steps if task.max_steps is not None + else (self.max_steps_per_episode if is_root else self.sub_max_steps) + ) + + while not env.finished and steps_taken < max_local_steps: + if not budget.consume(1): + traj.error_message = ( + f"[budget exhausted at local step {steps_taken}; " + f"total {budget.used}/{budget.total}]" + ) + break + + input_ids = self._apply_chat_template(messages, add_generation_prompt=True) + resp = await engine.agenerate( + ModelRequest( + rid=uuid.uuid4().hex, + input_ids=input_ids, + gconfig=self.gconfig.new(n_samples=1), + tokenizer=self.tokenizer, + ) + ) + traj.turns.append((input_ids, resp)) + response_text = self.tokenizer.decode(resp.output_tokens) + + parsed = parse_action(response_text) + err = validate_action(parsed) + messages.append({"role": "assistant", "content": response_text}) + + if err is not None: + obs = f"ERROR: {err}. Reminder: emit ONE {{...}} block per turn." + stats_tracker.get(self.rollout_stat_scope).scalar(parse_errors=1) + messages.append({"role": "user", "content": obs}) + steps_taken += 1 + continue + + # Dispatch to env action. + if parsed.type == "search": + obs = await env.search( + query=parsed.args["query"], + n_docs=int(parsed.args.get("n_docs", 5)), + ) + elif parsed.type == "spawn": + obs = await env.spawn(goal=parsed.args["goal"]) + elif parsed.type == "finish": + env.finish(parsed.args["answer"]) + traj.finish_payload = env.finish_payload + traj.finish_message = "" if env.finish_payload is None else str(env.finish_payload) + score, info = await env.evaluate() + traj.reward = float(score) + traj.eval_info = info # B3: preserve judge reason for dumps + steps_taken += 1 + break + else: + obs = f"ERROR: unhandled action type {parsed.type!r}" + + messages.append({"role": "user", "content": obs}) + steps_taken += 1 + + traj.messages = messages + return traj + + # ------------------------------------------------------------------ spawn + + def _make_spawn_callback( + self, + engine: InferenceEngine, + budget: BudgetTracker, + sem: asyncio.Semaphore, + all_trajs: list[AgentTrajectory], + parent_id: str, + parent_depth: int, + ): + """Async fn the env's spawn() action calls. Single-goal per call.""" + async def _launch(goal: str) -> str: + if parent_depth >= self.max_depth: + return f"ERROR: max recursion depth ({self.max_depth}) reached; cannot spawn" + child_task = Task( + goal=str(goal), + id=f"{parent_id}/sub_{uuid.uuid4().hex[:8]}", + max_steps=self.sub_max_steps, + misc={}, + ) + child_env = DeepDiveEnv( + task=child_task, + spawn_callback=self._make_spawn_callback( + engine, budget, sem, all_trajs, child_task.id, parent_depth + 1 + ), + passage_truncate=self.passage_truncate, + judge_model=self.judge_model, + ) + async with sem: + child_traj = await self._run_episode( + engine=engine, + env=child_env, + task=child_task, + budget=budget, + sem=sem, + all_trajs=all_trajs, + parent_id=parent_id, + depth=parent_depth + 1, + is_root=False, + ) + return child_traj.finish_message or (child_traj.error_message or "") + + return _launch + + # ------------------------------------------------------------------ reward + + def _apply_delegation_bonus(self, all_trajs: list[AgentTrajectory]) -> None: + if self.delegation_lambda <= 0: + return + children: dict[str, list[AgentTrajectory]] = {} + for t in all_trajs: + if t.parent_id is not None: + children.setdefault(t.parent_id, []).append(t) + for t in all_trajs: + kids = children.get(t.traj_id, []) + if not kids: + continue + mean_child_success = sum(k.reward for k in kids) / len(kids) + bonus = self.delegation_lambda * mean_child_success + t.bonus = bonus + t.reward = t.reward + bonus + + # --------------------------------------------------------- sequence packing + + def _build_sequences_for_agent(self, ag: AgentTrajectory, reward: float) -> list[dict[str, torch.Tensor]]: + out: list[dict[str, torch.Tensor]] = [] + for input_ids, resp in ag.turns: + seq_ids = list(input_ids) + list(resp.output_tokens) + seq_mask = [0] * len(input_ids) + [1] * len(resp.output_tokens) + seq_logprobs = [0.0] * len(input_ids) + list(resp.output_logprobs) + seq_versions = [-1] * len(input_ids) + list(resp.output_versions) + n = len(seq_ids) + seq = { + "input_ids": torch.tensor(seq_ids, dtype=torch.int32), + "loss_mask": torch.tensor(seq_mask, dtype=torch.int32), + "logprobs": torch.tensor(seq_logprobs, dtype=torch.float32), + "versions": torch.tensor(seq_versions, dtype=torch.int32), + "attention_mask": torch.ones(n, dtype=torch.bool), + "rewards": torch.tensor(reward, dtype=torch.float32), + } + out.append({k: v.unsqueeze(0) for k, v in seq.items()}) + return out + + # ------------------------------------------------------------------ entry + + async def _run_one_rollout( + self, + engine: InferenceEngine, + data: dict[str, Any], + rollout_idx: int, + ) -> dict[str, Any]: + task = self._task_from_data(data) + budget = BudgetTracker(total=task.max_steps or self.max_steps_per_episode) + sem = asyncio.Semaphore(self.max_concurrent_subagents) + all_trajs: list[AgentTrajectory] = [] + + root_id = task.id + env = DeepDiveEnv( + task=task, + spawn_callback=self._make_spawn_callback( + engine, budget, sem, all_trajs, root_id, parent_depth=0 + ), + passage_truncate=self.passage_truncate, + judge_model=self.judge_model, + ) + + await self._run_episode( + engine=engine, env=env, task=task, budget=budget, sem=sem, + all_trajs=all_trajs, parent_id=None, depth=0, is_root=True, + ) + + self._apply_delegation_bonus(all_trajs) + + root_traj = all_trajs[0] if all_trajs else None + root_reward = float(root_traj.reward) if root_traj else 0.0 + + per_agent: list[dict[str, Any]] = [] + for ag in all_trajs: + if not ag.turns: + continue + agent_reward = self._reward_for_agent(ag, root_reward) + seqs = self._build_sequences_for_agent(ag, agent_reward) + per_agent.append({ + "reward": agent_reward, + "sequences": seqs, + "depth": ag.depth, + "is_root": ag.is_root, + }) + + return { + "per_agent": per_agent, + "all_trajs": all_trajs, + "task": task, + "root_reward": root_reward, + "n_agents": len(all_trajs), + "subagent_launched": int(env.subagent_launched), + "subagent_succeeded": float(env.subagent_succeeded), + "search_calls": int(env.search_calls), + } + + def _reward_for_agent(self, ag: AgentTrajectory, root_reward: float) -> float: + if self.reward_mode == "team_credit": + return root_reward + if ag.reward is None: + return 0.0 + return float(ag.reward) + + async def arun_episode( + self, engine: InferenceEngine, data: dict[str, Any] + ) -> dict[str, Any]: + n_samples = max(1, int(self.gconfig.n_samples)) + + rollouts = await asyncio.gather(*[ + self._run_one_rollout(engine, data, i) for i in range(n_samples) + ]) + + root_rewards = [r["root_reward"] for r in rollouts] + n_agents_list = [r["n_agents"] for r in rollouts] + launched_total = sum(r["subagent_launched"] for r in rollouts) + search_total = sum(r["search_calls"] for r in rollouts) + + for rw in root_rewards: + stats_tracker.get(self.rollout_stat_scope).scalar(reward=rw) + stats_tracker.get(self.rollout_stat_scope).scalar(env_score=rw) + for na in n_agents_list: + stats_tracker.get(self.rollout_stat_scope).scalar(n_agents=na) + if launched_total > 0: + stats_tracker.get(self.rollout_stat_scope).scalar( + subagent_launched_per_rollout=launched_total / max(1, len(rollouts)), + ) + if search_total > 0: + stats_tracker.get(self.rollout_stat_scope).scalar( + search_calls_per_rollout=search_total / max(1, len(rollouts)), + ) + + if self.dump_dir is not None and self.dump_prob > 0 and random.random() < self.dump_prob: + try: + await self._dump_trajectory(rollouts[0], data) + except Exception as e: + logger.warning("dump_trajectory failed: %s", e) + + # Compute sample-weighted group mean over the n_samples ROOT rewards + # (one value per sample, not per sequence) — fixes the sequence-count + # weighting bias the producer would otherwise introduce. + # + # We stamp std = 1.0 to match platoon's mean-only centering at the + # group level. The trainer's reward_norm formula is + # (reward - g_mean) / (g_std + eps) + # with g_std=1.0 this reduces to mean-centering only — equivalent to + # platoon's `train_data["rewards"] -= mean(task_reward)`. We could + # also achieve this by changing reward_norm config to std_level=None, + # but stamping std=1.0 keeps the trainer math centralized and lets + # us flip back to std-normalization without touching the config. + if len(root_rewards) >= 2: + root_rewards_t = torch.tensor(root_rewards, dtype=torch.float32) + g_mean = float(root_rewards_t.mean().item()) + elif len(root_rewards) == 1: + g_mean = float(root_rewards[0]) + else: + g_mean = 0.0 + g_std = 1.0 # disabled — match platoon's mean-only centering + + trajectories: list[dict[str, Any]] = [] + rewards_kept: list[float] = [] + for r in rollouts: + for pa in r["per_agent"]: + if not pa["sequences"]: + continue + for seq in pa["sequences"]: + seq["group_reward_mean"] = torch.tensor([g_mean]) + seq["group_reward_std"] = torch.tensor([g_std]) + trajectories.append({"sequences": pa["sequences"]}) + rewards_kept.append(pa["reward"]) + + prompt_id = resolve_prompt_id(data) or (rollouts[0]["task"].id if rollouts else None) + + if not trajectories: + return { + "n_trajs": 0, + "rewards": torch.tensor([], dtype=torch.float32), + "trajectories": [], + "prompt_id": prompt_id, + } + return { + "n_trajs": len(trajectories), + "rewards": torch.tensor(rewards_kept, dtype=torch.float32), + "trajectories": trajectories, + "prompt_id": prompt_id, + } + + # ------------------------------------------------------------------ helpers + + def _task_from_data(self, data: dict[str, Any]) -> Task: + if "task_id" in data: + return get_task(data["task_id"]) + return Task( + goal=str(data.get("question") or data.get("goal") or ""), + id=str(data.get("id") or data.get("query_id") or uuid.uuid4().hex), + max_steps=int(data.get("max_steps", self.max_steps_per_episode)), + misc=dict(data), + ) + + async def _dump_trajectory(self, rollout: dict[str, Any], data: dict[str, Any]) -> None: + if self.dump_dir is None: + return + await aiofiles.os.makedirs(self.dump_dir, exist_ok=True) + task = rollout["task"] + sub = "0" + try: + v = rollout["all_trajs"][0].turns[0][1].output_versions[0] + sub = str(int(v)) + except Exception: + pass + out_dir = f"{self.dump_dir}/{sub}" + await aiofiles.os.makedirs(out_dir, exist_ok=True) + out_path = f"{out_dir}/deepdive-{abs(hash(task.id)) % 100_000_000:08d}.txt" + async with aiofiles.open(out_path, "w") as f: + await f.write( + f"=== Episode reward={rollout['root_reward']:.3f} " + f"n_agents={rollout['n_agents']} " + f"searches={rollout['search_calls']} ===\n\n" + ) + for ag in rollout["all_trajs"]: + tag = "ROOT" if ag.is_root else f"SUB depth={ag.depth}" + await f.write( + f"--- {tag} traj_id={ag.traj_id} task='{ag.task.goal[:120]}' " + f"per_agent_reward={ag.reward:.3f} bonus={ag.bonus:.3f} steps={len(ag.turns)} ---\n" + ) + if ag.error_message: + await f.write(f" (error: {ag.error_message})\n") + if ag.finish_message: + await f.write(f" finish_message: {ag.finish_message[:400]}\n") + # B3: surface judge reasoning so dumps explain WHY a reward + # was 0 vs 1 without needing to re-run the judge. + if ag.eval_info: + reason = str(ag.eval_info.get("reason", ""))[:600] + if reason: + await f.write(f" judge_reason: {reason}\n") + if ag.messages: + for j, msg in enumerate(ag.messages): + body = msg["content"] + if len(body) > 2000: + body = body[:2000] + f"\n[...truncated, total {len(msg['content'])} chars...]" + await f.write(f" [{j}] {msg['role']}:\n {body}\n") + await f.write("\n") diff --git a/astraflow/core/workflow/reward/deepdive_success.py b/astraflow/core/workflow/reward/deepdive_success.py new file mode 100644 index 0000000..eba065e --- /dev/null +++ b/astraflow/core/workflow/reward/deepdive_success.py @@ -0,0 +1,23 @@ +"""DeepDive reward function (API-parity stub). + +The deepdive_recursive workflow computes its own reward via the LLM judge +in `impl/deepdive/env.py:evaluate()`. This module exists so a yaml +`reward_fn: deepdive_success` resolves to *something* — the workflow +won't actually call it. +""" + +from typing import Any + +from astraflow.core.workflow.registry import register_reward + + +@register_reward("deepdive_success") +def deepdive_success_reward_fn( + prompt: str, + completions: str, + prompt_ids: list[int], + completion_ids: list[int], + **kwargs: Any, +) -> float: + """Stub reward — deepdive_recursive does not call this. Returns 0.0 if invoked.""" + return 0.0 diff --git a/astraflow/dataflow/dataset/deepdive.py b/astraflow/dataflow/dataset/deepdive.py new file mode 100644 index 0000000..b3a9df8 --- /dev/null +++ b/astraflow/dataflow/dataset/deepdive.py @@ -0,0 +1,76 @@ +"""DeepDive dataset loaders for the deepdive_recursive workflow. + +Each row references one DeepDive task by `task_id`; the workflow re-loads +the full Task (question + ground_truth) via `get_task` on demand. +""" + +from __future__ import annotations + +from logging import getLogger + +from datasets import Dataset + +from astraflow.core.workflow.impl.deepdive.tasks import ( + Task, + get_task, + get_task_ids, +) +from astraflow.dataflow.dataset.utils import attach_query_ids + +logger = getLogger(__name__) + + +def _row_for_task_id(task_id: str) -> dict: + task = get_task(task_id) + user = f"Question: {task.goal}" + return { + "task_id": task.id, + "messages": [{"role": "user", "content": user}], + "answer": task.id, + } + + +def get_deepdive_rl_dataset( + tokenizer=None, + max_length: int | None = None, + split: str = "qa_rl", + num_tasks: int | None = None, + seed: int = 42, + dataset_name: str = "deepdive", +) -> Dataset: + """HF Dataset of DeepDive tasks for RL training (default split: qa_rl).""" + task_ids = get_task_ids(split=split) + if num_tasks is not None: + task_ids = task_ids[:num_tasks] + rows = [_row_for_task_id(tid) for tid in task_ids] + ds = Dataset.from_list(rows) + ds = attach_query_ids(ds, dataset_name) + if max_length is not None and tokenizer is not None: + def short_enough(sample): + content = sample["messages"][0]["content"] + return len(tokenizer.encode(content)) <= max_length + ds = ds.filter(short_enough) + return ds + + +def get_deepdive_eval_dataset( + tokenizer=None, + max_length: int | None = None, + split: str = "qa_sft", + num_val: int | None = 100, + seed: int = 42, + dataset_name: str = "deepdive_val", +) -> Dataset: + """HF Dataset of DeepDive tasks for eval (default split: qa_sft).""" + task_ids = get_task_ids(split=split) + if num_val is not None: + task_ids = task_ids[:num_val] + rows = [_row_for_task_id(tid) for tid in task_ids] + ds = Dataset.from_list(rows) + ds = attach_query_ids(ds, dataset_name) + if max_length is not None and tokenizer is not None: + def short_enough(sample): + content = sample["messages"][0]["content"] + return len(tokenizer.encode(content)) <= max_length + ds = ds.filter(short_enough) + return ds diff --git a/examples/deepdive/qwen3-4b-recursive/scripts/1_astraflow.sh b/examples/deepdive/qwen3-4b-recursive/scripts/1_astraflow.sh new file mode 100755 index 0000000..cf7df94 --- /dev/null +++ b/examples/deepdive/qwen3-4b-recursive/scripts/1_astraflow.sh @@ -0,0 +1,36 @@ +#!/bin/bash +set -euo pipefail +# [1/3] Launch AstraFlow HTTP service +# +# Usage (terminal 1): +# bash examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh + +export CUDA_VISIBLE_DEVICES="" + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== AstraFlow HTTP Service ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "Port : ${ASTRAFLOW_PORT}" +echo "===============================" + +python3 -u -m astraflow \ + --config "${EXPERIMENT_CONFIG}" \ + --port "${ASTRAFLOW_PORT}" \ + --host "${ASTRAFLOW_HOST}" \ + 2>&1 | tee "${LOG_DIR}/astraflow.log" diff --git a/examples/deepdive/qwen3-4b-recursive/scripts/2_raas.sh b/examples/deepdive/qwen3-4b-recursive/scripts/2_raas.sh new file mode 100755 index 0000000..5d88b2b --- /dev/null +++ b/examples/deepdive/qwen3-4b-recursive/scripts/2_raas.sh @@ -0,0 +1,44 @@ +#!/bin/bash +set -euo pipefail +# [2/3] Launch RaaS inference server (SGLang + TCP receiver) +# +# Usage (terminal 2, after AstraFlow is ready): +# bash examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" +export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="${ASTRAFLOW_URL:-http://127.0.0.1:${ASTRAFLOW_PORT}}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== RaaS Inference Server (SGLang + TCP receiver) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "RaaS config : ${RAAS_CONFIG}" +echo "GPUs : ${CUDA_VISIBLE_DEVICES}" +echo "Port : ${RAAS_PORT}" +echo "AstraFlow URL : ${ASTRAFLOW_URL}" +echo "=======================================================" + +python3 -u -m astraflow.raas.server \ + --host "${RAAS_HOST}" \ + --port "${RAAS_PORT}" \ + --config "${EXPERIMENT_CONFIG}" \ + --config "${RAAS_CONFIG}" \ + --engine-id "${ENGINE_ID:-default}" \ + --astraflow-url "${ASTRAFLOW_URL}" \ + 2>&1 | tee "${LOG_DIR}/raas.log" diff --git a/examples/deepdive/qwen3-4b-recursive/scripts/3_trainer_model0.sh b/examples/deepdive/qwen3-4b-recursive/scripts/3_trainer_model0.sh new file mode 100755 index 0000000..cb8e850 --- /dev/null +++ b/examples/deepdive/qwen3-4b-recursive/scripts/3_trainer_model0.sh @@ -0,0 +1,47 @@ +#!/bin/bash +set -euo pipefail +# [3/3] Launch Trainer for model0 (TCP, sender_agent on local_rank 0) +# +# Usage (terminal 3, after AstraFlow and RaaS are ready): +# bash examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS:-4,5,6,7}" +TRAINER0_NPROC="$(echo "${CUDA_VISIBLE_DEVICES}" | awk -F',' '{print NF}')" + +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" +export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" + +# sender_agent (in trainer) listens on this HTTP port +export WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== Trainer model0 (TCP) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "GPUs : ${CUDA_VISIBLE_DEVICES} (FSDP dp${TRAINER0_NPROC})" +echo "AstraFlow : ${ASTRAFLOW_URL}" +echo "RaaS : ${ASTRAFLOW_RAAS_URL}" +echo "Sender HTTP : ${WEIGHT_TRANSFER_HTTP_PORT}" +echo "WANDB mode : ${WANDB_MODE:-online}" +echo "==========================================" + +torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ + --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ + examples/launch_trainer.py \ + --config "${EXPERIMENT_CONFIG}" \ + --trainer trainer_model0 \ + "$@" 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/deepdive/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh b/examples/deepdive/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh new file mode 100755 index 0000000..a927522 --- /dev/null +++ b/examples/deepdive/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh @@ -0,0 +1,132 @@ +#!/bin/bash +set -euo pipefail +# All-in-one launcher for AstraFlow training with the DEEPDIVE RECURSIVE-AGENT +# workflow (Qwen3-4B-Instruct-2507, M2PO, platoon port). +# +# Workflow: deepdive_recursive. Agent emits one +# ...... per turn. Python sandbox +# exposes async tools: search_web (CMU RAG), launch_subagent, finish. +# Reward: LLM judge for root (vs ground_truth) and for sub-agents. +# +# DeepDive task data auto-downloaded from HF (zai-org/DeepDive) on first +# run; cache lands at astraflow/core/workflow/impl/deepdive/deepdive_*.jsonl. +# +# External services required: +# - Fireworks API: ~/.fireworks_key (FIREWORKS_API_KEY for LLM judge) +# - CMU RAG search: ~/.cmu_search_key (CMU_SEARCH_API_KEY for search_web) +# +# Launches 3 processes: +# 1. AstraFlow HTTP service (CPU-only) +# 2. RaaS inference server (SGLang, SERVICE_CUDA_VISIBLE_DEVICES) +# 3. Trainer model0 (FSDP, TRAINER_MODEL0_GPUS) +# +# Usage: +# bash examples/deepdive/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh + +# ============================================================================= +# Part 1: Load env and settings +# ============================================================================= +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +# Defined in examples/_common/utils.sh. +astraflow_load_experiment_env + +# Source API keys for the LLM judge and the CMU RAG search. Both files are +# gitignored locally (~/.fireworks_key, ~/.cmu_search_key). The trainer needs +# both visible in its env; we export them with `set -a` so child processes +# inherit them. +set -a +[[ -f "${HOME}/.fireworks_key" ]] && source "${HOME}/.fireworks_key" +[[ -f "${HOME}/.cmu_search_key" ]] && source "${HOME}/.cmu_search_key" +set +a +if [[ -z "${FIREWORKS_API_KEY:-}" ]]; then + echo "WARNING: FIREWORKS_API_KEY not set — LLM judge calls will fail" >&2 +fi +if [[ -z "${CMU_SEARCH_API_KEY:-}" ]]; then + echo "WARNING: CMU_SEARCH_API_KEY not set — search_web calls will fail" >&2 +fi + +# ============================================================================= +# Part 2: Set up env +# ============================================================================= +# GPU assignments (default: 4 GPUs for inference, 4 for training) +export SERVICE_CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" +export TRAINER_MODEL0_GPUS="${TRAINER_MODEL0_GPUS:-4,5,6,7}" +# Ports / URLs (each component gets its own port) +export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" +export WEIGHT_TRANSFER_HTTP_PORT_MODEL0="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" + +TRAINER0_NPROC="$(echo "${TRAINER_MODEL0_GPUS}" | awk -F',' '{print NF}')" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. +# Defined in examples/_common/utils.sh. +astraflow_setup_env + +# ============================================================================= +# Part 3: Print info and clean up +# ============================================================================= +echo "=== AstraFlow (Qwen3-4B, DeepDive, M2PO, ctx40k, TCP, RECURSIVE AGENT) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "RaaS config : ${RAAS_CONFIG}" +echo "RaaS GPUs : ${SERVICE_CUDA_VISIBLE_DEVICES}" +echo "Trainer model0 GPUs : ${TRAINER_MODEL0_GPUS} (FSDP dp${TRAINER0_NPROC})" +echo "RaaS port : ${RAAS_PORT}" +echo "AstraFlow port : ${ASTRAFLOW_PORT}" +echo "Sender HTTP model0 : ${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" +echo "WANDB mode : ${WANDB_MODE:-online}" +echo "==========================================================" + +trap astraflow_cleanup_trap EXIT INT TERM + +# Kill leftover processes and shared memory from prior runs. +# Defined in examples/_common/utils.sh. +astraflow_kill_stale + +# ============================================================================= +# Part 4: Launch training +# ============================================================================= +echo "[1/3] Starting AstraFlow HTTP service..." +CUDA_VISIBLE_DEVICES="" \ + python3 -u -m astraflow \ + --config "${EXPERIMENT_CONFIG}" \ + --port "${ASTRAFLOW_PORT}" \ + --host "${ASTRAFLOW_HOST}" \ + 2>&1 | tee "${LOG_DIR}/astraflow.log" & +sleep 5 + +echo "[2/3] Starting RaaS inference server (SGLang + TCP receiver)..." +CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES}" \ + python3 -u -m astraflow.raas.server \ + --host "${RAAS_HOST}" \ + --port "${RAAS_PORT}" \ + --config "${EXPERIMENT_CONFIG}" \ + --config "${RAAS_CONFIG}" \ + --engine-id "${ENGINE_ID:-default}" \ + --astraflow-url "${ASTRAFLOW_URL}" \ + 2>&1 | tee "${LOG_DIR}/raas.log" & +sleep 15 + +export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" + +echo "[3/3] Starting trainer model0..." +CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS}" \ +WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" \ + torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ + --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ + examples/launch_trainer.py \ + --config "${EXPERIMENT_CONFIG}" \ + --trainer trainer_model0 \ + "$@" \ + 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/deepdive/qwen3-4b-recursive/yaml/experiment.yaml b/examples/deepdive/qwen3-4b-recursive/yaml/experiment.yaml new file mode 100644 index 0000000..7198af4 --- /dev/null +++ b/examples/deepdive/qwen3-4b-recursive/yaml/experiment.yaml @@ -0,0 +1,170 @@ +# ============================================================================ +# Experiment config — AstraFlow service + Trainer (DEEPDIVE RECURSIVE AGENT) +# Experiment: deepdive / qwen3-4b-recursive +# +# Port of platoon's DeepDive RL recipe (see configs/areal/deepdive_areal.yaml): +# - workflow_cls: deepdive_recursive +# - Python-sandbox env (exec() namespace per agent), NO pre-loaded context +# - Tools: search_web(query, n_docs) via CMU RAG, launch_subagent(goal), +# finish(answer), asyncio +# - ...... action format +# - Reward: LLM judge for root (vs ground_truth) AND for sub-agents (vs goal) +# -- DeepDive has no rule-based grader, judge is always required +# - delegation_lambda = 0.0 (matches platoon's _DEEPDIVE_DELEGATION_REWARD_CAP) +# +# Model: Qwen3-4B-Instruct-2507 (same as Oolong/TextCraft; platoon uses same) +# +# GPU layout (8 GPUs): +# SERVICE_CUDA_VISIBLE_DEVICES=0,1,2,3 -> RaaS (model0 dp=4) +# TRAINER_MODEL0_GPUS=4,5,6,7 -> Trainer (FSDP, 4 GPUs) +# +# External services required at launch: +# - FIREWORKS_API_KEY for astraEnv.judge (~/.fireworks_key) +# - CMU_SEARCH_API_KEY for astraEnv.search (~/.cmu_search_key) +# ============================================================================ + +experiment: + experiment_name: astraflow-deepdive + trial_name: qwen3-4b-deepdive-recursive + fileroot: ./data-experiments/${experiment.experiment_name}/${experiment.trial_name} + + model_path: "Qwen/Qwen3-4B-Instruct-2507" + tokenizer_path: "Qwen/Qwen3-4B-Instruct-2507" + seed: 1 + dtype: bfloat16 + weight_transfer_mode: tcp + weight_transfer_strategies: full + +raas: + models: + model0: + backend: sglang + gconfig: + n_samples: 8 + temperature: 1.0 + max_new_tokens: 8192 # platoon default for DeepDive — research needs long replies + min_new_tokens: 0 + +dataflow: + host: "0.0.0.0" + port: 8000 + + dump_dir: "./data-experiments/${experiment.experiment_name}/${experiment.trial_name}/rollout_dumps" + + buffer: + size: 10000 + replay_size: 10000 + replay_ratio: 0 + max_staleness: 8 + # filter_zero_adv: drop prompt groups where all 8 samples got identical + # rewards (= zero group variance = zero gradient signal). Matches + # platoon's filter_zero_variance_groups: True default. Required when + # the root rubric is binary (success bool → 0/1) since many groups + # naturally come out all-0 or all-1 for a base model on a hard task. + filter_function: filter_zero_adv + + rollout_dataset: + dataset_fn: "astraflow.dataflow.dataset.deepdive:get_deepdive_rl_dataset" + split: qa_rl # platoon: train_split + num_tasks: null # platoon: train_num_tasks=null (use all) + + workflow_spec: + workflow_cls: "deepdive_recursive" + reward_fn: "deepdive_success" + # Reward mode — selects which credit-assignment scheme to use: + # team_credit: all agents train on root's LLM-judged reward (cheap). + # per_agent_judge: each agent trains on its own LLM-judged reward + # (more judge calls; closer to "true" per-agent credit). + # Default matches platoon's behavior (delegation_cap=0 → effectively + # team_credit). Switch to per_agent_judge for the LLM-judge-everywhere + # experiment if team_credit doesn't move accuracy. + reward_mode: team_credit + max_depth: 4 # platoon: DepthAwareStepBudgetTracker(max_depth=4) + max_steps_per_episode: 25 # platoon: max_steps=25 + sub_max_steps: 15 + max_concurrent_subagents: 4 # conservative; bump if RaaS queue stays low + delegation_lambda: 0.0 # platoon: _DEEPDIVE_DELEGATION_REWARD_CAP=0.0 + stdout_truncate: 8000 + enable_thinking: false + dump_prob: 0.05 # ~13 dumps/step at bs=256 — enough for periodic inspection + + eval_workflows: + deepdive_eval: + workflow_cls: "deepdive_recursive" + reward_fn: "deepdive_success" + reward_mode: team_credit + max_depth: 4 + max_steps_per_episode: 25 + sub_max_steps: 15 + delegation_lambda: 0.0 + stdout_truncate: 8000 + enable_thinking: false + dump_prob: 0.05 + gconfig_overrides: + n_samples: 1 + temperature: 0.6 + + eval_datasets: + deepdive_val: + dataset_fn: "astraflow.dataflow.dataset.deepdive:get_deepdive_eval_dataset" + split: qa_sft # platoon: eval_split + num_val: 100 # platoon: eval_num_tasks=100 + repeat: 1 + eval_workflow: deepdive_eval + +trainer_base: + total_train_steps: 500 # v4 action format stable; train at scale for 500 iters + train_batch_size: 256 # bumped back from v2's diagnostic bs=64 + n_samples: 8 + engine: + backend: fsdp + data_parallel_size: 4 + + actor: + gradient_checkpointing: true + mb_spec: + max_tokens_per_mb: 40000 # match context_length=40001 (platoon uses 40000) + optimizer: + type: adam + lr: 3e-6 # platoon's lr + weight_decay: 0.0 + beta1: 0.9 + beta2: 0.95 + eps: 1e-8 + lr_scheduler_type: constant + gradient_clipping: 1.0 + # M2PO (we keep our loss; platoon uses CISPO) + m2_threshold: 0.01 + eps_clip: 100.0 + eps_clip_higher: 100.0 + reward_scaling: 1 + reward_bias: 0 + kl_ctl: 0.00 + kl_penalty_coef: 0.001 + ppo_n_minibatches: 4 + reward_norm: { mean_level: group, std_level: group } + adv_norm: { mean_level: batch, std_level: batch } + + ref: + path: "Qwen/Qwen3-4B-Instruct-2507" + mb_spec: + max_tokens_per_mb: 40000 + + recover: + mode: auto + freq_steps: 25 + + evaluator: + eval_at_start: false # skip v0 eval per [[eval-at-start-default-false]] + freq_steps: 20 + + stats_logger: + wandb: + mode: online + id_suffix: "uid" + +trainer_model0: + model_id: model0 + stats_logger: + wandb: + tags: ["deepdive", "recursive-agent", "qwen3-4b", "m2po", "llm-judge"] diff --git a/examples/deepdive/qwen3-4b-recursive/yaml/raas.yaml b/examples/deepdive/qwen3-4b-recursive/yaml/raas.yaml new file mode 100644 index 0000000..3841921 --- /dev/null +++ b/examples/deepdive/qwen3-4b-recursive/yaml/raas.yaml @@ -0,0 +1,30 @@ +# ============================================================================ +# RaaS config — Inference serving instance (hardware/resources) +# Experiment: deepdive / qwen3-4b-recursive +# +# Hardware: 4x GPU, TP=1; model0 DP=4 +# Merged with experiment.yaml at launch (--config experiment.yaml --config raas.yaml) +# ============================================================================ + +rollout: + max_concurrent_rollouts: 1024 + max_concurrent_evals: 64 + pause_grace_period: 3 + enable_adaptive_availability: true + target_waiting_queue_per_dp: 4 + adaptive_step_size: 4 + load_cache_ttl_ms: 100 + +engine: + model0: + backend: sglang + data_parallel_size: 4 + +sglang: + # 40K context — matches platoon's DeepDive recipe (context_length: 40001). + # DeepDive rollouts can be long: many search calls + observations + the + # agent's own reasoning. 32K was insufficient in platoon's experience. + context_length: 40001 + mem_fraction_static: 0.8 # platoon's default + max_running_requests: null + skip_tokenizer_init: true From 42481f325e6720642a3669d314c300aa9e83be9c Mon Sep 17 00:00:00 2001 From: Haizhong Date: Thu, 28 May 2026 00:29:02 -0400 Subject: [PATCH 19/35] feat: implement oolong-real D&D grader + fix sub-agent reward routing - dnd_process_response: type-aware rule-based scoring ported faithfully from platoon. int->int uses 0.75^|gap| partial credit; str->str is exact-match after strip().lower(); list->list is Jaccard overlap. \boxed{...} extraction with parse_confidence label. - Fix env.py routing: sub-agent task ids inherit the parent's dataset prefix and were incorrectly hitting the rule-based grader. Now any id containing "/sub_" routes to the LLM judge regardless of prefix. - Add qwen3-4b-recursive-real recipe targeting the D&D split. --- astraflow/core/workflow/impl/oolong/env.py | 8 +- .../core/workflow/impl/oolong/eval_helpers.py | 75 +++++++- .../workflow/impl/oolong/test_eval_helpers.py | 164 ++++++++++++++++ .../scripts/1_astraflow.sh | 36 ++++ .../qwen3-4b-recursive-real/scripts/2_raas.sh | 44 +++++ .../scripts/3_trainer_model0.sh | 47 +++++ .../scripts/run_qwen3-4b-recursive.sh | 116 +++++++++++ .../yaml/experiment.yaml | 180 ++++++++++++++++++ .../qwen3-4b-recursive-real/yaml/raas.yaml | 30 +++ 9 files changed, 691 insertions(+), 9 deletions(-) create mode 100644 astraflow/core/workflow/impl/oolong/test_eval_helpers.py create mode 100755 examples/oolong/qwen3-4b-recursive-real/scripts/1_astraflow.sh create mode 100755 examples/oolong/qwen3-4b-recursive-real/scripts/2_raas.sh create mode 100755 examples/oolong/qwen3-4b-recursive-real/scripts/3_trainer_model0.sh create mode 100755 examples/oolong/qwen3-4b-recursive-real/scripts/run_qwen3-4b-recursive.sh create mode 100644 examples/oolong/qwen3-4b-recursive-real/yaml/experiment.yaml create mode 100644 examples/oolong/qwen3-4b-recursive-real/yaml/raas.yaml diff --git a/astraflow/core/workflow/impl/oolong/env.py b/astraflow/core/workflow/impl/oolong/env.py index 079e3e2..6af8ca0 100644 --- a/astraflow/core/workflow/impl/oolong/env.py +++ b/astraflow/core/workflow/impl/oolong/env.py @@ -199,9 +199,13 @@ async def evaluate(self) -> tuple[float, dict[str, Any]]: task_id = self.task.id or "" output = "" if self.finish_payload is None else str(self.finish_payload) - if task_id.startswith("oolong.synth."): + # Sub-agent task IDs inherit the parent's prefix and have a "/sub_" + # marker (assigned in workflow._make_spawn_callback). Route them to + # the LLM-judge path regardless of the dataset prefix. + is_subagent = "/sub_" in task_id + if not is_subagent and task_id.startswith("oolong.synth."): r = synth_process_response(self.task.misc, output) - elif task_id.startswith("oolong.real."): + elif not is_subagent and task_id.startswith("oolong.real."): r = dnd_process_response(self.task.misc, output) elif self.use_llm_judge: r = await self._grade_subagent_with_llm(output) diff --git a/astraflow/core/workflow/impl/oolong/eval_helpers.py b/astraflow/core/workflow/impl/oolong/eval_helpers.py index 98271e7..7c3c18e 100644 --- a/astraflow/core/workflow/impl/oolong/eval_helpers.py +++ b/astraflow/core/workflow/impl/oolong/eval_helpers.py @@ -114,13 +114,74 @@ def synth_process_response(datapoint: dict[str, Any], output: str) -> dict[str, } -# Placeholder for oolong-real (D&D) — would need an LLM judge. -# We define the function so the workflow can dispatch on dataset name, -# but it always returns score=0 for now. Wire up GPT-5-mini-style judge -# in a follow-up when we add `oolong-real` support. +# -------------------------------------------------------------------------- +# oolong-real (D&D) grader — rule-based, ported faithfully from platoon's +# `dnd_process_response` (plugins/oolong/platoon/oolong/eval_helpers.py). +# +# Contrary to what one might expect, oolong-real does NOT use an LLM judge: +# the dataset's gold answers are typed (int / str / list[str]) and admit +# rule-based scoring with partial credit. The model is expected to wrap its +# final answer in \boxed{...} (math-style); if missing we fall back to the +# raw output with lower parse_confidence. +# -------------------------------------------------------------------------- + + +def dnd_parse_answer(answer: str) -> int | str | list[str]: + """Coerce a string into int / str / list[str] based on content shape.""" + try: + return int(answer) + except ValueError: + pass + if "," in answer: + return [item.strip() for item in answer.split(",") if item.strip()] + return answer + + +def dnd_parse_response(answer: str) -> tuple[int | str | list[str], str]: + """Extract the candidate answer + parse_confidence label. + + Order of preference: + 1. ``\\boxed{\\text{X}}`` -> high confidence + 2. ``\\boxed{X}`` -> high confidence + 3. raw stripped output -> med confidence + 4. empty -> low confidence + """ + answer = answer.strip() + match = re.search(r"\\boxed\{\\text\{([^}]*)\}\}", answer) + if not match: + match = re.search(r"\\boxed\{([^}]*)\}", answer) + if match: + return dnd_parse_answer(match.group(1)), "high" + if not answer: + return answer, "low" + return dnd_parse_answer(answer), "med" + + def dnd_process_response(datapoint: dict[str, Any], output: str) -> dict[str, Any]: + """Score a model answer against a D&D gold answer. + + Type-aware scoring: + - int vs int : ``0.75 ** |gap|`` (partial credit, decay) + - str vs str : exact match after strip().lower() -> 0 or 1 + - list vs list : Jaccard overlap |gold & pred| / |gold| + - type mismatch : 0.0 + """ + gold = dnd_parse_answer(datapoint["answer"]) + trimmed_output, parse_confidence = dnd_parse_response(output) + + score = 0.0 + if isinstance(gold, int) and isinstance(trimmed_output, int): + score = 0.75 ** abs(gold - trimmed_output) + elif isinstance(gold, str) and isinstance(trimmed_output, str): + score = float(gold.strip().lower() == trimmed_output.strip().lower()) + elif isinstance(gold, list) and isinstance(trimmed_output, list): + overlap = set(gold) & set(trimmed_output) + score = len(overlap) / len(gold) if gold else 0.0 + return { - "score": 0.0, - "parse_confidence": "n/a", - "reason": "oolong-real LLM judge not yet implemented; score=0 placeholder.", + "score": float(score), + "parse_confidence": parse_confidence, + "attempted_parse": trimmed_output, + "gold": gold, + "full_answer": output, } diff --git a/astraflow/core/workflow/impl/oolong/test_eval_helpers.py b/astraflow/core/workflow/impl/oolong/test_eval_helpers.py new file mode 100644 index 0000000..883dfcf --- /dev/null +++ b/astraflow/core/workflow/impl/oolong/test_eval_helpers.py @@ -0,0 +1,164 @@ +"""Unit tests for the rule-based oolong-real (D&D) grader. + +Ported faithfully from platoon's `dnd_process_response` and verified +against the documented scoring rules. + +Run: + pytest astraflow/core/workflow/impl/oolong/test_eval_helpers.py -v +""" + +from __future__ import annotations + +import pytest + +from astraflow.core.workflow.impl.oolong.eval_helpers import ( + dnd_parse_answer, + dnd_parse_response, + dnd_process_response, +) + + +# -------------------------------------------------------------------------- +# dnd_parse_answer — type dispatch +# -------------------------------------------------------------------------- + + +def test_parse_answer_int(): + assert dnd_parse_answer("42") == 42 + + +def test_parse_answer_negative_int(): + assert dnd_parse_answer("-7") == -7 + + +def test_parse_answer_list_via_comma(): + assert dnd_parse_answer("alice, bob, carol") == ["alice", "bob", "carol"] + + +def test_parse_answer_list_drops_empty_after_split(): + assert dnd_parse_answer("a,,b,") == ["a", "b"] + + +def test_parse_answer_falls_back_to_string(): + assert dnd_parse_answer("the killer") == "the killer" + + +# -------------------------------------------------------------------------- +# dnd_parse_response — \boxed extraction + fallback +# -------------------------------------------------------------------------- + + +def test_parse_response_boxed_text_wrapped(): + """\\boxed{\\text{X}} should be matched FIRST and stripped to X.""" + val, conf = dnd_parse_response(r"my final answer: \boxed{\text{alice}}") + assert val == "alice" + assert conf == "high" + + +def test_parse_response_boxed_plain(): + val, conf = dnd_parse_response(r"the count is \boxed{17}") + assert val == 17 + assert conf == "high" + + +def test_parse_response_boxed_list(): + val, conf = dnd_parse_response(r"\boxed{alice, bob}") + assert val == ["alice", "bob"] + assert conf == "high" + + +def test_parse_response_no_box_uses_raw_with_med_confidence(): + val, conf = dnd_parse_response("the answer is 5") + # No box, no comma, not parseable as int → string fallback + assert val == "the answer is 5" + assert conf == "med" + + +def test_parse_response_empty_returns_low_confidence(): + val, conf = dnd_parse_response(" ") + assert val == "" + assert conf == "low" + + +# -------------------------------------------------------------------------- +# dnd_process_response — type-aware scoring +# -------------------------------------------------------------------------- + + +def test_score_int_exact_match(): + r = dnd_process_response({"answer": "10"}, r"\boxed{10}") + assert r["score"] == 1.0 + assert r["parse_confidence"] == "high" + + +def test_score_int_off_by_one_partial_credit(): + r = dnd_process_response({"answer": "10"}, r"\boxed{11}") + assert r["score"] == pytest.approx(0.75) + + +def test_score_int_off_by_three(): + r = dnd_process_response({"answer": "10"}, r"\boxed{13}") + # 0.75 ** 3 = 0.421875 + assert r["score"] == pytest.approx(0.75**3) + + +def test_score_str_exact_match_case_insensitive(): + r = dnd_process_response( + {"answer": "Alice"}, r"my guess is \boxed{\text{alice}}" + ) + assert r["score"] == 1.0 + + +def test_score_str_mismatch(): + r = dnd_process_response({"answer": "alice"}, r"\boxed{\text{bob}}") + assert r["score"] == 0.0 + + +def test_score_list_full_overlap(): + r = dnd_process_response( + {"answer": "alice, bob"}, r"\boxed{alice, bob}" + ) + assert r["score"] == 1.0 + + +def test_score_list_partial_overlap(): + """Jaccard-like: |gold ∩ pred| / |gold|. Half of gold is recovered → 0.5.""" + r = dnd_process_response( + {"answer": "alice, bob"}, r"\boxed{alice, carol}" + ) + assert r["score"] == pytest.approx(0.5) + + +def test_score_list_no_overlap(): + r = dnd_process_response( + {"answer": "alice, bob"}, r"\boxed{x, y}" + ) + assert r["score"] == 0.0 + + +def test_score_type_mismatch_returns_zero(): + """Gold is int, model returns a string → score 0 (no partial credit).""" + r = dnd_process_response({"answer": "10"}, r"\boxed{\text{ten}}") + assert r["score"] == 0.0 + + +def test_score_unboxed_int_still_works(): + """Without \\boxed{}, raw output is parsed with med confidence; still scores.""" + r = dnd_process_response({"answer": "10"}, "10") + assert r["score"] == 1.0 + assert r["parse_confidence"] == "med" + + +def test_score_empty_output_is_zero(): + r = dnd_process_response({"answer": "10"}, "") + assert r["score"] == 0.0 + assert r["parse_confidence"] == "low" + + +def test_result_includes_metadata(): + r = dnd_process_response({"answer": "10"}, r"\boxed{11}") + assert "attempted_parse" in r + assert "gold" in r + assert "full_answer" in r + assert r["gold"] == 10 + assert r["attempted_parse"] == 11 diff --git a/examples/oolong/qwen3-4b-recursive-real/scripts/1_astraflow.sh b/examples/oolong/qwen3-4b-recursive-real/scripts/1_astraflow.sh new file mode 100755 index 0000000..cf7df94 --- /dev/null +++ b/examples/oolong/qwen3-4b-recursive-real/scripts/1_astraflow.sh @@ -0,0 +1,36 @@ +#!/bin/bash +set -euo pipefail +# [1/3] Launch AstraFlow HTTP service +# +# Usage (terminal 1): +# bash examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh + +export CUDA_VISIBLE_DEVICES="" + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== AstraFlow HTTP Service ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "Port : ${ASTRAFLOW_PORT}" +echo "===============================" + +python3 -u -m astraflow \ + --config "${EXPERIMENT_CONFIG}" \ + --port "${ASTRAFLOW_PORT}" \ + --host "${ASTRAFLOW_HOST}" \ + 2>&1 | tee "${LOG_DIR}/astraflow.log" diff --git a/examples/oolong/qwen3-4b-recursive-real/scripts/2_raas.sh b/examples/oolong/qwen3-4b-recursive-real/scripts/2_raas.sh new file mode 100755 index 0000000..5d88b2b --- /dev/null +++ b/examples/oolong/qwen3-4b-recursive-real/scripts/2_raas.sh @@ -0,0 +1,44 @@ +#!/bin/bash +set -euo pipefail +# [2/3] Launch RaaS inference server (SGLang + TCP receiver) +# +# Usage (terminal 2, after AstraFlow is ready): +# bash examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" +export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="${ASTRAFLOW_URL:-http://127.0.0.1:${ASTRAFLOW_PORT}}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== RaaS Inference Server (SGLang + TCP receiver) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "RaaS config : ${RAAS_CONFIG}" +echo "GPUs : ${CUDA_VISIBLE_DEVICES}" +echo "Port : ${RAAS_PORT}" +echo "AstraFlow URL : ${ASTRAFLOW_URL}" +echo "=======================================================" + +python3 -u -m astraflow.raas.server \ + --host "${RAAS_HOST}" \ + --port "${RAAS_PORT}" \ + --config "${EXPERIMENT_CONFIG}" \ + --config "${RAAS_CONFIG}" \ + --engine-id "${ENGINE_ID:-default}" \ + --astraflow-url "${ASTRAFLOW_URL}" \ + 2>&1 | tee "${LOG_DIR}/raas.log" diff --git a/examples/oolong/qwen3-4b-recursive-real/scripts/3_trainer_model0.sh b/examples/oolong/qwen3-4b-recursive-real/scripts/3_trainer_model0.sh new file mode 100755 index 0000000..cb8e850 --- /dev/null +++ b/examples/oolong/qwen3-4b-recursive-real/scripts/3_trainer_model0.sh @@ -0,0 +1,47 @@ +#!/bin/bash +set -euo pipefail +# [3/3] Launch Trainer for model0 (TCP, sender_agent on local_rank 0) +# +# Usage (terminal 3, after AstraFlow and RaaS are ready): +# bash examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS:-4,5,6,7}" +TRAINER0_NPROC="$(echo "${CUDA_VISIBLE_DEVICES}" | awk -F',' '{print NF}')" + +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" +export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" + +# sender_agent (in trainer) listens on this HTTP port +export WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== Trainer model0 (TCP) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "GPUs : ${CUDA_VISIBLE_DEVICES} (FSDP dp${TRAINER0_NPROC})" +echo "AstraFlow : ${ASTRAFLOW_URL}" +echo "RaaS : ${ASTRAFLOW_RAAS_URL}" +echo "Sender HTTP : ${WEIGHT_TRANSFER_HTTP_PORT}" +echo "WANDB mode : ${WANDB_MODE:-online}" +echo "==========================================" + +torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ + --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ + examples/launch_trainer.py \ + --config "${EXPERIMENT_CONFIG}" \ + --trainer trainer_model0 \ + "$@" 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/oolong/qwen3-4b-recursive-real/scripts/run_qwen3-4b-recursive.sh b/examples/oolong/qwen3-4b-recursive-real/scripts/run_qwen3-4b-recursive.sh new file mode 100755 index 0000000..ced8ff7 --- /dev/null +++ b/examples/oolong/qwen3-4b-recursive-real/scripts/run_qwen3-4b-recursive.sh @@ -0,0 +1,116 @@ +#!/bin/bash +set -euo pipefail +# All-in-one launcher for AstraFlow training with the RECURSIVE-AGENT +# workflow on TextCraft (Qwen3-4B-Instruct-2507, M2PO, platoon port). +# +# Workflow: recursive_agent. Agent emits one {JSON} +# per turn (craft / get_info / view_inventory / spawn / finish). Spawn +# fans out up to 4 sub-agents in parallel via asyncio.gather, each +# inheriting the parent's inventory by reference. Tree-structured +# trajectory flattened to one trajectory with N sequences sharing the +# env-based team reward. +# +# TextCraft task data is synthesized locally on first run from the +# bundled Minecraft recipe DB (no HF download required). Files land at +# astraflow/core/workflow/impl/textcraft/textcraft_{train,val}.jsonl. +# +# Launches 3 processes: +# 1. AstraFlow HTTP service (CPU-only) +# 2. RaaS inference server (SGLang, SERVICE_CUDA_VISIBLE_DEVICES) +# 3. Trainer model0 (FSDP, TRAINER_MODEL0_GPUS) +# +# Usage: +# bash examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh + +# ============================================================================= +# Part 1: Load env and settings +# ============================================================================= +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +# Defined in examples/_common/utils.sh. +astraflow_load_experiment_env + +# ============================================================================= +# Part 2: Set up env +# ============================================================================= +# GPU assignments (default: 4 GPUs for inference, 4 for training) +export SERVICE_CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" +export TRAINER_MODEL0_GPUS="${TRAINER_MODEL0_GPUS:-4,5,6,7}" +# Ports / URLs (each component gets its own port) +export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" +export WEIGHT_TRANSFER_HTTP_PORT_MODEL0="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" + +TRAINER0_NPROC="$(echo "${TRAINER_MODEL0_GPUS}" | awk -F',' '{print NF}')" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. +# Defined in examples/_common/utils.sh. +astraflow_setup_env + +# ============================================================================= +# Part 3: Print info and clean up +# ============================================================================= +echo "=== AstraFlow (Qwen3-4B, TextCraft, M2PO, ctx32k, TCP, RECURSIVE AGENT) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "RaaS config : ${RAAS_CONFIG}" +echo "RaaS GPUs : ${SERVICE_CUDA_VISIBLE_DEVICES}" +echo "Trainer model0 GPUs : ${TRAINER_MODEL0_GPUS} (FSDP dp${TRAINER0_NPROC})" +echo "RaaS port : ${RAAS_PORT}" +echo "AstraFlow port : ${ASTRAFLOW_PORT}" +echo "Sender HTTP model0 : ${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" +echo "WANDB mode : ${WANDB_MODE:-online}" +echo "==========================================================" + +trap astraflow_cleanup_trap EXIT INT TERM + +# Kill leftover processes and shared memory from prior runs. +# Defined in examples/_common/utils.sh. +astraflow_kill_stale + +# ============================================================================= +# Part 4: Launch training +# ============================================================================= +echo "[1/3] Starting AstraFlow HTTP service..." +CUDA_VISIBLE_DEVICES="" \ + python3 -u -m astraflow \ + --config "${EXPERIMENT_CONFIG}" \ + --port "${ASTRAFLOW_PORT}" \ + --host "${ASTRAFLOW_HOST}" \ + 2>&1 | tee "${LOG_DIR}/astraflow.log" & +sleep 5 + +echo "[2/3] Starting RaaS inference server (SGLang + TCP receiver)..." +CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES}" \ + python3 -u -m astraflow.raas.server \ + --host "${RAAS_HOST}" \ + --port "${RAAS_PORT}" \ + --config "${EXPERIMENT_CONFIG}" \ + --config "${RAAS_CONFIG}" \ + --engine-id "${ENGINE_ID:-default}" \ + --astraflow-url "${ASTRAFLOW_URL}" \ + 2>&1 | tee "${LOG_DIR}/raas.log" & +sleep 15 + +export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" + +echo "[3/3] Starting trainer model0..." +CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS}" \ +WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" \ + torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ + --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ + examples/launch_trainer.py \ + --config "${EXPERIMENT_CONFIG}" \ + --trainer trainer_model0 \ + "$@" \ + 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/oolong/qwen3-4b-recursive-real/yaml/experiment.yaml b/examples/oolong/qwen3-4b-recursive-real/yaml/experiment.yaml new file mode 100644 index 0000000..8be01f5 --- /dev/null +++ b/examples/oolong/qwen3-4b-recursive-real/yaml/experiment.yaml @@ -0,0 +1,180 @@ +# ============================================================================ +# Experiment config — AstraFlow service + Trainer (OOLONG RECURSIVE AGENT) +# Experiment: oolong / qwen3-4b-recursive +# +# Port of platoon's OOLONG-REAL design (see arxiv 2605.06639, "Recursive +# Agent Optimization", Gandhi et al.): +# - workflow_cls: oolong_recursive +# - Python-sandbox env (exec() namespace per agent), context pre-loaded +# into the sandbox not the prompt +# - ...... action format +# - launch_subagent(goal, context) for spawn; asyncio.gather for parallel +# - Reward = success + lambda * mean(children's success), lambda=0.4 +# - Synth-only rule-based grader for v1 (oolong-real LLM judge is TODO) +# +# Model: Qwen3-4B-Instruct-2507 (same as TextCraft recipe; paper used 30B +# but we use 4B for parity with our infra). +# +# GPU layout (8 GPUs): +# SERVICE_CUDA_VISIBLE_DEVICES=0,1,2,3 -> RaaS (model0 dp=4) +# TRAINER_MODEL0_GPUS=4,5,6,7 -> Trainer (FSDP, 4 GPUs) +# ============================================================================ + +experiment: + experiment_name: astraflow-oolong + trial_name: qwen3-4b-oolong-real-recursive + fileroot: ./data-experiments/${experiment.experiment_name}/${experiment.trial_name} + + model_path: "Qwen/Qwen3-4B-Instruct-2507" + tokenizer_path: "Qwen/Qwen3-4B-Instruct-2507" + seed: 1 + dtype: bfloat16 + weight_transfer_mode: tcp + weight_transfer_strategies: full + +raas: + models: + model0: + backend: sglang + gconfig: + n_samples: 8 + temperature: 1.0 + max_new_tokens: 2048 # per-turn budget; recursive Oolong likes longer thinking + min_new_tokens: 0 + +dataflow: + host: "0.0.0.0" + port: 8000 + + dump_dir: "./data-experiments/${experiment.experiment_name}/${experiment.trial_name}/rollout_dumps" + + buffer: + size: 10000 + replay_size: 10000 + replay_ratio: 0 + max_staleness: 8 + filter_function: filter_zero_adv + + rollout_dataset: + dataset_fn: "astraflow.dataflow.dataset.oolong:get_oolong_rl_dataset" + # oolong-real (D&D mystery / aggregation) — graded by the rule-based + # dnd_process_response: int -> 0.75^|gap|, str -> exact, list -> Jaccard. + # Model is expected to wrap final answer in \boxed{...} (parsed at high + # confidence); raw output is parsed at med confidence as a fallback. + # + # Note on context length: D&D contexts are 150K-200K CHARACTERS (~40-50K + # tokens), far larger than the model's 32K context window. They are + # loaded into the agent's Python sandbox as the `context: str` variable + # — the agent must chunk via `print(context[:N])` or delegate slices via + # `launch_subagent(context=context[a:b])`. max_context_len: 250000 keeps + # all 201 validation tasks through the filter (median len ~172K chars). + dataset: real + split: validation # real's validation set is small; switch to test for full eval + max_context_len: 250000 # raw char length cap (D&D needs >150K; do NOT lower without checking distribution) + num_tasks: 200 + + workflow_spec: + workflow_cls: "oolong_recursive" + reward_fn: "oolong_success" + max_depth: 2 # paper: 2 (0-indexed; 3 levels incl. root) + max_breadth: 4 # safety cap + max_steps_per_episode: 25 # root step cap + sub_max_steps: 15 # sub step cap (paper used 15 for sub) + max_concurrent_subagents: 8 + # With team-credit (workflow assigns root_reward to all agents), + # delegation_lambda is redundant: root_reward = root_success + λ·mean(0) = root_success + # since sub-agents have no node-local verifier without an LLM judge. + # Set to 0 to keep semantics explicit. Re-enable when LLM judge lands. + delegation_lambda: 0.0 + stdout_truncate: 8000 + enable_thinking: false + # v1 dump rate. Bump to inspect agent behavior. + dump_prob: 0.02 + + eval_workflows: + oolong_eval: + workflow_cls: "oolong_recursive" + reward_fn: "oolong_success" + max_depth: 2 + max_breadth: 4 + max_steps_per_episode: 25 + sub_max_steps: 15 + delegation_lambda: 0.0 # eval: only root reward counts + stdout_truncate: 8000 + enable_thinking: false + dump_prob: 0.05 + gconfig_overrides: + n_samples: 1 + temperature: 0.6 + + eval_datasets: + oolong_val: + dataset_fn: "astraflow.dataflow.dataset.oolong:get_oolong_eval_dataset" + dataset: real + split: test + max_context_len: 250000 # D&D needs >150K char headroom (see rollout_dataset note) + num_val: 50 + repeat: 1 + eval_workflow: oolong_eval + +trainer_base: + total_train_steps: 200 + # v2 with bs=64 collapsed (pre_filter 0.80→0.30 in 19 steps). With + # team-credit + recursive trees, each rollout produces ~15-30 sequences, + # so bs=64 covers only ~2-4 unique prompts/step — too few unique groups + # to survive filter_zero_adv. v20 (TextCraft) used bs=512 successfully; + # using bs=256 here as a balance. + train_batch_size: 256 + n_samples: 8 + engine: + backend: fsdp + data_parallel_size: 4 + + actor: + gradient_checkpointing: true + mb_spec: + max_tokens_per_mb: 32768 + optimizer: + type: adam + lr: 1e-6 # v2-v4 at 3e-6 degraded fast; Oolong has low headroom (~30%) and noisy reward, needs smaller updates + weight_decay: 0.0 + beta1: 0.9 + beta2: 0.95 + eps: 1e-8 + lr_scheduler_type: constant + gradient_clipping: 1.0 + # M2PO (same as TextCraft) + m2_threshold: 0.01 + eps_clip: 100.0 + eps_clip_higher: 100.0 + reward_scaling: 1 + reward_bias: 0 + kl_ctl: 0.00 + kl_penalty_coef: 0.001 + ppo_n_minibatches: 4 # bs=256 / 4 = 64 per minibatch (matches v20 ratio) + reward_norm: { mean_level: group, std_level: group } + adv_norm: { mean_level: batch, std_level: batch } + + ref: + path: "Qwen/Qwen3-4B-Instruct-2507" + mb_spec: + max_tokens_per_mb: 32768 + + recover: + mode: auto + freq_steps: 25 + + evaluator: + eval_at_start: false # skip v0 eval per [[eval-at-start-default-false]] + freq_steps: 20 + + stats_logger: + wandb: + mode: online + id_suffix: "uid" + +trainer_model0: + model_id: model0 + stats_logger: + wandb: + tags: ["oolong", "oolong-synth", "recursive-agent", "qwen3-4b", "m2po", "platoon-port"] diff --git a/examples/oolong/qwen3-4b-recursive-real/yaml/raas.yaml b/examples/oolong/qwen3-4b-recursive-real/yaml/raas.yaml new file mode 100644 index 0000000..396637d --- /dev/null +++ b/examples/oolong/qwen3-4b-recursive-real/yaml/raas.yaml @@ -0,0 +1,30 @@ +# ============================================================================ +# RaaS config — Inference serving instance (hardware/resources) +# Experiment: oolong / qwen3-4b-recursive +# +# Hardware: 4x GPU, TP=1; model0 DP=4 +# Merged with experiment.yaml at launch (--config experiment.yaml --config raas.yaml) +# ============================================================================ + +rollout: + max_concurrent_rollouts: 1024 + max_concurrent_evals: 64 + pause_grace_period: 3 + enable_adaptive_availability: true + target_waiting_queue_per_dp: 4 + adaptive_step_size: 4 + load_cache_ttl_ms: 100 + +engine: + model0: + backend: sglang + data_parallel_size: 4 + +sglang: + # 32K context: matches paper's OOLONG-REAL training context window. + # Initial Oolong tasks have context_len <= ~8K chars (~2K tokens) so + # plenty of headroom even with recursion + per-turn observation history. + context_length: 32768 + mem_fraction_static: 0.65 + max_running_requests: null + skip_tokenizer_init: true From b5b4042daa4fb868cc94577af3ecfcac7b210e0d Mon Sep 17 00:00:00 2001 From: Haizhong Date: Thu, 28 May 2026 00:29:08 -0400 Subject: [PATCH 20/35] feat: let workflows opt out of producer's default group-reward stats The producer was unconditionally overwriting group_reward_mean and group_reward_std on every emitted sequence, blocking workflows from publishing their own baseline. Now the producer only fills these fields when the workflow has not already stamped them. Motivation: recursive agents emit a variable number of sequences per prompt (root + N sub-agents). Letting the producer compute group stats over all sequences sequence-weights the baseline, pulling it toward samples that happened to spawn more sub-agents. The DeepDive workflow now stamps a sample-weighted mean over root rewards and std=1.0. --- astraflow/dataflow/data_acquisition.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/astraflow/dataflow/data_acquisition.py b/astraflow/dataflow/data_acquisition.py index 9dc644e..30e622f 100644 --- a/astraflow/dataflow/data_acquisition.py +++ b/astraflow/dataflow/data_acquisition.py @@ -480,6 +480,15 @@ def _ingest_structured_result( # group is split across DP ranks (multi-turn / variable-size # workflows such as actor_and_verify and asearcher). # + # Workflows may stamp these fields themselves before emission to + # opt out of the producer's default GRPO statistic. Typical + # reasons: avoid the per-sequence weighting bias when agents emit + # variable numbers of sequences (e.g. recursive agents — a sample + # spawning more sub-agents would otherwise pull the baseline + # toward itself), or apply a different baseline (leave-one-out, + # root-only, etc). The producer's default values are computed + # below but only applied when a seq has not already been stamped. + # # Use unbiased (N-1) std to match Normalization defaults # (NormConfig.std_unbiased=True). For singleton groups, # fall back to std=1.0 to match Normalization's special case. @@ -497,8 +506,12 @@ def _ingest_structured_result( # Publish each sequence to the buffer. model_accepted = 0 for seq in seqs: - seq["group_reward_mean"] = torch.tensor([g_mean]) - seq["group_reward_std"] = torch.tensor([g_std]) + # Honor workflow-stamped stats; only fill in defaults + # when the workflow did not provide them. + if "group_reward_mean" not in seq: + seq["group_reward_mean"] = torch.tensor([g_mean]) + if "group_reward_std" not in seq: + seq["group_reward_std"] = torch.tensor([g_std]) seq_metadata = dict(metadata) version_meta = self.build_metadata(seq) for k in ("min_version", "max_version"): From bf27d7011fb45d92c45b61aed7f667759b406de5 Mon Sep 17 00:00:00 2001 From: Haizhong Date: Tue, 2 Jun 2026 11:51:48 -0400 Subject: [PATCH 21/35] feat: enrich DeepDive dumps and add qwen3-4b-recursive-v7 recipe Include the question and ground_truth in episode dump files so rollouts can be inspected without cross-referencing the dataset. Bump dump_prob 0.05 -> 0.25 (train + eval) for denser sampling during debugging (~64 dumps/step at bs=256). Add qwen3-4b-recursive-v7 recipe variant (trial_name suffixed -v7). --- .../core/workflow/impl/deepdive/workflow.py | 5 +- .../scripts/1_astraflow.sh | 36 ++++ .../qwen3-4b-recursive-v7/scripts/2_raas.sh | 44 +++++ .../scripts/3_trainer_model0.sh | 47 +++++ .../scripts/run_qwen3-4b-recursive.sh | 132 ++++++++++++++ .../yaml/experiment.yaml | 170 ++++++++++++++++++ .../qwen3-4b-recursive-v7/yaml/raas.yaml | 30 ++++ .../qwen3-4b-recursive/yaml/experiment.yaml | 4 +- 8 files changed, 465 insertions(+), 3 deletions(-) create mode 100755 examples/deepdive/qwen3-4b-recursive-v7/scripts/1_astraflow.sh create mode 100755 examples/deepdive/qwen3-4b-recursive-v7/scripts/2_raas.sh create mode 100755 examples/deepdive/qwen3-4b-recursive-v7/scripts/3_trainer_model0.sh create mode 100755 examples/deepdive/qwen3-4b-recursive-v7/scripts/run_qwen3-4b-recursive.sh create mode 100644 examples/deepdive/qwen3-4b-recursive-v7/yaml/experiment.yaml create mode 100644 examples/deepdive/qwen3-4b-recursive-v7/yaml/raas.yaml diff --git a/astraflow/core/workflow/impl/deepdive/workflow.py b/astraflow/core/workflow/impl/deepdive/workflow.py index 2558d70..28bb389 100644 --- a/astraflow/core/workflow/impl/deepdive/workflow.py +++ b/astraflow/core/workflow/impl/deepdive/workflow.py @@ -663,11 +663,14 @@ async def _dump_trajectory(self, rollout: dict[str, Any], data: dict[str, Any]) out_dir = f"{self.dump_dir}/{sub}" await aiofiles.os.makedirs(out_dir, exist_ok=True) out_path = f"{out_dir}/deepdive-{abs(hash(task.id)) % 100_000_000:08d}.txt" + ground_truth = str(task.misc.get("ground_truth", "")).strip() async with aiofiles.open(out_path, "w") as f: await f.write( f"=== Episode reward={rollout['root_reward']:.3f} " f"n_agents={rollout['n_agents']} " - f"searches={rollout['search_calls']} ===\n\n" + f"searches={rollout['search_calls']} ===\n" + f"question: {task.goal}\n" + f"ground_truth: {ground_truth}\n\n" ) for ag in rollout["all_trajs"]: tag = "ROOT" if ag.is_root else f"SUB depth={ag.depth}" diff --git a/examples/deepdive/qwen3-4b-recursive-v7/scripts/1_astraflow.sh b/examples/deepdive/qwen3-4b-recursive-v7/scripts/1_astraflow.sh new file mode 100755 index 0000000..cf7df94 --- /dev/null +++ b/examples/deepdive/qwen3-4b-recursive-v7/scripts/1_astraflow.sh @@ -0,0 +1,36 @@ +#!/bin/bash +set -euo pipefail +# [1/3] Launch AstraFlow HTTP service +# +# Usage (terminal 1): +# bash examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh + +export CUDA_VISIBLE_DEVICES="" + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== AstraFlow HTTP Service ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "Port : ${ASTRAFLOW_PORT}" +echo "===============================" + +python3 -u -m astraflow \ + --config "${EXPERIMENT_CONFIG}" \ + --port "${ASTRAFLOW_PORT}" \ + --host "${ASTRAFLOW_HOST}" \ + 2>&1 | tee "${LOG_DIR}/astraflow.log" diff --git a/examples/deepdive/qwen3-4b-recursive-v7/scripts/2_raas.sh b/examples/deepdive/qwen3-4b-recursive-v7/scripts/2_raas.sh new file mode 100755 index 0000000..5d88b2b --- /dev/null +++ b/examples/deepdive/qwen3-4b-recursive-v7/scripts/2_raas.sh @@ -0,0 +1,44 @@ +#!/bin/bash +set -euo pipefail +# [2/3] Launch RaaS inference server (SGLang + TCP receiver) +# +# Usage (terminal 2, after AstraFlow is ready): +# bash examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" +export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="${ASTRAFLOW_URL:-http://127.0.0.1:${ASTRAFLOW_PORT}}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== RaaS Inference Server (SGLang + TCP receiver) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "RaaS config : ${RAAS_CONFIG}" +echo "GPUs : ${CUDA_VISIBLE_DEVICES}" +echo "Port : ${RAAS_PORT}" +echo "AstraFlow URL : ${ASTRAFLOW_URL}" +echo "=======================================================" + +python3 -u -m astraflow.raas.server \ + --host "${RAAS_HOST}" \ + --port "${RAAS_PORT}" \ + --config "${EXPERIMENT_CONFIG}" \ + --config "${RAAS_CONFIG}" \ + --engine-id "${ENGINE_ID:-default}" \ + --astraflow-url "${ASTRAFLOW_URL}" \ + 2>&1 | tee "${LOG_DIR}/raas.log" diff --git a/examples/deepdive/qwen3-4b-recursive-v7/scripts/3_trainer_model0.sh b/examples/deepdive/qwen3-4b-recursive-v7/scripts/3_trainer_model0.sh new file mode 100755 index 0000000..cb8e850 --- /dev/null +++ b/examples/deepdive/qwen3-4b-recursive-v7/scripts/3_trainer_model0.sh @@ -0,0 +1,47 @@ +#!/bin/bash +set -euo pipefail +# [3/3] Launch Trainer for model0 (TCP, sender_agent on local_rank 0) +# +# Usage (terminal 3, after AstraFlow and RaaS are ready): +# bash examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +astraflow_load_experiment_env + +export CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS:-4,5,6,7}" +TRAINER0_NPROC="$(echo "${CUDA_VISIBLE_DEVICES}" | awk -F',' '{print NF}')" + +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" +export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" + +# sender_agent (in trainer) listens on this HTTP port +export WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. +astraflow_setup_env + +echo "=== Trainer model0 (TCP) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "GPUs : ${CUDA_VISIBLE_DEVICES} (FSDP dp${TRAINER0_NPROC})" +echo "AstraFlow : ${ASTRAFLOW_URL}" +echo "RaaS : ${ASTRAFLOW_RAAS_URL}" +echo "Sender HTTP : ${WEIGHT_TRANSFER_HTTP_PORT}" +echo "WANDB mode : ${WANDB_MODE:-online}" +echo "==========================================" + +torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ + --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ + examples/launch_trainer.py \ + --config "${EXPERIMENT_CONFIG}" \ + --trainer trainer_model0 \ + "$@" 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/deepdive/qwen3-4b-recursive-v7/scripts/run_qwen3-4b-recursive.sh b/examples/deepdive/qwen3-4b-recursive-v7/scripts/run_qwen3-4b-recursive.sh new file mode 100755 index 0000000..a927522 --- /dev/null +++ b/examples/deepdive/qwen3-4b-recursive-v7/scripts/run_qwen3-4b-recursive.sh @@ -0,0 +1,132 @@ +#!/bin/bash +set -euo pipefail +# All-in-one launcher for AstraFlow training with the DEEPDIVE RECURSIVE-AGENT +# workflow (Qwen3-4B-Instruct-2507, M2PO, platoon port). +# +# Workflow: deepdive_recursive. Agent emits one +# ...... per turn. Python sandbox +# exposes async tools: search_web (CMU RAG), launch_subagent, finish. +# Reward: LLM judge for root (vs ground_truth) and for sub-agents. +# +# DeepDive task data auto-downloaded from HF (zai-org/DeepDive) on first +# run; cache lands at astraflow/core/workflow/impl/deepdive/deepdive_*.jsonl. +# +# External services required: +# - Fireworks API: ~/.fireworks_key (FIREWORKS_API_KEY for LLM judge) +# - CMU RAG search: ~/.cmu_search_key (CMU_SEARCH_API_KEY for search_web) +# +# Launches 3 processes: +# 1. AstraFlow HTTP service (CPU-only) +# 2. RaaS inference server (SGLang, SERVICE_CUDA_VISIBLE_DEVICES) +# 3. Trainer model0 (FSDP, TRAINER_MODEL0_GPUS) +# +# Usage: +# bash examples/deepdive/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh + +# ============================================================================= +# Part 1: Load env and settings +# ============================================================================= +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" +cd "${REPO_ROOT}" +export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" + +YAML_DIR="${SCRIPT_DIR}/yaml" +export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" +export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" +source "${REPO_ROOT}/examples/_common/utils.sh" +# Export EXP_NAME and TRIAL_NAME from the experiment YAML. +# Defined in examples/_common/utils.sh. +astraflow_load_experiment_env + +# Source API keys for the LLM judge and the CMU RAG search. Both files are +# gitignored locally (~/.fireworks_key, ~/.cmu_search_key). The trainer needs +# both visible in its env; we export them with `set -a` so child processes +# inherit them. +set -a +[[ -f "${HOME}/.fireworks_key" ]] && source "${HOME}/.fireworks_key" +[[ -f "${HOME}/.cmu_search_key" ]] && source "${HOME}/.cmu_search_key" +set +a +if [[ -z "${FIREWORKS_API_KEY:-}" ]]; then + echo "WARNING: FIREWORKS_API_KEY not set — LLM judge calls will fail" >&2 +fi +if [[ -z "${CMU_SEARCH_API_KEY:-}" ]]; then + echo "WARNING: CMU_SEARCH_API_KEY not set — search_web calls will fail" >&2 +fi + +# ============================================================================= +# Part 2: Set up env +# ============================================================================= +# GPU assignments (default: 4 GPUs for inference, 4 for training) +export SERVICE_CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" +export TRAINER_MODEL0_GPUS="${TRAINER_MODEL0_GPUS:-4,5,6,7}" +# Ports / URLs (each component gets its own port) +export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" +export RAAS_PORT="${RAAS_PORT:-19190}" +export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" +export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" +export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" +export WEIGHT_TRANSFER_HTTP_PORT_MODEL0="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" + +TRAINER0_NPROC="$(echo "${TRAINER_MODEL0_GPUS}" | awk -F',' '{print NF}')" + +# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. +# Defined in examples/_common/utils.sh. +astraflow_setup_env + +# ============================================================================= +# Part 3: Print info and clean up +# ============================================================================= +echo "=== AstraFlow (Qwen3-4B, DeepDive, M2PO, ctx40k, TCP, RECURSIVE AGENT) ===" +echo "Experiment config : ${EXPERIMENT_CONFIG}" +echo "RaaS config : ${RAAS_CONFIG}" +echo "RaaS GPUs : ${SERVICE_CUDA_VISIBLE_DEVICES}" +echo "Trainer model0 GPUs : ${TRAINER_MODEL0_GPUS} (FSDP dp${TRAINER0_NPROC})" +echo "RaaS port : ${RAAS_PORT}" +echo "AstraFlow port : ${ASTRAFLOW_PORT}" +echo "Sender HTTP model0 : ${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" +echo "WANDB mode : ${WANDB_MODE:-online}" +echo "==========================================================" + +trap astraflow_cleanup_trap EXIT INT TERM + +# Kill leftover processes and shared memory from prior runs. +# Defined in examples/_common/utils.sh. +astraflow_kill_stale + +# ============================================================================= +# Part 4: Launch training +# ============================================================================= +echo "[1/3] Starting AstraFlow HTTP service..." +CUDA_VISIBLE_DEVICES="" \ + python3 -u -m astraflow \ + --config "${EXPERIMENT_CONFIG}" \ + --port "${ASTRAFLOW_PORT}" \ + --host "${ASTRAFLOW_HOST}" \ + 2>&1 | tee "${LOG_DIR}/astraflow.log" & +sleep 5 + +echo "[2/3] Starting RaaS inference server (SGLang + TCP receiver)..." +CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES}" \ + python3 -u -m astraflow.raas.server \ + --host "${RAAS_HOST}" \ + --port "${RAAS_PORT}" \ + --config "${EXPERIMENT_CONFIG}" \ + --config "${RAAS_CONFIG}" \ + --engine-id "${ENGINE_ID:-default}" \ + --astraflow-url "${ASTRAFLOW_URL}" \ + 2>&1 | tee "${LOG_DIR}/raas.log" & +sleep 15 + +export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" + +echo "[3/3] Starting trainer model0..." +CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS}" \ +WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" \ + torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ + --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ + examples/launch_trainer.py \ + --config "${EXPERIMENT_CONFIG}" \ + --trainer trainer_model0 \ + "$@" \ + 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/deepdive/qwen3-4b-recursive-v7/yaml/experiment.yaml b/examples/deepdive/qwen3-4b-recursive-v7/yaml/experiment.yaml new file mode 100644 index 0000000..792c410 --- /dev/null +++ b/examples/deepdive/qwen3-4b-recursive-v7/yaml/experiment.yaml @@ -0,0 +1,170 @@ +# ============================================================================ +# Experiment config — AstraFlow service + Trainer (DEEPDIVE RECURSIVE AGENT) +# Experiment: deepdive / qwen3-4b-recursive +# +# Port of platoon's DeepDive RL recipe (see configs/areal/deepdive_areal.yaml): +# - workflow_cls: deepdive_recursive +# - Python-sandbox env (exec() namespace per agent), NO pre-loaded context +# - Tools: search_web(query, n_docs) via CMU RAG, launch_subagent(goal), +# finish(answer), asyncio +# - ...... action format +# - Reward: LLM judge for root (vs ground_truth) AND for sub-agents (vs goal) +# -- DeepDive has no rule-based grader, judge is always required +# - delegation_lambda = 0.0 (matches platoon's _DEEPDIVE_DELEGATION_REWARD_CAP) +# +# Model: Qwen3-4B-Instruct-2507 (same as Oolong/TextCraft; platoon uses same) +# +# GPU layout (8 GPUs): +# SERVICE_CUDA_VISIBLE_DEVICES=0,1,2,3 -> RaaS (model0 dp=4) +# TRAINER_MODEL0_GPUS=4,5,6,7 -> Trainer (FSDP, 4 GPUs) +# +# External services required at launch: +# - FIREWORKS_API_KEY for astraEnv.judge (~/.fireworks_key) +# - CMU_SEARCH_API_KEY for astraEnv.search (~/.cmu_search_key) +# ============================================================================ + +experiment: + experiment_name: astraflow-deepdive + trial_name: qwen3-4b-deepdive-recursive-v7 + fileroot: ./data-experiments/${experiment.experiment_name}/${experiment.trial_name} + + model_path: "Qwen/Qwen3-4B-Instruct-2507" + tokenizer_path: "Qwen/Qwen3-4B-Instruct-2507" + seed: 1 + dtype: bfloat16 + weight_transfer_mode: tcp + weight_transfer_strategies: full + +raas: + models: + model0: + backend: sglang + gconfig: + n_samples: 8 + temperature: 1.0 + max_new_tokens: 8192 # platoon default for DeepDive — research needs long replies + min_new_tokens: 0 + +dataflow: + host: "0.0.0.0" + port: 8000 + + dump_dir: "./data-experiments/${experiment.experiment_name}/${experiment.trial_name}/rollout_dumps" + + buffer: + size: 10000 + replay_size: 10000 + replay_ratio: 0 + max_staleness: 8 + # filter_zero_adv: drop prompt groups where all 8 samples got identical + # rewards (= zero group variance = zero gradient signal). Matches + # platoon's filter_zero_variance_groups: True default. Required when + # the root rubric is binary (success bool → 0/1) since many groups + # naturally come out all-0 or all-1 for a base model on a hard task. + filter_function: filter_zero_adv + + rollout_dataset: + dataset_fn: "astraflow.dataflow.dataset.deepdive:get_deepdive_rl_dataset" + split: qa_rl # platoon: train_split + num_tasks: null # platoon: train_num_tasks=null (use all) + + workflow_spec: + workflow_cls: "deepdive_recursive" + reward_fn: "deepdive_success" + # Reward mode — selects which credit-assignment scheme to use: + # team_credit: all agents train on root's LLM-judged reward (cheap). + # per_agent_judge: each agent trains on its own LLM-judged reward + # (more judge calls; closer to "true" per-agent credit). + # Default matches platoon's behavior (delegation_cap=0 → effectively + # team_credit). Switch to per_agent_judge for the LLM-judge-everywhere + # experiment if team_credit doesn't move accuracy. + reward_mode: team_credit + max_depth: 4 # platoon: DepthAwareStepBudgetTracker(max_depth=4) + max_steps_per_episode: 25 # platoon: max_steps=25 + sub_max_steps: 15 + max_concurrent_subagents: 4 # conservative; bump if RaaS queue stays low + delegation_lambda: 0.0 # platoon: _DEEPDIVE_DELEGATION_REWARD_CAP=0.0 + stdout_truncate: 8000 + enable_thinking: false + dump_prob: 0.25 # ~64 dumps/step at bs=256 — denser sampling for debugging + + eval_workflows: + deepdive_eval: + workflow_cls: "deepdive_recursive" + reward_fn: "deepdive_success" + reward_mode: team_credit + max_depth: 4 + max_steps_per_episode: 25 + sub_max_steps: 15 + delegation_lambda: 0.0 + stdout_truncate: 8000 + enable_thinking: false + dump_prob: 0.25 + gconfig_overrides: + n_samples: 1 + temperature: 0.6 + + eval_datasets: + deepdive_val: + dataset_fn: "astraflow.dataflow.dataset.deepdive:get_deepdive_eval_dataset" + split: qa_sft # platoon: eval_split + num_val: 100 # platoon: eval_num_tasks=100 + repeat: 1 + eval_workflow: deepdive_eval + +trainer_base: + total_train_steps: 500 # v4 action format stable; train at scale for 500 iters + train_batch_size: 256 # bumped back from v2's diagnostic bs=64 + n_samples: 8 + engine: + backend: fsdp + data_parallel_size: 4 + + actor: + gradient_checkpointing: true + mb_spec: + max_tokens_per_mb: 40000 # match context_length=40001 (platoon uses 40000) + optimizer: + type: adam + lr: 3e-6 # platoon's lr + weight_decay: 0.0 + beta1: 0.9 + beta2: 0.95 + eps: 1e-8 + lr_scheduler_type: constant + gradient_clipping: 1.0 + # M2PO (we keep our loss; platoon uses CISPO) + m2_threshold: 0.01 + eps_clip: 100.0 + eps_clip_higher: 100.0 + reward_scaling: 1 + reward_bias: 0 + kl_ctl: 0.00 + kl_penalty_coef: 0.001 + ppo_n_minibatches: 4 + reward_norm: { mean_level: group, std_level: group } + adv_norm: { mean_level: batch, std_level: batch } + + ref: + path: "Qwen/Qwen3-4B-Instruct-2507" + mb_spec: + max_tokens_per_mb: 40000 + + recover: + mode: auto + freq_steps: 25 + + evaluator: + eval_at_start: false # skip v0 eval per [[eval-at-start-default-false]] + freq_steps: 20 + + stats_logger: + wandb: + mode: online + id_suffix: "uid" + +trainer_model0: + model_id: model0 + stats_logger: + wandb: + tags: ["deepdive", "recursive-agent", "qwen3-4b", "m2po", "llm-judge"] diff --git a/examples/deepdive/qwen3-4b-recursive-v7/yaml/raas.yaml b/examples/deepdive/qwen3-4b-recursive-v7/yaml/raas.yaml new file mode 100644 index 0000000..3841921 --- /dev/null +++ b/examples/deepdive/qwen3-4b-recursive-v7/yaml/raas.yaml @@ -0,0 +1,30 @@ +# ============================================================================ +# RaaS config — Inference serving instance (hardware/resources) +# Experiment: deepdive / qwen3-4b-recursive +# +# Hardware: 4x GPU, TP=1; model0 DP=4 +# Merged with experiment.yaml at launch (--config experiment.yaml --config raas.yaml) +# ============================================================================ + +rollout: + max_concurrent_rollouts: 1024 + max_concurrent_evals: 64 + pause_grace_period: 3 + enable_adaptive_availability: true + target_waiting_queue_per_dp: 4 + adaptive_step_size: 4 + load_cache_ttl_ms: 100 + +engine: + model0: + backend: sglang + data_parallel_size: 4 + +sglang: + # 40K context — matches platoon's DeepDive recipe (context_length: 40001). + # DeepDive rollouts can be long: many search calls + observations + the + # agent's own reasoning. 32K was insufficient in platoon's experience. + context_length: 40001 + mem_fraction_static: 0.8 # platoon's default + max_running_requests: null + skip_tokenizer_init: true diff --git a/examples/deepdive/qwen3-4b-recursive/yaml/experiment.yaml b/examples/deepdive/qwen3-4b-recursive/yaml/experiment.yaml index 7198af4..cb6ab7c 100644 --- a/examples/deepdive/qwen3-4b-recursive/yaml/experiment.yaml +++ b/examples/deepdive/qwen3-4b-recursive/yaml/experiment.yaml @@ -86,7 +86,7 @@ dataflow: delegation_lambda: 0.0 # platoon: _DEEPDIVE_DELEGATION_REWARD_CAP=0.0 stdout_truncate: 8000 enable_thinking: false - dump_prob: 0.05 # ~13 dumps/step at bs=256 — enough for periodic inspection + dump_prob: 0.25 # ~64 dumps/step at bs=256 — denser sampling for debugging eval_workflows: deepdive_eval: @@ -99,7 +99,7 @@ dataflow: delegation_lambda: 0.0 stdout_truncate: 8000 enable_thinking: false - dump_prob: 0.05 + dump_prob: 0.25 gconfig_overrides: n_samples: 1 temperature: 0.6 From d2b05bd53c25c87075ae65edff90e431b5897ef3 Mon Sep 17 00:00:00 2001 From: Haizhong Date: Tue, 2 Jun 2026 21:09:38 -0400 Subject: [PATCH 22/35] fix: normalize apply_chat_template output to token ids for transformers 5 transformers>=5 makes apply_chat_template(tokenize=True) return a BatchEncoding (a Mapping) instead of a flat list[int]. Workflows that did list(apply_chat_template(...)) then got the dict keys (['input_ids','attention_mask']), which were sent to the inference engine and rejected with HTTP 400, breaking every agent/recursive/multi-agent recipe on a transformers-5 env. Add a shared apply_chat_template_to_ids() helper in hf_utils that defaults tokenize=True, forwards enable_thinking with a TypeError fallback, and extracts input_ids when a Mapping is returned. Route every workflow that builds token ids through it; the recursive textcraft/oolong/deepdive workflows keep an equivalent inline guard. rlvr already passed return_dict=False and is unaffected. --- .../core/workflow/impl/actor_and_verify.py | 10 +++--- .../workflow/impl/agentbench/task_server.py | 19 ++++++----- .../agentbench/webshop_checker_workflow.py | 12 ++++--- .../workflow/impl/code_actor_and_verify.py | 10 +++--- .../workflow/impl/code_actor_and_verify_v2.py | 10 +++--- .../workflow/impl/code_actor_and_verify_v3.py | 10 +++--- .../workflow/impl/code_solve_and_select.py | 10 +++--- .../core/workflow/impl/deepdive/workflow.py | 9 +++-- astraflow/core/workflow/impl/multi_turn.py | 21 ++++++------ .../core/workflow/impl/oolong/workflow.py | 9 +++-- .../core/workflow/impl/plan_and_solve.py | 10 +++--- .../core/workflow/impl/sep_solve_and_check.py | 10 +++--- astraflow/core/workflow/impl/sm_lg_router.py | 10 +++--- .../core/workflow/impl/solve_and_check.py | 10 +++--- .../core/workflow/impl/solve_and_verify.py | 10 +++--- astraflow/core/workflow/impl/spawn.py | 20 ++++------- .../core/workflow/impl/textcraft/workflow.py | 13 ++++--- astraflow/core/workflow/utils/hf_utils.py | 34 +++++++++++++++++++ 18 files changed, 133 insertions(+), 104 deletions(-) diff --git a/astraflow/core/workflow/impl/actor_and_verify.py b/astraflow/core/workflow/impl/actor_and_verify.py index 686c68b..9390587 100644 --- a/astraflow/core/workflow/impl/actor_and_verify.py +++ b/astraflow/core/workflow/impl/actor_and_verify.py @@ -227,12 +227,10 @@ def __init__( def _apply_chat_template(self, messages, **kwargs): """Apply chat template with optional enable_thinking support.""" - try: - return list(self.tokenizer.apply_chat_template( - messages, **kwargs, enable_thinking=self.enable_thinking, - )) - except TypeError: - return list(self.tokenizer.apply_chat_template(messages, **kwargs)) + from astraflow.core.workflow.utils.hf_utils import apply_chat_template_to_ids + return apply_chat_template_to_ids( + self.tokenizer, messages, enable_thinking=self.enable_thinking, **kwargs + ) async def _actor_and_verify_one( self, diff --git a/astraflow/core/workflow/impl/agentbench/task_server.py b/astraflow/core/workflow/impl/agentbench/task_server.py index 6d16dd2..4577d90 100644 --- a/astraflow/core/workflow/impl/agentbench/task_server.py +++ b/astraflow/core/workflow/impl/agentbench/task_server.py @@ -164,15 +164,16 @@ async def arun_episode( return results_to_structured(results, prompt_id=resolve_prompt_id(data)) def _compute_user_message_delta_tokens(self, user_content: str) -> List[int]: + from astraflow.core.workflow.utils.hf_utils import apply_chat_template_to_ids ref_messages = [{"role": "assistant", "content": "X"}] - ref_tokens = list(self.tokenizer.apply_chat_template( - ref_messages, tokenize=True, enable_thinking=False - )) + ref_tokens = apply_chat_template_to_ids( + self.tokenizer, ref_messages, tokenize=True, enable_thinking=False + ) full_messages = ref_messages + [{"role": "user", "content": user_content}] - full_tokens = list(self.tokenizer.apply_chat_template( - full_messages, tokenize=True, add_generation_prompt=True, enable_thinking=False - )) + full_tokens = apply_chat_template_to_ids( + self.tokenizer, full_messages, tokenize=True, add_generation_prompt=True, enable_thinking=False + ) eos_idx = ref_tokens.index(self.tokenizer.eos_token_id) return full_tokens[eos_idx + 1:] @@ -208,12 +209,14 @@ async def _run_one_episode( messages = self.format_observation_to_messages(observation, messages) - input_ids: List[int] = list(self.tokenizer.apply_chat_template( + from astraflow.core.workflow.utils.hf_utils import apply_chat_template_to_ids + input_ids: List[int] = apply_chat_template_to_ids( + self.tokenizer, messages, add_generation_prompt=True, tokenize=True, enable_thinking=False, - )) + ) num_turns = 0 for turn in range(self.max_turns): diff --git a/astraflow/core/workflow/impl/agentbench/webshop_checker_workflow.py b/astraflow/core/workflow/impl/agentbench/webshop_checker_workflow.py index 8685f22..04cb031 100644 --- a/astraflow/core/workflow/impl/agentbench/webshop_checker_workflow.py +++ b/astraflow/core/workflow/impl/agentbench/webshop_checker_workflow.py @@ -341,12 +341,14 @@ async def _run_one_episode( messages = self.format_observation_to_messages(observation, messages) - input_ids: List[int] = list(self.tokenizer.apply_chat_template( + from astraflow.core.workflow.utils.hf_utils import apply_chat_template_to_ids + input_ids: List[int] = apply_chat_template_to_ids( + self.tokenizer, messages, add_generation_prompt=True, tokenize=True, enable_thinking=False, - )) + ) # Extract goal instruction for the checker. goal_instruction = self._extract_goal(messages) @@ -608,12 +610,14 @@ async def _run_checker( {"role": "user", "content": prompt}, ] - checker_input_ids = list(checker_tokenizer.apply_chat_template( + from astraflow.core.workflow.utils.hf_utils import apply_chat_template_to_ids + checker_input_ids = apply_chat_template_to_ids( + checker_tokenizer, checker_messages, add_generation_prompt=True, tokenize=True, enable_thinking=False, - )) + ) req = ModelRequest( rid=uuid.uuid4().hex, diff --git a/astraflow/core/workflow/impl/code_actor_and_verify.py b/astraflow/core/workflow/impl/code_actor_and_verify.py index 357a6a3..01e13f9 100644 --- a/astraflow/core/workflow/impl/code_actor_and_verify.py +++ b/astraflow/core/workflow/impl/code_actor_and_verify.py @@ -497,12 +497,10 @@ def __init__( os.makedirs(self.dump_dir, exist_ok=True) def _apply_chat_template(self, messages, **kwargs): - try: - return list(self.tokenizer.apply_chat_template( - messages, **kwargs, enable_thinking=self.enable_thinking, - )) - except TypeError: - return list(self.tokenizer.apply_chat_template(messages, **kwargs)) + from astraflow.core.workflow.utils.hf_utils import apply_chat_template_to_ids + return apply_chat_template_to_ids( + self.tokenizer, messages, enable_thinking=self.enable_thinking, **kwargs + ) async def _agenerate( self, diff --git a/astraflow/core/workflow/impl/code_actor_and_verify_v2.py b/astraflow/core/workflow/impl/code_actor_and_verify_v2.py index df2f13b..aea44fd 100644 --- a/astraflow/core/workflow/impl/code_actor_and_verify_v2.py +++ b/astraflow/core/workflow/impl/code_actor_and_verify_v2.py @@ -581,12 +581,10 @@ def __init__( def _apply_chat_template(self, messages, *, enable_thinking=None, **kwargs): if enable_thinking is None: enable_thinking = self.enable_thinking - try: - return list(self.tokenizer.apply_chat_template( - messages, **kwargs, enable_thinking=enable_thinking, - )) - except TypeError: - return list(self.tokenizer.apply_chat_template(messages, **kwargs)) + from astraflow.core.workflow.utils.hf_utils import apply_chat_template_to_ids + return apply_chat_template_to_ids( + self.tokenizer, messages, enable_thinking=enable_thinking, **kwargs + ) async def _agenerate( self, diff --git a/astraflow/core/workflow/impl/code_actor_and_verify_v3.py b/astraflow/core/workflow/impl/code_actor_and_verify_v3.py index df7d8e8..44e49fd 100644 --- a/astraflow/core/workflow/impl/code_actor_and_verify_v3.py +++ b/astraflow/core/workflow/impl/code_actor_and_verify_v3.py @@ -683,12 +683,10 @@ def __init__( def _apply_chat_template(self, messages, *, enable_thinking=None, **kwargs): if enable_thinking is None: enable_thinking = self.enable_thinking - try: - return list(self.tokenizer.apply_chat_template( - messages, **kwargs, enable_thinking=enable_thinking, - )) - except TypeError: - return list(self.tokenizer.apply_chat_template(messages, **kwargs)) + from astraflow.core.workflow.utils.hf_utils import apply_chat_template_to_ids + return apply_chat_template_to_ids( + self.tokenizer, messages, enable_thinking=enable_thinking, **kwargs + ) async def _agenerate( self, diff --git a/astraflow/core/workflow/impl/code_solve_and_select.py b/astraflow/core/workflow/impl/code_solve_and_select.py index 354b2dc..f9206af 100644 --- a/astraflow/core/workflow/impl/code_solve_and_select.py +++ b/astraflow/core/workflow/impl/code_solve_and_select.py @@ -312,12 +312,10 @@ def __init__( def _apply_chat_template(self, messages, *, enable_thinking=None, **kwargs): if enable_thinking is None: enable_thinking = self.enable_thinking - try: - return list(self.tokenizer.apply_chat_template( - messages, **kwargs, enable_thinking=enable_thinking, - )) - except TypeError: - return list(self.tokenizer.apply_chat_template(messages, **kwargs)) + from astraflow.core.workflow.utils.hf_utils import apply_chat_template_to_ids + return apply_chat_template_to_ids( + self.tokenizer, messages, enable_thinking=enable_thinking, **kwargs + ) async def _agenerate( self, diff --git a/astraflow/core/workflow/impl/deepdive/workflow.py b/astraflow/core/workflow/impl/deepdive/workflow.py index 28bb389..73995a7 100644 --- a/astraflow/core/workflow/impl/deepdive/workflow.py +++ b/astraflow/core/workflow/impl/deepdive/workflow.py @@ -302,14 +302,19 @@ def _apply_chat_template(self, messages: list[dict], add_generation_prompt: bool return_tensors=None, ) try: - return self.tokenizer.apply_chat_template( + out = self.tokenizer.apply_chat_template( messages, tokenize=True, enable_thinking=self.enable_thinking, **kwargs, ) except TypeError: - return self.tokenizer.apply_chat_template(messages, tokenize=True, **kwargs) + out = self.tokenizer.apply_chat_template(messages, tokenize=True, **kwargs) + # transformers>=5 returns a BatchEncoding (a Mapping, not a list) when + # tokenize=True; older versions return a flat list[int]. + if hasattr(out, "keys"): + out = out["input_ids"] + return list(out) def _build_initial_messages(self, task: Task, is_root: bool) -> list[dict]: system = MAIN_SYSTEM_PROMPT if is_root else SUB_SYSTEM_PROMPT diff --git a/astraflow/core/workflow/impl/multi_turn.py b/astraflow/core/workflow/impl/multi_turn.py index b25d3b0..298d0d2 100644 --- a/astraflow/core/workflow/impl/multi_turn.py +++ b/astraflow/core/workflow/impl/multi_turn.py @@ -53,8 +53,9 @@ def __init__( os.makedirs(self.dump_dir, exist_ok=True) # Create tokens that should be amended if the answer is incorrect. + from astraflow.core.workflow.utils.hf_utils import apply_chat_template_to_ids messages = [{"role": "assistant", "content": "some random message."}] - s1 = list(self.tokenizer.apply_chat_template(messages, tokenize=True)) + s1 = apply_chat_template_to_ids(self.tokenizer, messages, tokenize=True) messages += [ { "role": "user", @@ -62,10 +63,8 @@ def __init__( "Please carefully read the original question, check the previous errors, and try to answer it again.", } ] - s2 = list( - self.tokenizer.apply_chat_template( - messages, tokenize=True, add_generation_prompt=True - ) + s2 = apply_chat_template_to_ids( + self.tokenizer, messages, tokenize=True, add_generation_prompt=True ) self.multi_turn_prompt_ids = s2[len(s1) :] @@ -74,12 +73,12 @@ async def _run_one_episode( ) -> tuple[dict[str, torch.Tensor], str, str, float, int]: seq, logprobs, loss_mask, versions = [], [], [], [] messages = data["messages"] - input_ids: list[int] = list( - self.tokenizer.apply_chat_template( - messages, - tokenize=True, - add_generation_prompt=True, - ) + from astraflow.core.workflow.utils.hf_utils import apply_chat_template_to_ids + input_ids: list[int] = apply_chat_template_to_ids( + self.tokenizer, + messages, + tokenize=True, + add_generation_prompt=True, ) t = 0 reward = 0.0 diff --git a/astraflow/core/workflow/impl/oolong/workflow.py b/astraflow/core/workflow/impl/oolong/workflow.py index 1994924..0a25f9b 100644 --- a/astraflow/core/workflow/impl/oolong/workflow.py +++ b/astraflow/core/workflow/impl/oolong/workflow.py @@ -264,14 +264,19 @@ def _apply_chat_template(self, messages: list[dict], add_generation_prompt: bool ) # Qwen3-Instruct supports a thinking-mode toggle; default off for parity. try: - return self.tokenizer.apply_chat_template( + out = self.tokenizer.apply_chat_template( messages, tokenize=True, enable_thinking=self.enable_thinking, **kwargs, ) except TypeError: - return self.tokenizer.apply_chat_template(messages, tokenize=True, **kwargs) + out = self.tokenizer.apply_chat_template(messages, tokenize=True, **kwargs) + # transformers>=5 returns a BatchEncoding (a Mapping, not a list) when + # tokenize=True; older versions return a flat list[int]. + if hasattr(out, "keys"): + out = out["input_ids"] + return list(out) def _build_initial_messages(self, task: Task, is_root: bool) -> list[dict]: system = MAIN_SYSTEM_PROMPT if is_root else SUB_SYSTEM_PROMPT diff --git a/astraflow/core/workflow/impl/plan_and_solve.py b/astraflow/core/workflow/impl/plan_and_solve.py index ce7a32d..96f9d45 100644 --- a/astraflow/core/workflow/impl/plan_and_solve.py +++ b/astraflow/core/workflow/impl/plan_and_solve.py @@ -147,12 +147,10 @@ def __init__( def _apply_chat_template(self, messages, tokenizer=None, **kwargs): """Apply chat template with optional enable_thinking support.""" tok = tokenizer or self.tokenizer - try: - return list(tok.apply_chat_template( - messages, **kwargs, enable_thinking=self.enable_thinking, - )) - except TypeError: - return list(tok.apply_chat_template(messages, **kwargs)) + from astraflow.core.workflow.utils.hf_utils import apply_chat_template_to_ids + return apply_chat_template_to_ids( + tok, messages, enable_thinking=self.enable_thinking, **kwargs + ) def _compute_transition_ids(self) -> list[int]: """Compute the transition tokens between planner output and solver input. diff --git a/astraflow/core/workflow/impl/sep_solve_and_check.py b/astraflow/core/workflow/impl/sep_solve_and_check.py index caedf03..fcdfcf2 100644 --- a/astraflow/core/workflow/impl/sep_solve_and_check.py +++ b/astraflow/core/workflow/impl/sep_solve_and_check.py @@ -169,12 +169,10 @@ def __init__( def _apply_chat_template(self, messages, **kwargs): """Apply chat template with optional enable_thinking support.""" - try: - return list(self.tokenizer.apply_chat_template( - messages, **kwargs, enable_thinking=self.enable_thinking, - )) - except TypeError: - return list(self.tokenizer.apply_chat_template(messages, **kwargs)) + from astraflow.core.workflow.utils.hf_utils import apply_chat_template_to_ids + return apply_chat_template_to_ids( + self.tokenizer, messages, enable_thinking=self.enable_thinking, **kwargs + ) async def _solve_and_check_one( self, diff --git a/astraflow/core/workflow/impl/sm_lg_router.py b/astraflow/core/workflow/impl/sm_lg_router.py index 35ab671..c8425f7 100644 --- a/astraflow/core/workflow/impl/sm_lg_router.py +++ b/astraflow/core/workflow/impl/sm_lg_router.py @@ -234,12 +234,10 @@ def __init__( def _apply_chat_template(self, messages, **kwargs): """Apply chat template with optional enable_thinking support.""" - try: - return list(self.tokenizer.apply_chat_template( - messages, **kwargs, enable_thinking=self.enable_thinking, - )) - except TypeError: - return list(self.tokenizer.apply_chat_template(messages, **kwargs)) + from astraflow.core.workflow.utils.hf_utils import apply_chat_template_to_ids + return apply_chat_template_to_ids( + self.tokenizer, messages, enable_thinking=self.enable_thinking, **kwargs + ) async def _generate( self, diff --git a/astraflow/core/workflow/impl/solve_and_check.py b/astraflow/core/workflow/impl/solve_and_check.py index e55716e..1958430 100644 --- a/astraflow/core/workflow/impl/solve_and_check.py +++ b/astraflow/core/workflow/impl/solve_and_check.py @@ -127,12 +127,10 @@ def __init__( def _apply_chat_template(self, messages, **kwargs): """Apply chat template with optional enable_thinking support.""" - try: - return list(self.tokenizer.apply_chat_template( - messages, **kwargs, enable_thinking=self.enable_thinking, - )) - except TypeError: - return list(self.tokenizer.apply_chat_template(messages, **kwargs)) + from astraflow.core.workflow.utils.hf_utils import apply_chat_template_to_ids + return apply_chat_template_to_ids( + self.tokenizer, messages, enable_thinking=self.enable_thinking, **kwargs + ) def _compute_transition_ids(self, problem_text: str) -> list[int]: """Compute the transition tokens between solver output and checker input. diff --git a/astraflow/core/workflow/impl/solve_and_verify.py b/astraflow/core/workflow/impl/solve_and_verify.py index e85be73..7421ff5 100644 --- a/astraflow/core/workflow/impl/solve_and_verify.py +++ b/astraflow/core/workflow/impl/solve_and_verify.py @@ -238,12 +238,10 @@ def __init__( def _apply_chat_template(self, messages, **kwargs): """Apply chat template with optional enable_thinking support.""" - try: - return list(self.tokenizer.apply_chat_template( - messages, **kwargs, enable_thinking=self.enable_thinking, - )) - except TypeError: - return list(self.tokenizer.apply_chat_template(messages, **kwargs)) + from astraflow.core.workflow.utils.hf_utils import apply_chat_template_to_ids + return apply_chat_template_to_ids( + self.tokenizer, messages, enable_thinking=self.enable_thinking, **kwargs + ) async def _solve_and_verify_one( self, diff --git a/astraflow/core/workflow/impl/spawn.py b/astraflow/core/workflow/impl/spawn.py index ad0760d..4781f90 100644 --- a/astraflow/core/workflow/impl/spawn.py +++ b/astraflow/core/workflow/impl/spawn.py @@ -179,19 +179,13 @@ def __init__( # ------------------------------------------------------------------ helpers def _apply_chat_template(self, messages, add_generation_prompt: bool = True): - try: - return list(self.tokenizer.apply_chat_template( - messages, - tokenize=True, - add_generation_prompt=add_generation_prompt, - enable_thinking=self.enable_thinking, - )) - except TypeError: - return list(self.tokenizer.apply_chat_template( - messages, - tokenize=True, - add_generation_prompt=add_generation_prompt, - )) + from astraflow.core.workflow.utils.hf_utils import apply_chat_template_to_ids + return apply_chat_template_to_ids( + self.tokenizer, + messages, + add_generation_prompt=add_generation_prompt, + enable_thinking=self.enable_thinking, + ) def _build_main_input_ids(self, data: dict[str, Any]) -> list[int]: """Main agent sees the spawn-tool system prompt + the original messages.""" diff --git a/astraflow/core/workflow/impl/textcraft/workflow.py b/astraflow/core/workflow/impl/textcraft/workflow.py index 7ff9412..c6f3251 100644 --- a/astraflow/core/workflow/impl/textcraft/workflow.py +++ b/astraflow/core/workflow/impl/textcraft/workflow.py @@ -316,16 +316,21 @@ def __init__( def _apply_chat_template(self, messages: list[dict], add_generation_prompt: bool) -> list[int]: try: - return list(self.tokenizer.apply_chat_template( + out = self.tokenizer.apply_chat_template( messages, tokenize=True, add_generation_prompt=add_generation_prompt, enable_thinking=self.enable_thinking, - )) + ) except TypeError: - return list(self.tokenizer.apply_chat_template( + out = self.tokenizer.apply_chat_template( messages, tokenize=True, add_generation_prompt=add_generation_prompt, - )) + ) + # transformers>=5 returns a BatchEncoding (a Mapping, not a list) when + # tokenize=True; older versions return a flat list[int]. + if hasattr(out, "keys"): + out = out["input_ids"] + return list(out) def _build_initial_messages( self, task: Task, env: TextCraftEnv, is_root: bool diff --git a/astraflow/core/workflow/utils/hf_utils.py b/astraflow/core/workflow/utils/hf_utils.py index 7b830b6..99d4933 100644 --- a/astraflow/core/workflow/utils/hf_utils.py +++ b/astraflow/core/workflow/utils/hf_utils.py @@ -27,6 +27,40 @@ def load_hf_tokenizer( return tokenizer +def apply_chat_template_to_ids( + tokenizer, + messages, + *, + enable_thinking: bool | None = None, + **kwargs, +) -> list[int]: + """Apply a chat template and return a flat ``list[int]`` of token ids. + + Normalizes across transformers versions. transformers>=5 makes + ``apply_chat_template(tokenize=True)`` return a ``BatchEncoding`` (a + Mapping) instead of a flat ``list[int]``; calling ``list(...)`` on that + yields the dict keys (``["input_ids", "attention_mask"]``) rather than + tokens, which then get sent to the inference engine and rejected. We + extract ``input_ids`` whenever a mapping is returned. + + ``enable_thinking`` is forwarded only when the tokenizer's chat template + accepts it (older templates raise ``TypeError``), matching the prior + per-workflow ``_apply_chat_template`` behavior. + """ + kwargs.setdefault("tokenize", True) + try: + out = tokenizer.apply_chat_template( + messages, + **({"enable_thinking": enable_thinking} if enable_thinking is not None else {}), + **kwargs, + ) + except TypeError: + out = tokenizer.apply_chat_template(messages, **kwargs) + if hasattr(out, "keys"): # BatchEncoding (transformers>=5) -> token-id list + out = out["input_ids"] + return list(out) + + @lru_cache(maxsize=8) def load_hf_processor_and_tokenizer( model_name_or_path: str, From f427cd99fb766f84c3b8c9027ecf93be70f5109a Mon Sep 17 00:00:00 2001 From: Haizhong Date: Tue, 2 Jun 2026 21:09:44 -0400 Subject: [PATCH 23/35] fix: cap textcraft recursive max_concurrent_rollouts at 512 At 2048 the recursive agent tree fans out to ~16k concurrent generate requests, saturating the 4-GPU SGLang so no episode ever completes and the trainer hangs at step 0 waiting for data. 512 keeps the live agent count ~2.4k and lets episodes finish; validated across a full 105-step run and a clean 5-recipe smoke test on sglang 0.5.12. --- examples/textcraft/qwen3-4b-recursive/yaml/raas.yaml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/examples/textcraft/qwen3-4b-recursive/yaml/raas.yaml b/examples/textcraft/qwen3-4b-recursive/yaml/raas.yaml index 93693ef..c0128fe 100644 --- a/examples/textcraft/qwen3-4b-recursive/yaml/raas.yaml +++ b/examples/textcraft/qwen3-4b-recursive/yaml/raas.yaml @@ -10,9 +10,11 @@ # ============================================================================ rollout: - # n_samples=8 × train_batch_size=32 × MAX_BREADTH=4 worst-case branching - # could exceed the math recipe's 1024 cap during deep spawns. - max_concurrent_rollouts: 2048 + # Recursive fan-out multiplies this by the agent-tree size: at 2048 the live + # agent count hit ~16k concurrent requests, starving a 4-GPU SGLang so no + # episode ever completed (trainer stuck at step 0). 512 -> ~2.4k concurrent + # agents, validated to complete steps on sglang 0.5.12 + train_batch_size=512. + max_concurrent_rollouts: 512 max_concurrent_evals: 64 pause_grace_period: 3 enable_adaptive_availability: true From cf7b2708e80391e62a7b444c4082e1354689c7ca Mon Sep 17 00:00:00 2001 From: Haizhong Date: Tue, 2 Jun 2026 22:16:42 -0400 Subject: [PATCH 24/35] chore: remove oolong workflow, reward, dataset, and recipes Oolong is not supported in the latest version. Remove the oolong_recursive workflow (env, tasks, eval_helpers, tests, jsonl data), the oolong_success reward stub, the oolong dataset loaders, and both examples/oolong recipes. Drop the two oolong import lines from the workflow package __init__ and a stale "Oolong" mention in the deepdive recipe comments. The workflow and reward registries load cleanly without oolong; no references remain in source. --- astraflow/core/workflow/__init__.py | 2 - .../core/workflow/impl/oolong/__init__.py | 16 - astraflow/core/workflow/impl/oolong/env.py | 248 ------- .../core/workflow/impl/oolong/eval_helpers.py | 187 ----- astraflow/core/workflow/impl/oolong/tasks.py | 139 ---- .../core/workflow/impl/oolong/test_env.py | 237 ------- .../workflow/impl/oolong/test_eval_helpers.py | 164 ----- .../workflow/impl/oolong/test_workflow.py | 150 ---- .../core/workflow/impl/oolong/workflow.py | 669 ------------------ .../core/workflow/reward/oolong_success.py | 23 - astraflow/dataflow/dataset/oolong.py | 98 --- .../yaml/experiment.yaml | 2 +- .../qwen3-4b-recursive/yaml/experiment.yaml | 2 +- .../scripts/1_astraflow.sh | 36 - .../qwen3-4b-recursive-real/scripts/2_raas.sh | 44 -- .../scripts/3_trainer_model0.sh | 47 -- .../scripts/run_qwen3-4b-recursive.sh | 116 --- .../yaml/experiment.yaml | 180 ----- .../qwen3-4b-recursive-real/yaml/raas.yaml | 30 - .../qwen3-4b-recursive/scripts/1_astraflow.sh | 36 - .../qwen3-4b-recursive/scripts/2_raas.sh | 44 -- .../scripts/3_trainer_model0.sh | 47 -- .../scripts/run_qwen3-4b-recursive.sh | 116 --- .../qwen3-4b-recursive/yaml/experiment.yaml | 171 ----- .../oolong/qwen3-4b-recursive/yaml/raas.yaml | 30 - 25 files changed, 2 insertions(+), 2832 deletions(-) delete mode 100644 astraflow/core/workflow/impl/oolong/__init__.py delete mode 100644 astraflow/core/workflow/impl/oolong/env.py delete mode 100644 astraflow/core/workflow/impl/oolong/eval_helpers.py delete mode 100644 astraflow/core/workflow/impl/oolong/tasks.py delete mode 100644 astraflow/core/workflow/impl/oolong/test_env.py delete mode 100644 astraflow/core/workflow/impl/oolong/test_eval_helpers.py delete mode 100644 astraflow/core/workflow/impl/oolong/test_workflow.py delete mode 100644 astraflow/core/workflow/impl/oolong/workflow.py delete mode 100644 astraflow/core/workflow/reward/oolong_success.py delete mode 100644 astraflow/dataflow/dataset/oolong.py delete mode 100755 examples/oolong/qwen3-4b-recursive-real/scripts/1_astraflow.sh delete mode 100755 examples/oolong/qwen3-4b-recursive-real/scripts/2_raas.sh delete mode 100755 examples/oolong/qwen3-4b-recursive-real/scripts/3_trainer_model0.sh delete mode 100755 examples/oolong/qwen3-4b-recursive-real/scripts/run_qwen3-4b-recursive.sh delete mode 100644 examples/oolong/qwen3-4b-recursive-real/yaml/experiment.yaml delete mode 100644 examples/oolong/qwen3-4b-recursive-real/yaml/raas.yaml delete mode 100755 examples/oolong/qwen3-4b-recursive/scripts/1_astraflow.sh delete mode 100755 examples/oolong/qwen3-4b-recursive/scripts/2_raas.sh delete mode 100755 examples/oolong/qwen3-4b-recursive/scripts/3_trainer_model0.sh delete mode 100755 examples/oolong/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh delete mode 100644 examples/oolong/qwen3-4b-recursive/yaml/experiment.yaml delete mode 100644 examples/oolong/qwen3-4b-recursive/yaml/raas.yaml diff --git a/astraflow/core/workflow/__init__.py b/astraflow/core/workflow/__init__.py index 1b5aa58..3c95304 100644 --- a/astraflow/core/workflow/__init__.py +++ b/astraflow/core/workflow/__init__.py @@ -26,7 +26,6 @@ import astraflow.core.workflow.impl.sm_lg_router import astraflow.core.workflow.impl.spawn import astraflow.core.workflow.impl.textcraft.workflow # registers recursive_agent -import astraflow.core.workflow.impl.oolong.workflow # registers oolong_recursive import astraflow.core.workflow.impl.deepdive.workflow # registers deepdive_recursive import astraflow.core.workflow.impl.vision_rlvr import astraflow.core.workflow.reward.clevr_count_70k @@ -35,5 +34,4 @@ import astraflow.core.workflow.reward.human_eval_reward import astraflow.core.workflow.reward.livecodebench_reward import astraflow.core.workflow.reward.textcraft_success # noqa: F401 -import astraflow.core.workflow.reward.oolong_success # noqa: F401 import astraflow.core.workflow.reward.deepdive_success # noqa: F401 diff --git a/astraflow/core/workflow/impl/oolong/__init__.py b/astraflow/core/workflow/impl/oolong/__init__.py deleted file mode 100644 index ba264ae..0000000 --- a/astraflow/core/workflow/impl/oolong/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -"""Oolong recursive-agent workflow for long-context aggregation. - -Port of platoon's Oolong setup (see `claude-doc/oolong-plan.md`): -- workflow_cls: oolong_recursive -- Python sandbox env: stateful exec() namespace per agent, pre-populated - with `context`, `finish`, `launch_subagent`, and `asyncio`. -- Agent emits `......` blocks; the - Python may call `finish(answer)` or `await launch_subagent(goal, context)`. -- Reward (per Gandhi et al. 2026, "Recursive Agent Optimization"): - R(X) = success(X) + lambda * mean(success(children)) - with lambda=0.4 by default for Oolong (paper's choice for OOLONG-REAL). -""" - -# Importing workflow triggers registration of the `oolong_recursive` -# workflow_cls via @register_workflow. -from astraflow.core.workflow.impl.oolong import workflow # noqa: F401 diff --git a/astraflow/core/workflow/impl/oolong/env.py b/astraflow/core/workflow/impl/oolong/env.py deleted file mode 100644 index 6af8ca0..0000000 --- a/astraflow/core/workflow/impl/oolong/env.py +++ /dev/null @@ -1,248 +0,0 @@ -"""Per-agent Python sandbox env for Oolong. - -Each agent gets a stateful exec() namespace pre-populated with: - - `context: str` -- the (potentially huge) text to process - - `asyncio` module - - `finish(answer: Any) -> None` -- raises FinishSignal to end the episode - - `launch_subagent(goal: str, context: str = "") -> str` -- async callback - into the workflow that spawns a child agent and returns its finish text. - -State persists across turns: variables defined in turn N are visible in -turn N+1. Top-level `await` is supported via `PyCF_ALLOW_TOP_LEVEL_AWAIT`. - -Reward is computed at finish() time via the platoon-ported scorers in -`eval_helpers.py`. For oolong-real the scorer is a placeholder (=0.0) -until we add an LLM judge. -""" - -from __future__ import annotations - -import ast -import asyncio -import io -import json -import textwrap -import traceback -from contextlib import redirect_stderr, redirect_stdout -from dataclasses import dataclass -from typing import Any, Awaitable, Callable - -from astraflow.core.workflow.impl.oolong.eval_helpers import ( - dnd_process_response, - synth_process_response, -) -from astraflow.core.workflow.impl.oolong.tasks import Task -from astraEnv.judge import extract_json, judge - - -# Rubric sent to the LLM judge when grading a sub-agent's finish_message -# against its delegated goal. Sub-agents have no rule-based verifier (their -# goals are free-form strings produced by the parent), so we ask an external -# LLM to score the answer. Keep this short and unambiguous. -_SUBAGENT_RUBRIC_SYSTEM = ( - "You grade a sub-agent's output against its delegated goal.\n" - 'Return ONLY JSON: {"score": float in [0,1], "reason": ""}\n' - "1.0 = output fully and correctly satisfies the goal. " - "0.5 = partially correct. " - "0.0 = wrong, empty, or a refusal.\n" - "Do not include any other text — JSON only." -) - - -# Sentinel exception used to terminate the agent's code when finish() is -# called. Carries the answer payload. -class FinishSignal(Exception): - def __init__(self, payload: Any): - super().__init__("FinishSignal") - self.payload = payload - - -# Cap how much sandbox stdout we surface back to the model per turn. -# Oolong agents like to `print(context)`, which can be >50k chars. We -# truncate to keep the chat history manageable; agents can chunk explicitly. -DEFAULT_STDOUT_TRUNCATE = 8000 - - -# Signature: launch_subagent(goal, context) -> finish_message_string. -# The workflow injects this when constructing the env. -SpawnCallback = Callable[[str, str], Awaitable[str]] - - -@dataclass -class ExecResult: - """One Python code execution result.""" - stdout: str - stderr: str - error: str | None # traceback string if user code raised - truncated: bool - - -class OolongEnv: - """Stateful Python sandbox for one agent.""" - - def __init__( - self, - task: Task, - spawn_callback: SpawnCallback | None = None, - stdout_truncate: int = DEFAULT_STDOUT_TRUNCATE, - use_llm_judge: bool = False, - judge_model: str | None = None, - ): - self.task = task - self.stdout_truncate = stdout_truncate - self._spawn_cb = spawn_callback - # When True, sub-agent tasks (task_id without the "oolong." prefix) - # are graded by an LLM judge via astraEnv.judge. When False, they - # return score=0.0 with a placeholder reason (legacy behavior). - self.use_llm_judge = bool(use_llm_judge) - self.judge_model = judge_model - - self.finished: bool = False - self.finish_payload: Any | None = None - - # Per-agent telemetry, mirroring TextCraft. - self.subagent_launched: int = 0 - self.subagent_succeeded: float = 0.0 - - # The stateful namespace. Pre-populate the helpers the agent needs. - ctx = str(task.misc.get("context", "")) - self.globals: dict[str, Any] = { - "__name__": "__oolong_sandbox__", - "__builtins__": __builtins__, - "asyncio": asyncio, - "context": ctx, - "finish": self._finish, - "launch_subagent": self._launch_subagent, - "json": json, - } - - # ---------------------------- exposed Python API -------------------------- - - def _finish(self, answer: Any) -> None: - raise FinishSignal(answer) - - async def _launch_subagent(self, goal: str, context: str = "") -> str: - """Async callback into the workflow to spawn a child agent. - - Returns the child's finish_message string (or an empty string if the - child never finished cleanly). - """ - if self._spawn_cb is None: - raise RuntimeError( - "launch_subagent called but no spawn_callback was injected by the workflow" - ) - self.subagent_launched += 1 - result = await self._spawn_cb(str(goal), str(context)) - # Caller's "success" telemetry is tracked at the workflow level (we - # do not know the child's reward here without a round-trip). - return result - - # ----------------------------- code execution ----------------------------- - - async def run_code(self, code: str) -> ExecResult: - """Execute one block of Python code in the persistent namespace. - - Supports top-level `await` (e.g. `await launch_subagent(...)`). - Captures stdout/stderr, truncates if huge. - """ - # Compile with top-level-await support so the code may use `await` - # directly (without us wrapping it in an `async def`). - flags = ast.PyCF_ALLOW_TOP_LEVEL_AWAIT - finish_payload: Any = None - - stdout_buf = io.StringIO() - stderr_buf = io.StringIO() - err_str: str | None = None - - try: - compiled = compile(textwrap.dedent(code), "", "exec", flags=flags) - except SyntaxError as e: - return ExecResult(stdout="", stderr=str(e), error=f"SyntaxError: {e}", truncated=False) - - try: - with redirect_stdout(stdout_buf), redirect_stderr(stderr_buf): - # eval(compiled, ...) returns either None or a coroutine, - # depending on whether the code contained top-level await. - result = eval(compiled, self.globals) - if asyncio.iscoroutine(result): - await result - except FinishSignal as fs: - finish_payload = fs.payload - self.finished = True - self.finish_payload = finish_payload - except Exception: - err_str = traceback.format_exc(limit=10) - - out = stdout_buf.getvalue() - err = stderr_buf.getvalue() - truncated = False - if len(out) > self.stdout_truncate: - out = out[: self.stdout_truncate] + f"\n[... stdout truncated, total={len(stdout_buf.getvalue())} chars ...]" - truncated = True - return ExecResult(stdout=out, stderr=err, error=err_str, truncated=truncated) - - # ----------------------------- evaluation --------------------------------- - - async def evaluate(self) -> tuple[float, dict[str, Any]]: - """Reward for THIS agent. Called at the agent's finish() time. - - Routes to the right grader based on task_id prefix: - - oolong.synth.* -> rule-based synth_process_response - - oolong.real.* -> dnd_process_response (placeholder for now) - - synthetic sub-agent task ids (no "oolong." prefix) -> - LLM judge via astraEnv.judge if self.use_llm_judge, - else 0.0 placeholder. - """ - if not self.finished: - return 0.0, {"reason": "agent never called finish()"} - - task_id = self.task.id or "" - output = "" if self.finish_payload is None else str(self.finish_payload) - - # Sub-agent task IDs inherit the parent's prefix and have a "/sub_" - # marker (assigned in workflow._make_spawn_callback). Route them to - # the LLM-judge path regardless of the dataset prefix. - is_subagent = "/sub_" in task_id - if not is_subagent and task_id.startswith("oolong.synth."): - r = synth_process_response(self.task.misc, output) - elif not is_subagent and task_id.startswith("oolong.real."): - r = dnd_process_response(self.task.misc, output) - elif self.use_llm_judge: - r = await self._grade_subagent_with_llm(output) - else: - r = {"score": 0.0, "reason": "no node-local verifier (LLM judge disabled)"} - - return float(r.get("score", 0.0)), r - - async def _grade_subagent_with_llm(self, output: str) -> dict[str, Any]: - """Send (goal, output) to the LLM judge and parse the score. - - On any failure (network, parse, missing field) returns score=0.0 - with the error in `reason` so a flaky judge never crashes a rollout. - """ - user = f"GOAL: {self.task.goal}\n\nOUTPUT: {output}" - judge_kwargs: dict[str, Any] = {} - if self.judge_model: - judge_kwargs["model"] = self.judge_model - try: - raw = await judge( - system=_SUBAGENT_RUBRIC_SYSTEM, user=user, **judge_kwargs - ) - except Exception as e: - return {"score": 0.0, "reason": f"judge call failed: {e}"} - try: - parsed = extract_json(raw) - score = float(parsed["score"]) - except Exception as e: - return { - "score": 0.0, - "reason": f"judge response unparseable: {e}", - "judge_raw": raw, - } - # Clamp defensively in case the model returns out-of-range. - score = max(0.0, min(1.0, score)) - return { - "score": score, - "reason": str(parsed.get("reason", "")), - "judge_raw": raw, - } diff --git a/astraflow/core/workflow/impl/oolong/eval_helpers.py b/astraflow/core/workflow/impl/oolong/eval_helpers.py deleted file mode 100644 index 7c3c18e..0000000 --- a/astraflow/core/workflow/impl/oolong/eval_helpers.py +++ /dev/null @@ -1,187 +0,0 @@ -"""Rule-based graders for oolong-synth (ported from platoon). - -Source: - https://github.com/abertsch72/oolong/blob/main/src/eval/eval_helpers.py - platoon/plugins/oolong/platoon/oolong/eval_helpers.py - -We only port the synth scorer for now; oolong-real requires an LLM judge -which we defer to a follow-up (see Appendix A.7 of arxiv 2605.06639). -""" - -from __future__ import annotations - -import ast -import re -from datetime import datetime -from typing import Any - -try: - import dateutil.parser # type: ignore[import-untyped] - _HAS_DATEUTIL = True -except ImportError: - _HAS_DATEUTIL = False - - -def synth_attempt_answer_parse(answer: str) -> tuple[str, str]: - """Extract the candidate answer string from the agent's finish() output. - - Returns (candidate, parse_confidence in {"low","med","high","vhigh"}). - """ - parse_confidence = "low" - if ":" not in answer: # bad start - if len(answer) < 20: # short, return the whole thing - return answer, parse_confidence - return answer.split()[-1], parse_confidence - - candidate = answer.split(":")[-1].strip() - candidate = candidate.replace("*", "") # strip markdown bold - candidate = candidate.replace("[", "").replace("]", "") # strip brackets - - parse_confidence = "med" - if any(tok in answer for tok in ("User:", "Answer:", "Date:", "Label")): - parse_confidence = "high" - - if len(candidate) < 20: - parse_confidence = "vhigh" - elif "more common" in candidate: - candidate = "more common" - elif "less common" in candidate: - candidate = "less common" - elif "same frequency" in candidate: - candidate = "same frequency" - - return candidate, parse_confidence - - -def synth_process_response(datapoint: dict[str, Any], output: str) -> dict[str, Any]: - """Compute (score, parse_confidence) for an oolong-synth task. - - Matches platoon's `synth_process_response` semantics: - - exact-string match -> 1.0 - - NUMERIC: 0.75 ** |gold - pred| partial credit - - DATE: dateutil-parsed equality - - COMPARISON wording: substring match - - else: 0.0 - """ - answer_str = datapoint["answer"] - answer_type = datapoint.get("answer_type", "") - - # Parse gold: stored as a Python list literal like "[47]" or "['spam']", - # or a datetime stamp for date answer types. - if "datetime" not in answer_str: - try: - gold = ast.literal_eval(answer_str)[0] - except (ValueError, SyntaxError, IndexError, TypeError): - return {"score": 0.0, "parse_confidence": "low", - "reason": f"Could not parse gold answer: {answer_str!r}"} - else: - try: - gold = datetime.strptime(answer_str, "[datetime.date(%Y, %m, %d)]") - except (ValueError, TypeError): - return {"score": 0.0, "parse_confidence": "low", - "reason": f"Could not parse gold date: {answer_str!r}"} - - trimmed, parse_confidence = synth_attempt_answer_parse(output) - - score = 0.0 - if str(trimmed) == str(gold): - score = 1.0 - elif str(trimmed) in ("more common", "less common", "same frequency"): - if str(trimmed) in str(gold): - score = 1.0 - elif answer_type == "ANSWER_TYPE.NUMERIC": - try: - t = int(trimmed) - g = int(gold) - score = 0.75 ** abs(g - t) - except (ValueError, TypeError): - parse_confidence = "low" # didn't parse as a number — bad sign - elif answer_type == "ANSWER_TYPE.DATE": - if _HAS_DATEUTIL: - try: - t = dateutil.parser.parse(str(trimmed)) - score = 1.0 if t == gold else 0.0 - except (ValueError, TypeError): - parse_confidence = "low" - else: - parse_confidence = "low" - - return { - "score": float(score), - "parse_confidence": parse_confidence, - "candidate": trimmed, - "gold": str(gold), - } - - -# -------------------------------------------------------------------------- -# oolong-real (D&D) grader — rule-based, ported faithfully from platoon's -# `dnd_process_response` (plugins/oolong/platoon/oolong/eval_helpers.py). -# -# Contrary to what one might expect, oolong-real does NOT use an LLM judge: -# the dataset's gold answers are typed (int / str / list[str]) and admit -# rule-based scoring with partial credit. The model is expected to wrap its -# final answer in \boxed{...} (math-style); if missing we fall back to the -# raw output with lower parse_confidence. -# -------------------------------------------------------------------------- - - -def dnd_parse_answer(answer: str) -> int | str | list[str]: - """Coerce a string into int / str / list[str] based on content shape.""" - try: - return int(answer) - except ValueError: - pass - if "," in answer: - return [item.strip() for item in answer.split(",") if item.strip()] - return answer - - -def dnd_parse_response(answer: str) -> tuple[int | str | list[str], str]: - """Extract the candidate answer + parse_confidence label. - - Order of preference: - 1. ``\\boxed{\\text{X}}`` -> high confidence - 2. ``\\boxed{X}`` -> high confidence - 3. raw stripped output -> med confidence - 4. empty -> low confidence - """ - answer = answer.strip() - match = re.search(r"\\boxed\{\\text\{([^}]*)\}\}", answer) - if not match: - match = re.search(r"\\boxed\{([^}]*)\}", answer) - if match: - return dnd_parse_answer(match.group(1)), "high" - if not answer: - return answer, "low" - return dnd_parse_answer(answer), "med" - - -def dnd_process_response(datapoint: dict[str, Any], output: str) -> dict[str, Any]: - """Score a model answer against a D&D gold answer. - - Type-aware scoring: - - int vs int : ``0.75 ** |gap|`` (partial credit, decay) - - str vs str : exact match after strip().lower() -> 0 or 1 - - list vs list : Jaccard overlap |gold & pred| / |gold| - - type mismatch : 0.0 - """ - gold = dnd_parse_answer(datapoint["answer"]) - trimmed_output, parse_confidence = dnd_parse_response(output) - - score = 0.0 - if isinstance(gold, int) and isinstance(trimmed_output, int): - score = 0.75 ** abs(gold - trimmed_output) - elif isinstance(gold, str) and isinstance(trimmed_output, str): - score = float(gold.strip().lower() == trimmed_output.strip().lower()) - elif isinstance(gold, list) and isinstance(trimmed_output, list): - overlap = set(gold) & set(trimmed_output) - score = len(overlap) / len(gold) if gold else 0.0 - - return { - "score": float(score), - "parse_confidence": parse_confidence, - "attempted_parse": trimmed_output, - "gold": gold, - "full_answer": output, - } diff --git a/astraflow/core/workflow/impl/oolong/tasks.py b/astraflow/core/workflow/impl/oolong/tasks.py deleted file mode 100644 index c0ea9a2..0000000 --- a/astraflow/core/workflow/impl/oolong/tasks.py +++ /dev/null @@ -1,139 +0,0 @@ -"""Task loading for Oolong from HuggingFace, with on-disk JSONL cache. - -Mirrors the platoon loader (oolong-synth / oolong-real). On first call -we hit HuggingFace (`oolongbench/oolong-synth` / `oolong-real`), cache the -examples to `/oolong_{dataset}_{split}.jsonl`, and from then on -load from disk. - -A `Task` here is a lightweight dataclass mirroring platoon's: - Task(goal=question, id=task_id, max_steps=..., misc={...example...}) -""" - -from __future__ import annotations - -import json -import os -from copy import deepcopy -from dataclasses import dataclass, field -from pathlib import Path -from typing import Any, Literal - -_DATA_DIR = Path(__file__).parent -_VALID_DATASETS = ("synth", "real") -_DEFAULT_MAX_STEPS = 50 - -_TASKS: dict[str, "Task"] = {} -_RAW_BY_FILE: dict[Path, list[dict[str, Any]]] = {} - - -@dataclass -class Task: - """Lightweight task carrier matching platoon's shape.""" - goal: str - id: str - max_steps: int = _DEFAULT_MAX_STEPS - misc: dict[str, Any] = field(default_factory=dict) - - -def _hf_name(dataset: str) -> str: - return f"oolongbench/oolong-{dataset}" - - -def _load_from_hf(dataset: str, split: str) -> list[dict[str, Any]]: - """Hit HF; return list of dicts.""" - try: - from datasets import load_dataset # type: ignore[import-untyped] - except ImportError as exc: - raise ImportError( - "datasets library is required. Install with: pip install datasets" - ) from exc - - name = _hf_name(dataset) - if dataset == "real": - ds = load_dataset(name, "dnd", split=split) - else: - ds = load_dataset(name, split=split) - return [dict(ex) for ex in ds] - - -def _cache_path(dataset: str, split: str) -> Path: - return _DATA_DIR / f"oolong_{dataset}_{split}.jsonl" - - -def _ensure_cached(dataset: str, split: str) -> list[dict[str, Any]]: - """Return parsed raw rows, downloading/caching from HF if needed.""" - path = _cache_path(dataset, split) - if path in _RAW_BY_FILE: - return _RAW_BY_FILE[path] - - if not path.exists(): - rows = _load_from_hf(dataset, split) - # Atomic write - tmp = path.with_suffix(".jsonl.tmp") - with open(tmp, "w") as f: - for row in rows: - f.write(json.dumps(row) + "\n") - os.replace(tmp, path) - else: - rows = [] - with open(path) as f: - for line in f: - line = line.strip() - if line: - rows.append(json.loads(line)) - - _RAW_BY_FILE[path] = rows - return rows - - -def _example_to_task(example: dict[str, Any], dataset: str, split: str, idx: int) -> Task: - """Convert one HF row into a Task. Pre-extracts the context for env use.""" - task_id = f"oolong.{dataset}.{split}.{idx}" - # Normalize: HF field is `context_window_text`; we expose it as `context`. - misc = dict(example) - if "context_window_text" in misc and "context" not in misc: - misc["context"] = misc.pop("context_window_text") - misc.pop("context_window_text_with_labels", None) - return Task( - goal=str(example.get("question", "")), - id=task_id, - max_steps=_DEFAULT_MAX_STEPS, - misc=misc, - ) - - -def get_task_ids( - dataset: Literal["synth", "real"] = "synth", - split: Literal["validation", "test"] = "validation", - max_context_len: int | None = None, -) -> list[str]: - """Return the ordered list of task IDs for a (dataset, split).""" - if dataset not in _VALID_DATASETS: - raise ValueError(f"dataset must be in {_VALID_DATASETS}, got {dataset!r}") - rows = _ensure_cached(dataset, split) - ids: list[str] = [] - for idx, ex in enumerate(rows): - if max_context_len is not None: - ctx = ex.get("context_window_text") or ex.get("context") or "" - if len(ctx) > max_context_len: - continue - ids.append(f"oolong.{dataset}.{split}.{idx}") - return ids - - -def get_task(task_id: str) -> Task: - """Return a deep-copy of the Task for a given ID.""" - if task_id in _TASKS: - return deepcopy(_TASKS[task_id]) - - parts = task_id.split(".") - if len(parts) != 4 or parts[0] != "oolong": - raise ValueError(f"Invalid task ID: {task_id!r}") - _, dataset, split, idx_s = parts - idx = int(idx_s) - rows = _ensure_cached(dataset, split) - if idx >= len(rows): - raise IndexError(f"Task index {idx} out of range for {dataset}/{split}") - task = _example_to_task(rows[idx], dataset, split, idx) - _TASKS[task_id] = task - return deepcopy(task) diff --git a/astraflow/core/workflow/impl/oolong/test_env.py b/astraflow/core/workflow/impl/oolong/test_env.py deleted file mode 100644 index 2c63ed9..0000000 --- a/astraflow/core/workflow/impl/oolong/test_env.py +++ /dev/null @@ -1,237 +0,0 @@ -"""Unit tests for OolongEnv.evaluate(), focused on the LLM-judge integration. - -The LLM judge call is mocked — these tests do not hit Fireworks. - -Run: - pytest astraflow/core/workflow/impl/oolong/test_env.py -v -""" - -from __future__ import annotations - -import asyncio -from unittest.mock import patch - -import pytest - -from astraflow.core.workflow.impl.oolong import env as env_module -from astraflow.core.workflow.impl.oolong.env import OolongEnv -from astraflow.core.workflow.impl.oolong.tasks import Task - - -# -------------------------------------------------------------------------- -# helpers -# -------------------------------------------------------------------------- - - -def _subagent_task(goal: str = "find the capital of France") -> Task: - """Sub-agent task ids do NOT start with 'oolong.' — that's how the env - routes to the LLM-judge path.""" - return Task(goal=goal, id="parent/sub_abc123", misc={"context": ""}) - - -def _synth_task() -> Task: - """A real oolong-synth task id — should always go through rule-based grader, - regardless of the use_llm_judge flag.""" - return Task( - goal="count items", - id="oolong.synth.validation.0", - misc={ - "context": "", - "answer": "[1]", - "answer_type": "ANSWER_TYPE.NUMERIC", - }, - ) - - -def _finished(env: OolongEnv, payload: str) -> OolongEnv: - env.finished = True - env.finish_payload = payload - return env - - -def _run(coro): - return asyncio.run(coro) - - -# -------------------------------------------------------------------------- -# sub-agent path -# -------------------------------------------------------------------------- - - -def test_subagent_judge_disabled_returns_zero(): - """Default (use_llm_judge=False) preserves the legacy placeholder behavior.""" - env = _finished(OolongEnv(task=_subagent_task()), "Paris") - score, info = _run(env.evaluate()) - assert score == 0.0 - assert "disabled" in info["reason"] - - -def test_subagent_judge_enabled_parses_score(): - """With the judge enabled and a sensible JSON response, the score flows - through and reason is preserved.""" - env = _finished( - OolongEnv(task=_subagent_task(), use_llm_judge=True), "Paris" - ) - - async def fake_judge(system, user, **kwargs): - # Smoke-check: the prompt actually contains the goal and the output. - assert "find the capital of France" in user - assert "Paris" in user - return '{"score": 0.9, "reason": "Correct capital of France."}' - - with patch.object(env_module, "judge", side_effect=fake_judge): - score, info = _run(env.evaluate()) - - assert score == pytest.approx(0.9) - assert "Correct" in info["reason"] - assert "judge_raw" in info - - -def test_subagent_judge_clamps_out_of_range(): - """Defensive clamping: if the model returns 1.5 or -0.3, we clamp to [0,1].""" - env = _finished( - OolongEnv(task=_subagent_task(), use_llm_judge=True), "answer" - ) - - async def fake_judge(system, user, **kwargs): - return '{"score": 1.5, "reason": "over the top"}' - - with patch.object(env_module, "judge", side_effect=fake_judge): - score, _info = _run(env.evaluate()) - assert score == 1.0 - - async def fake_judge_neg(system, user, **kwargs): - return '{"score": -0.3, "reason": "negative"}' - - with patch.object(env_module, "judge", side_effect=fake_judge_neg): - score, _info = _run(env.evaluate()) - assert score == 0.0 - - -def test_subagent_judge_network_failure_returns_zero(): - """A flaky judge call must not crash the rollout — return 0.0 with reason.""" - env = _finished( - OolongEnv(task=_subagent_task(), use_llm_judge=True), "answer" - ) - - async def boom(system, user, **kwargs): - raise RuntimeError("network down") - - with patch.object(env_module, "judge", side_effect=boom): - score, info = _run(env.evaluate()) - - assert score == 0.0 - assert "judge call failed" in info["reason"] - assert "network down" in info["reason"] - - -def test_subagent_judge_unparseable_response_returns_zero(): - """If the model returns garbage, return 0.0 and keep the raw text for audit.""" - env = _finished( - OolongEnv(task=_subagent_task(), use_llm_judge=True), "answer" - ) - - async def fake_judge(system, user, **kwargs): - return "this is not json at all" - - with patch.object(env_module, "judge", side_effect=fake_judge): - score, info = _run(env.evaluate()) - - assert score == 0.0 - assert "unparseable" in info["reason"] - assert info["judge_raw"] == "this is not json at all" - - -def test_subagent_judge_missing_score_field_returns_zero(): - """Malformed JSON (no score key) → 0.0 with a parse-failure reason.""" - env = _finished( - OolongEnv(task=_subagent_task(), use_llm_judge=True), "answer" - ) - - async def fake_judge(system, user, **kwargs): - return '{"reason": "I forgot the score field"}' - - with patch.object(env_module, "judge", side_effect=fake_judge): - score, info = _run(env.evaluate()) - - assert score == 0.0 - assert "unparseable" in info["reason"] - - -def test_subagent_judge_passes_custom_model(): - """When judge_model is set on the env, it is forwarded to judge() as `model=`.""" - env = _finished( - OolongEnv( - task=_subagent_task(), - use_llm_judge=True, - judge_model="accounts/fireworks/models/deepseek-v4-pro", - ), - "answer", - ) - - captured = {} - - async def fake_judge(system, user, **kwargs): - captured.update(kwargs) - return '{"score": 0.5, "reason": "ok"}' - - with patch.object(env_module, "judge", side_effect=fake_judge): - _run(env.evaluate()) - - assert captured.get("model") == "accounts/fireworks/models/deepseek-v4-pro" - - -def test_subagent_judge_no_model_override_passes_none(): - """When judge_model is None, no `model=` kwarg is forwarded (judge uses its default).""" - env = _finished( - OolongEnv(task=_subagent_task(), use_llm_judge=True), "answer" - ) - - captured = {} - - async def fake_judge(system, user, **kwargs): - captured.update(kwargs) - return '{"score": 0.5, "reason": "ok"}' - - with patch.object(env_module, "judge", side_effect=fake_judge): - _run(env.evaluate()) - - assert "model" not in captured - - -# -------------------------------------------------------------------------- -# non-sub-agent paths — judge flag must be irrelevant -# -------------------------------------------------------------------------- - - -def test_synth_task_ignores_judge_flag(): - """A real oolong-synth task must use the rule-based grader even when - use_llm_judge is True — the judge MUST NOT be called.""" - env = _finished( - OolongEnv(task=_synth_task(), use_llm_judge=True), "1" - ) - - async def boom(system, user, **kwargs): - raise AssertionError("judge() must not be called for oolong.synth tasks") - - with patch.object(env_module, "judge", side_effect=boom): - score, info = _run(env.evaluate()) - - # synth_process_response should accept the gold answer "1" and return 1.0 - assert score == 1.0 - assert "judge_raw" not in info - - -def test_unfinished_env_returns_zero_regardless_of_flag(): - """Unfinished agent — no grading happens, judge MUST NOT be called.""" - env = OolongEnv(task=_subagent_task(), use_llm_judge=True) - # NOT calling _finished — agent never called finish() - - async def boom(system, user, **kwargs): - raise AssertionError("judge() must not be called for unfinished agent") - - with patch.object(env_module, "judge", side_effect=boom): - score, info = _run(env.evaluate()) - - assert score == 0.0 - assert "never called finish" in info["reason"] diff --git a/astraflow/core/workflow/impl/oolong/test_eval_helpers.py b/astraflow/core/workflow/impl/oolong/test_eval_helpers.py deleted file mode 100644 index 883dfcf..0000000 --- a/astraflow/core/workflow/impl/oolong/test_eval_helpers.py +++ /dev/null @@ -1,164 +0,0 @@ -"""Unit tests for the rule-based oolong-real (D&D) grader. - -Ported faithfully from platoon's `dnd_process_response` and verified -against the documented scoring rules. - -Run: - pytest astraflow/core/workflow/impl/oolong/test_eval_helpers.py -v -""" - -from __future__ import annotations - -import pytest - -from astraflow.core.workflow.impl.oolong.eval_helpers import ( - dnd_parse_answer, - dnd_parse_response, - dnd_process_response, -) - - -# -------------------------------------------------------------------------- -# dnd_parse_answer — type dispatch -# -------------------------------------------------------------------------- - - -def test_parse_answer_int(): - assert dnd_parse_answer("42") == 42 - - -def test_parse_answer_negative_int(): - assert dnd_parse_answer("-7") == -7 - - -def test_parse_answer_list_via_comma(): - assert dnd_parse_answer("alice, bob, carol") == ["alice", "bob", "carol"] - - -def test_parse_answer_list_drops_empty_after_split(): - assert dnd_parse_answer("a,,b,") == ["a", "b"] - - -def test_parse_answer_falls_back_to_string(): - assert dnd_parse_answer("the killer") == "the killer" - - -# -------------------------------------------------------------------------- -# dnd_parse_response — \boxed extraction + fallback -# -------------------------------------------------------------------------- - - -def test_parse_response_boxed_text_wrapped(): - """\\boxed{\\text{X}} should be matched FIRST and stripped to X.""" - val, conf = dnd_parse_response(r"my final answer: \boxed{\text{alice}}") - assert val == "alice" - assert conf == "high" - - -def test_parse_response_boxed_plain(): - val, conf = dnd_parse_response(r"the count is \boxed{17}") - assert val == 17 - assert conf == "high" - - -def test_parse_response_boxed_list(): - val, conf = dnd_parse_response(r"\boxed{alice, bob}") - assert val == ["alice", "bob"] - assert conf == "high" - - -def test_parse_response_no_box_uses_raw_with_med_confidence(): - val, conf = dnd_parse_response("the answer is 5") - # No box, no comma, not parseable as int → string fallback - assert val == "the answer is 5" - assert conf == "med" - - -def test_parse_response_empty_returns_low_confidence(): - val, conf = dnd_parse_response(" ") - assert val == "" - assert conf == "low" - - -# -------------------------------------------------------------------------- -# dnd_process_response — type-aware scoring -# -------------------------------------------------------------------------- - - -def test_score_int_exact_match(): - r = dnd_process_response({"answer": "10"}, r"\boxed{10}") - assert r["score"] == 1.0 - assert r["parse_confidence"] == "high" - - -def test_score_int_off_by_one_partial_credit(): - r = dnd_process_response({"answer": "10"}, r"\boxed{11}") - assert r["score"] == pytest.approx(0.75) - - -def test_score_int_off_by_three(): - r = dnd_process_response({"answer": "10"}, r"\boxed{13}") - # 0.75 ** 3 = 0.421875 - assert r["score"] == pytest.approx(0.75**3) - - -def test_score_str_exact_match_case_insensitive(): - r = dnd_process_response( - {"answer": "Alice"}, r"my guess is \boxed{\text{alice}}" - ) - assert r["score"] == 1.0 - - -def test_score_str_mismatch(): - r = dnd_process_response({"answer": "alice"}, r"\boxed{\text{bob}}") - assert r["score"] == 0.0 - - -def test_score_list_full_overlap(): - r = dnd_process_response( - {"answer": "alice, bob"}, r"\boxed{alice, bob}" - ) - assert r["score"] == 1.0 - - -def test_score_list_partial_overlap(): - """Jaccard-like: |gold ∩ pred| / |gold|. Half of gold is recovered → 0.5.""" - r = dnd_process_response( - {"answer": "alice, bob"}, r"\boxed{alice, carol}" - ) - assert r["score"] == pytest.approx(0.5) - - -def test_score_list_no_overlap(): - r = dnd_process_response( - {"answer": "alice, bob"}, r"\boxed{x, y}" - ) - assert r["score"] == 0.0 - - -def test_score_type_mismatch_returns_zero(): - """Gold is int, model returns a string → score 0 (no partial credit).""" - r = dnd_process_response({"answer": "10"}, r"\boxed{\text{ten}}") - assert r["score"] == 0.0 - - -def test_score_unboxed_int_still_works(): - """Without \\boxed{}, raw output is parsed with med confidence; still scores.""" - r = dnd_process_response({"answer": "10"}, "10") - assert r["score"] == 1.0 - assert r["parse_confidence"] == "med" - - -def test_score_empty_output_is_zero(): - r = dnd_process_response({"answer": "10"}, "") - assert r["score"] == 0.0 - assert r["parse_confidence"] == "low" - - -def test_result_includes_metadata(): - r = dnd_process_response({"answer": "10"}, r"\boxed{11}") - assert "attempted_parse" in r - assert "gold" in r - assert "full_answer" in r - assert r["gold"] == 10 - assert r["attempted_parse"] == 11 diff --git a/astraflow/core/workflow/impl/oolong/test_workflow.py b/astraflow/core/workflow/impl/oolong/test_workflow.py deleted file mode 100644 index b028ec2..0000000 --- a/astraflow/core/workflow/impl/oolong/test_workflow.py +++ /dev/null @@ -1,150 +0,0 @@ -"""Unit tests for OolongRecursiveWorkflow reward_mode dispatch. - -Focuses on the per-agent reward selection logic. The full rollout is -not exercised — that requires a tokenizer, an inference engine, and a -running RaaS, which belongs in integration tests. - -Run: - pytest astraflow/core/workflow/impl/oolong/test_workflow.py -v -""" - -from __future__ import annotations - -import pytest - -from astraflow.core.workflow.impl.oolong.tasks import Task -from astraflow.core.workflow.impl.oolong.workflow import ( - AgentTrajectory, - OolongRecursiveWorkflow, -) - - -# -------------------------------------------------------------------------- -# helpers -# -------------------------------------------------------------------------- - - -def _wf(mode: str | None = None) -> OolongRecursiveWorkflow: - """Build a minimal workflow; pass mode=None to test the default.""" - kwargs: dict = {} - if mode is not None: - kwargs["reward_mode"] = mode - return OolongRecursiveWorkflow(**kwargs) - - -def _agent( - traj_id: str = "root", - parent_id: str | None = None, - depth: int = 0, - is_root: bool = True, - reward: float = 0.0, - goal: str = "g", - task_id: str = "oolong.synth.validation.0", -) -> AgentTrajectory: - return AgentTrajectory( - traj_id=traj_id, - parent_id=parent_id, - depth=depth, - task=Task(goal=goal, id=task_id), - is_root=is_root, - reward=reward, - ) - - -# -------------------------------------------------------------------------- -# reward_mode validation -# -------------------------------------------------------------------------- - - -def test_default_reward_mode_is_team_credit(): - wf = _wf() # no reward_mode kwarg - assert wf.reward_mode == "team_credit" - assert wf.use_llm_judge is False - - -def test_team_credit_does_not_enable_judge(): - wf = _wf("team_credit") - assert wf.use_llm_judge is False - - -def test_per_agent_judge_enables_judge(): - wf = _wf("per_agent_judge") - assert wf.use_llm_judge is True - - -def test_unknown_reward_mode_raises(): - with pytest.raises(ValueError, match="reward_mode"): - _wf("nonsense") - - -def test_root_only_no_longer_supported(): - """root_only was dropped — must raise to surface stale configs.""" - with pytest.raises(ValueError, match="reward_mode"): - _wf("root_only") - - -# -------------------------------------------------------------------------- -# _reward_for_agent — the per-agent selection logic -# -------------------------------------------------------------------------- - - -def test_team_credit_uses_root_reward_for_root(): - wf = _wf("team_credit") - root = _agent(is_root=True, reward=0.9) - assert wf._reward_for_agent(root, root_reward=0.9) == 0.9 - - -def test_team_credit_broadcasts_root_reward_to_sub_agents(): - """Sub-agent's own reward is ignored; everyone uses root_reward.""" - wf = _wf("team_credit") - sub = _agent(traj_id="sub1", parent_id="root", depth=1, is_root=False, reward=0.2) - assert wf._reward_for_agent(sub, root_reward=0.9) == 0.9 - - -def test_per_agent_judge_uses_own_reward_for_root(): - wf = _wf("per_agent_judge") - root = _agent(is_root=True, reward=1.0) - assert wf._reward_for_agent(root, root_reward=1.0) == 1.0 - - -def test_per_agent_judge_uses_own_reward_for_sub_agents(): - """Each sub gets its own LLM-judge score, independent of root.""" - wf = _wf("per_agent_judge") - sub = _agent(traj_id="sub1", is_root=False, reward=0.7) - # root_reward differs from sub.reward; should pick sub.reward. - assert wf._reward_for_agent(sub, root_reward=0.0) == 0.7 - - -def test_per_agent_judge_handles_none_reward_defensively(): - """A sub-agent whose reward was never set (None) defaults to 0.0, - not a crash.""" - wf = _wf("per_agent_judge") - sub = _agent(traj_id="sub1", is_root=False) - sub.reward = None # type: ignore[assignment] - assert wf._reward_for_agent(sub, root_reward=0.5) == 0.0 - - -# -------------------------------------------------------------------------- -# end-to-end matrix on a small tree -# -------------------------------------------------------------------------- - - -def test_team_credit_full_tree(): - """Root (reward=0.8) + 2 subs (rewards=0.1, 0.2). All three should - receive 0.8.""" - wf = _wf("team_credit") - root = _agent(traj_id="r", is_root=True, reward=0.8) - sub_a = _agent(traj_id="a", parent_id="r", depth=1, is_root=False, reward=0.1) - sub_b = _agent(traj_id="b", parent_id="r", depth=1, is_root=False, reward=0.2) - rewards = [wf._reward_for_agent(ag, root_reward=0.8) for ag in (root, sub_a, sub_b)] - assert rewards == [0.8, 0.8, 0.8] - - -def test_per_agent_judge_full_tree(): - """Same tree under per_agent_judge — each agent keeps its own reward.""" - wf = _wf("per_agent_judge") - root = _agent(traj_id="r", is_root=True, reward=0.8) - sub_a = _agent(traj_id="a", parent_id="r", depth=1, is_root=False, reward=0.1) - sub_b = _agent(traj_id="b", parent_id="r", depth=1, is_root=False, reward=0.2) - rewards = [wf._reward_for_agent(ag, root_reward=0.8) for ag in (root, sub_a, sub_b)] - assert rewards == [0.8, 0.1, 0.2] diff --git a/astraflow/core/workflow/impl/oolong/workflow.py b/astraflow/core/workflow/impl/oolong/workflow.py deleted file mode 100644 index 0a25f9b..0000000 --- a/astraflow/core/workflow/impl/oolong/workflow.py +++ /dev/null @@ -1,669 +0,0 @@ -"""Oolong recursive-agent workflow. - -Design (per Gandhi et al. 2026, "Recursive Agent Optimization", -arxiv 2605.06639): - -- Multi-turn agent loop. Each turn the model emits one - ``......`` block. The Python code - is executed in a stateful sandbox (per-agent ``exec()`` namespace). -- Tools exposed via the sandbox: - - ``context`` (str): pre-populated with the full input text - - ``finish(answer)`` -> raises FinishSignal, ending the agent - - ``await launch_subagent(goal, context)`` -> spawns a child agent - - ``asyncio`` module: for ``asyncio.gather(...)`` parallel spawns -- Aggregation: parent's ``launch_subagent`` returns the child's - ``finish(...)`` payload as a string. No inventory aliasing; sub-agents - process whatever chunk the parent passes. -- Reward (delegation-bonus): - R(X) = success(X) + lambda * mean(success(children)) - Default lambda = 0.4 (paper's choice for OOLONG-REAL). Computed in a - post-pass over the trajectory tree before per-agent rewards are emitted - to the buffer. -""" - -from __future__ import annotations - -import asyncio -import random -import re -import uuid -from dataclasses import dataclass, field -from typing import Any - -import aiofiles -import aiofiles.os -import torch -from transformers import PreTrainedTokenizerFast - -from astraflow.core.workflow.api.cli_args import GenerationHyperparameters -from astraflow.core.workflow.api.engine_api import InferenceEngine -from astraflow.core.workflow.api.io_struct import ModelRequest, ModelResponse -from astraflow.core.workflow.api.reward_api import AsyncRewardWrapper -from astraflow.core.workflow.api.workflow_api import RolloutWorkflow -from astraflow.core.workflow.registry import register_workflow -from astraflow.core.workflow.utils import logging, stats_tracker -from astraflow.core.workflow.utils.data import resolve_prompt_id -from astraflow.core.workflow.utils.dynamic_import import import_from_string -from astraflow.core.workflow.impl.oolong.env import ( - DEFAULT_STDOUT_TRUNCATE, - OolongEnv, -) -from astraflow.core.workflow.impl.oolong.tasks import Task, get_task - -logger = logging.getLogger("OolongRecursive") - - -# --------------------------------------------------------------------------- -# System prompts -# --------------------------------------------------------------------------- -# Both root and sub use the same recursive-agent prompt format. The prompt -# is taken from platoon's OolongRecursivePromptBuilder; we drop the -# "include_reasoning" branch since we always require .... - -MAIN_SYSTEM_PROMPT = """You are tasked with answering a query that requires analyzing and aggregating information from a large context. - -You have access to a REPL environment with the following pre-loaded variable: -- `context` (str): The full text context to analyze (may be very large) - - -CONTEXT ANALYSIS: -- First check if the length of the context is very large (>32K characters) using `len(context)`. -- For very large contexts (>32K characters), work with chunks rather than the entire context at once. -- Use subagents to process chunks and then aggregate the results to produce a final answer. Try not to split the context into too many chunks (32K characters per chunk is a good rule of thumb). -- If the context <= 32K characters, prefer to process your context by printing out and reading it rather than using programmatic heuristics. -- **IMPORTANT: DO NOT USE regex, string matching, etc. types of programmatic heuristics. Read the context with `print(context)` to be accurate in your answer.** - -SUBAGENT DELEGATION: -- **Do not use subagents if the context you need to process is <= 32K characters.** Just print out the context to observe it directly and answer the question by reading the context. -- You have the ability to spawn subagents (other instantiations of yourself), by providing them with their own `context`/chunk to process and a goal/instruction for what result it should return. -- You can use `await asyncio.gather(...)` to process multiple chunks simultaneously. -- Be specific about the format and type in which you expect subagents to return their results. -- Do not provide the context/chunk as part of the goal. Instead, pass it explicitly as the `context` argument to the `launch_subagent` function. - -ANSWER SUBMISSION: -- You can submit your answer using the `finish` function in the format requested in the user-provided goal. - - -You can perform printing out, peeking into the context, or launching subagents using Python code blocks. You will get multiple steps to complete the task. -For your current step, first briefly reason (~1-3 sentences) about your recursive strategy in tags, then output your code in tags. -Your code will be executed in a Jupyter-like environment and the output will be shown to you. The python code block should be formatted as follows: code block without any other tags. -Do not output anything else except for ...\n... -""" - -SUB_SYSTEM_PROMPT = MAIN_SYSTEM_PROMPT # same prompt for now; differs by initial user message - - -# --------------------------------------------------------------------------- -# Code-block parsing -# --------------------------------------------------------------------------- - -# DOTALL so code can span lines. Lazy match on the body to stop at the -# first matching tag. -_PY_RE = re.compile(r"(.*?)", re.DOTALL) -_THOUGHT_RE = re.compile(r"(.*?)", re.DOTALL) - - -@dataclass -class ParsedCode: - code: str - thought: str = "" - error: str | None = None - raw_text: str = "" - - -def parse_code(text: str) -> ParsedCode: - m = _PY_RE.search(text) - if not m: - return ParsedCode( - code="", - error="no ... block found in response", - raw_text=text, - ) - code = m.group(1) - tm = _THOUGHT_RE.search(text) - thought = tm.group(1).strip() if tm else "" - return ParsedCode(code=code, thought=thought, raw_text=m.group(0)) - - -# --------------------------------------------------------------------------- -# Step-budget tracker (shared across the whole trajectory tree) -# --------------------------------------------------------------------------- - - -@dataclass -class BudgetTracker: - total: int - used: int = 0 - reserved: int = 0 - - def remaining(self) -> int: - return max(0, self.total - self.used - self.reserved) - - def consume(self, n: int = 1) -> bool: - if self.remaining() < n: - return False - self.used += n - return True - - def reserve(self, n: int) -> bool: - if self.remaining() < n: - return False - self.reserved += n - return True - - def release(self, n: int) -> None: - self.reserved = max(0, self.reserved - n) - - -# --------------------------------------------------------------------------- -# Per-agent trajectory record -# --------------------------------------------------------------------------- - - -@dataclass -class AgentTrajectory: - traj_id: str - parent_id: str | None - depth: int - task: Task - is_root: bool - turns: list[tuple[list[int], "ModelResponse"]] = field(default_factory=list) - finish_payload: Any = None - finish_message: str = "" - error_message: str | None = None - reward: float = 0.0 - bonus: float = 0.0 - messages: list[dict[str, str]] = field(default_factory=list) - - -# --------------------------------------------------------------------------- -# Workflow -# --------------------------------------------------------------------------- - - -@register_workflow("oolong_recursive") -class OolongRecursiveWorkflow(RolloutWorkflow): - """Recursive-agent workflow for Oolong long-context aggregation.""" - - def __init__( - self, - reward_fn: str | Any = None, - tokenizer: PreTrainedTokenizerFast | None = None, - gconfig: GenerationHyperparameters | None = None, - # Task-specific knobs (matches platoon defaults for OOLONG-REAL). - max_depth: int = 2, # 0-indexed; 3 levels incl. root - max_breadth: int = 8, # safety cap on children per spawn - max_steps_per_episode: int = 50, - max_concurrent_subagents: int = 8, # RaaS queue bound - delegation_lambda: float = 0.4, # paper default for OOLONG-REAL - sub_max_steps: int = 25, # sub-agent's own step cap - stdout_truncate: int = DEFAULT_STDOUT_TRUNCATE, - enable_thinking: bool = False, - rollout_stat_scope: str = "rollout", - dump_dir: str | None = None, - dump_prob: float = 0.0, - **kwargs: Any, - ): - # Resolve reward_fn for API parity with other workflows (we - # actually use env.evaluate() for the reward signal, not this fn). - self.reward_fn = reward_fn - self.async_reward_fn: Any = None - if isinstance(reward_fn, str): - try: - self.reward_fn = import_from_string(reward_fn) - self.async_reward_fn = AsyncRewardWrapper(self.reward_fn) - except Exception as e: - logger.warning("could not import reward_fn=%r: %s", reward_fn, e) - self.reward_fn = None - - self.tokenizer = tokenizer - self.gconfig = gconfig - self.max_depth = max_depth - self.max_breadth = max_breadth - self.max_steps_per_episode = max_steps_per_episode - self.max_concurrent_subagents = max_concurrent_subagents - self.delegation_lambda = float(delegation_lambda) - self.sub_max_steps = sub_max_steps - self.stdout_truncate = stdout_truncate - self.enable_thinking = bool(enable_thinking) - self.rollout_stat_scope = rollout_stat_scope - self.dump_dir = dump_dir - self.dump_prob = float(dump_prob) - # Reward mode — selects which credit-assignment scheme to use. - # - # "team_credit" All agents in the tree share the root's - # rule-based reward. No LLM judge calls. - # Cheap; noisy per-agent credit but every - # agent gets some signal. - # - # "per_agent_judge" Root keeps its rule-based reward; each - # sub-agent is scored by an LLM judge - # (astraEnv.judge) on its own (goal, output). - # True per-agent credit; costs API $$ per - # sub-agent rollout. - # - # `use_llm_judge` for the env is derived from this — never set it - # independently. - self.reward_mode: str = str(kwargs.pop("reward_mode", "team_credit")) - if self.reward_mode not in ("team_credit", "per_agent_judge"): - raise ValueError( - f"reward_mode must be 'team_credit' or 'per_agent_judge', " - f"got {self.reward_mode!r}" - ) - self.use_llm_judge = self.reward_mode == "per_agent_judge" - self.judge_model = kwargs.pop("judge_model", None) - - # ------------------------------------------------------------------ utils - - def _apply_chat_template(self, messages: list[dict], add_generation_prompt: bool = True) -> list[int]: - if self.tokenizer is None: - raise RuntimeError("OolongRecursiveWorkflow has no tokenizer attached") - kwargs: dict[str, Any] = dict( - add_generation_prompt=add_generation_prompt, - return_tensors=None, - ) - # Qwen3-Instruct supports a thinking-mode toggle; default off for parity. - try: - out = self.tokenizer.apply_chat_template( - messages, - tokenize=True, - enable_thinking=self.enable_thinking, - **kwargs, - ) - except TypeError: - out = self.tokenizer.apply_chat_template(messages, tokenize=True, **kwargs) - # transformers>=5 returns a BatchEncoding (a Mapping, not a list) when - # tokenize=True; older versions return a flat list[int]. - if hasattr(out, "keys"): - out = out["input_ids"] - return list(out) - - def _build_initial_messages(self, task: Task, is_root: bool) -> list[dict]: - system = MAIN_SYSTEM_PROMPT if is_root else SUB_SYSTEM_PROMPT - # Show the agent only the goal; the context is pre-loaded into the - # sandbox as `context` and can be inspected via `print(context[:N])` - # or `len(context)`. - user = f"Goal: {task.goal}\n" - return [ - {"role": "system", "content": system}, - {"role": "user", "content": user}, - ] - - def _format_observation(self, code_result, parse_error: str | None) -> str: - if parse_error is not None: - return f"ERROR: {parse_error}" - parts = [] - if code_result.stdout: - parts.append(code_result.stdout) - if code_result.error: - parts.append(f"\n[error]\n{code_result.error}") - elif code_result.stderr: - parts.append(f"\n[stderr]\n{code_result.stderr}") - if not parts: - parts.append("(no output)") - return "".join(parts) - - # ------------------------------------------------------------------ episode - - async def _run_episode( - self, - engine: InferenceEngine, - env: OolongEnv, - task: Task, - budget: BudgetTracker, - sem: asyncio.Semaphore, - all_trajs: list[AgentTrajectory], - parent_id: str | None, - depth: int, - is_root: bool, - ) -> AgentTrajectory: - traj_id = uuid.uuid4().hex - traj = AgentTrajectory( - traj_id=traj_id, parent_id=parent_id, depth=depth, task=task, is_root=is_root, - ) - all_trajs.append(traj) - - messages = self._build_initial_messages(task, is_root) - steps_taken = 0 - max_local_steps = ( - task.max_steps if task.max_steps is not None - else (self.max_steps_per_episode if is_root else self.sub_max_steps) - ) - - while not env.finished and steps_taken < max_local_steps: - if not budget.consume(1): - traj.error_message = ( - f"[budget exhausted at local step {steps_taken}; " - f"total {budget.used}/{budget.total}]" - ) - break - - input_ids = self._apply_chat_template(messages, add_generation_prompt=True) - resp = await engine.agenerate( - ModelRequest( - rid=uuid.uuid4().hex, - input_ids=input_ids, - gconfig=self.gconfig.new(n_samples=1), - tokenizer=self.tokenizer, - ) - ) - traj.turns.append((input_ids, resp)) - response_text = self.tokenizer.decode(resp.output_tokens) - - parsed = parse_code(response_text) - if parsed.error is not None: - obs = f"ERROR: {parsed.error}" - stats_tracker.get(self.rollout_stat_scope).scalar(parse_errors=1) - messages.append({"role": "assistant", "content": response_text}) - messages.append({"role": "user", "content": obs}) - steps_taken += 1 - continue - - code_result = await env.run_code(parsed.code) - obs = self._format_observation(code_result, parse_error=None) - messages.append({"role": "assistant", "content": response_text}) - - if env.finished: - # No observation after finish — the episode terminates. - traj.finish_payload = env.finish_payload - traj.finish_message = "" if env.finish_payload is None else str(env.finish_payload) - score, _info = await env.evaluate() - traj.reward = float(score) - steps_taken += 1 - break - - messages.append({"role": "user", "content": obs}) - steps_taken += 1 - - traj.messages = messages - return traj - - # ------------------------------------------------------------------ spawn - - def _make_spawn_callback( - self, - engine: InferenceEngine, - budget: BudgetTracker, - sem: asyncio.Semaphore, - all_trajs: list[AgentTrajectory], - parent_id: str, - parent_depth: int, - ): - """Returns an async fn the env can call to launch one sub-agent. - - Each call spawns exactly one child and returns its finish_message - as a string. The agent can wrap multiple calls in asyncio.gather() - to parallelize. - """ - async def _launch(goal: str, context: str) -> str: - if parent_depth >= self.max_depth: - return f"ERROR: max recursion depth ({self.max_depth}) reached; cannot spawn" - # Build a fresh child task. - child_task = Task( - goal=str(goal), - id=f"{parent_id}/sub_{uuid.uuid4().hex[:8]}", - max_steps=self.sub_max_steps, - misc={"context": str(context)}, - ) - child_env = OolongEnv( - task=child_task, - spawn_callback=self._make_spawn_callback( - engine, budget, sem, all_trajs, child_task.id, parent_depth + 1 - ), - stdout_truncate=self.stdout_truncate, - use_llm_judge=self.use_llm_judge, - judge_model=self.judge_model, - ) - async with sem: - child_traj = await self._run_episode( - engine=engine, - env=child_env, - task=child_task, - budget=budget, - sem=sem, - all_trajs=all_trajs, - parent_id=parent_id, - depth=parent_depth + 1, - is_root=False, - ) - return child_traj.finish_message or (child_traj.error_message or "") - - return _launch - - # ------------------------------------------------------------------ reward - - def _apply_delegation_bonus(self, all_trajs: list[AgentTrajectory]) -> None: - """Add lambda * mean(children's success) to each agent's reward. - - Mutates each AgentTrajectory.reward in place. Eq. 1 of arxiv - 2605.06639. lambda=0 disables (pure per-agent reward). - """ - if self.delegation_lambda <= 0: - return - # Build children index by parent_id. - children: dict[str, list[AgentTrajectory]] = {} - for t in all_trajs: - if t.parent_id is not None: - children.setdefault(t.parent_id, []).append(t) - for t in all_trajs: - kids = children.get(t.traj_id, []) - if not kids: - continue - mean_child_success = sum(k.reward for k in kids) / len(kids) - bonus = self.delegation_lambda * mean_child_success - t.bonus = bonus - t.reward = t.reward + bonus - - # --------------------------------------------------------- sequence packing - - def _build_sequences_for_agent(self, ag: AgentTrajectory, reward: float) -> list[dict[str, torch.Tensor]]: - """Emit one training sequence per turn of this agent. - - Per-turn layout: [turn_input_ids (loss_mask=0)] [response_tokens (loss_mask=1)]. - Matches TextCraft's approach (see textcraft/workflow.py:_build_sequences_for_agent - for the explanation of why per-turn rather than concatenated). - """ - out: list[dict[str, torch.Tensor]] = [] - for input_ids, resp in ag.turns: - seq_ids = list(input_ids) + list(resp.output_tokens) - seq_mask = [0] * len(input_ids) + [1] * len(resp.output_tokens) - seq_logprobs = [0.0] * len(input_ids) + list(resp.output_logprobs) - seq_versions = [-1] * len(input_ids) + list(resp.output_versions) - n = len(seq_ids) - seq = { - "input_ids": torch.tensor(seq_ids, dtype=torch.int32), - "loss_mask": torch.tensor(seq_mask, dtype=torch.int32), - "logprobs": torch.tensor(seq_logprobs, dtype=torch.float32), - "versions": torch.tensor(seq_versions, dtype=torch.int32), - "attention_mask": torch.ones(n, dtype=torch.bool), - "rewards": torch.tensor(reward, dtype=torch.float32), - } - out.append({k: v.unsqueeze(0) for k, v in seq.items()}) - return out - - # ------------------------------------------------------------------ entry - - async def _run_one_rollout( - self, - engine: InferenceEngine, - data: dict[str, Any], - rollout_idx: int, - ) -> dict[str, Any]: - task = self._task_from_data(data) - budget = BudgetTracker(total=task.max_steps or self.max_steps_per_episode) - sem = asyncio.Semaphore(self.max_concurrent_subagents) - all_trajs: list[AgentTrajectory] = [] - - root_id = task.id # used as parent_id for top-level children - env = OolongEnv( - task=task, - spawn_callback=self._make_spawn_callback( - engine, budget, sem, all_trajs, root_id, parent_depth=0 - ), - stdout_truncate=self.stdout_truncate, - use_llm_judge=self.use_llm_judge, - judge_model=self.judge_model, - ) - - await self._run_episode( - engine=engine, env=env, task=task, budget=budget, sem=sem, - all_trajs=all_trajs, parent_id=None, depth=0, is_root=True, - ) - - # Apply delegation bonus across the tree (modifies root.reward - # in-place; sub-agents keep their own per-agent rewards). - self._apply_delegation_bonus(all_trajs) - - # Emit one (reward, sequences) entry per agent that produced any - # turns. Both modes emit all agents — the difference is which - # reward each agent's tokens receive (see _reward_for_agent). - root_traj = all_trajs[0] if all_trajs else None - root_reward = float(root_traj.reward) if root_traj else 0.0 - - per_agent: list[dict[str, Any]] = [] - for ag in all_trajs: - if not ag.turns: - continue - agent_reward = self._reward_for_agent(ag, root_reward) - seqs = self._build_sequences_for_agent(ag, agent_reward) - per_agent.append({ - "reward": agent_reward, - "sequences": seqs, - "depth": ag.depth, - "is_root": ag.is_root, - }) - - return { - "per_agent": per_agent, - "all_trajs": all_trajs, - "task": task, - "root_reward": root_reward, - "n_agents": len(all_trajs), - "subagent_launched": int(env.subagent_launched), - "subagent_succeeded": float(env.subagent_succeeded), - } - - def _reward_for_agent(self, ag: AgentTrajectory, root_reward: float) -> float: - """Pick the training reward for one agent based on reward_mode. - - - team_credit: every agent (root + subs) trains on root's reward - - per_agent_judge: each agent trains on its own env.evaluate() reward - (root: rule-based; sub: LLM judge) - """ - if self.reward_mode == "team_credit": - return root_reward - # per_agent_judge — defensive default if a sub's reward never set - if ag.reward is None: - return 0.0 - return float(ag.reward) - - async def arun_episode( - self, engine: InferenceEngine, data: dict[str, Any] - ) -> dict[str, Any]: - n_samples = max(1, int(self.gconfig.n_samples)) - - rollouts = await asyncio.gather(*[ - self._run_one_rollout(engine, data, i) for i in range(n_samples) - ]) - - # Aggregate metrics. - root_rewards = [r["root_reward"] for r in rollouts] - n_agents_list = [r["n_agents"] for r in rollouts] - launched_total = sum(r["subagent_launched"] for r in rollouts) - - for rw in root_rewards: - stats_tracker.get(self.rollout_stat_scope).scalar(reward=rw) - stats_tracker.get(self.rollout_stat_scope).scalar(env_score=rw) - for na in n_agents_list: - stats_tracker.get(self.rollout_stat_scope).scalar(n_agents=na) - if launched_total > 0: - stats_tracker.get(self.rollout_stat_scope).scalar( - subagent_launched_per_rollout=launched_total / max(1, len(rollouts)), - ) - - # Optional dump (one rollout per group call). - if self.dump_dir is not None and self.dump_prob > 0 and random.random() < self.dump_prob: - try: - await self._dump_trajectory(rollouts[0], data) - except Exception as e: - logger.warning("dump_trajectory failed: %s", e) - - # Flatten to trajectories. - trajectories: list[dict[str, Any]] = [] - rewards_kept: list[float] = [] - for r in rollouts: - for pa in r["per_agent"]: - if not pa["sequences"]: - continue - trajectories.append({"sequences": pa["sequences"]}) - rewards_kept.append(pa["reward"]) - - prompt_id = resolve_prompt_id(data) or (rollouts[0]["task"].id if rollouts else None) - - if not trajectories: - return { - "n_trajs": 0, - "rewards": torch.tensor([], dtype=torch.float32), - "trajectories": [], - "prompt_id": prompt_id, - } - return { - "n_trajs": len(trajectories), - "rewards": torch.tensor(rewards_kept, dtype=torch.float32), - "trajectories": trajectories, - "prompt_id": prompt_id, - } - - # ------------------------------------------------------------------ helpers - - def _task_from_data(self, data: dict[str, Any]) -> Task: - """Build a Task from a dataset row. Two supported shapes: - (1) `{"task_id": "oolong.synth.validation.42"}` -> loads via tasks.get_task - (2) inline: `{"context": ..., "question": ..., "answer": ..., ...}` (rare). - """ - if "task_id" in data: - return get_task(data["task_id"]) - return Task( - goal=str(data.get("question") or data.get("goal") or ""), - id=str(data.get("id") or data.get("query_id") or uuid.uuid4().hex), - max_steps=int(data.get("max_steps", self.max_steps_per_episode)), - misc=dict(data), - ) - - async def _dump_trajectory(self, rollout: dict[str, Any], data: dict[str, Any]) -> None: - """Append a human-readable dump of one rollout for offline inspection.""" - if self.dump_dir is None: - return - await aiofiles.os.makedirs(self.dump_dir, exist_ok=True) - task = rollout["task"] - # Subdir per weight version when present in agentic dumps. - sub = "0" - try: - v = rollout["all_trajs"][0].turns[0][1].output_versions[0] - sub = str(int(v)) - except Exception: - pass - out_dir = f"{self.dump_dir}/{sub}" - await aiofiles.os.makedirs(out_dir, exist_ok=True) - out_path = f"{out_dir}/oolong-{abs(hash(task.id)) % 100_000_000:08d}.txt" - async with aiofiles.open(out_path, "w") as f: - await f.write( - f"=== Episode reward={rollout['root_reward']:.3f} n_agents={rollout['n_agents']} ===\n\n" - ) - for ag in rollout["all_trajs"]: - tag = "ROOT" if ag.is_root else f"SUB depth={ag.depth}" - await f.write( - f"--- {tag} traj_id={ag.traj_id} task='{ag.task.goal[:120]}' " - f"per_agent_reward={ag.reward:.3f} bonus={ag.bonus:.3f} steps={len(ag.turns)} ---\n" - ) - if ag.error_message: - await f.write(f" (error: {ag.error_message})\n") - if ag.finish_message: - await f.write(f" finish_message: {ag.finish_message[:400]}\n") - if ag.messages: - for j, msg in enumerate(ag.messages): - body = msg["content"] - if len(body) > 2000: - body = body[:2000] + f"\n[...truncated, total {len(msg['content'])} chars...]" - await f.write(f" [{j}] {msg['role']}:\n {body}\n") - await f.write("\n") diff --git a/astraflow/core/workflow/reward/oolong_success.py b/astraflow/core/workflow/reward/oolong_success.py deleted file mode 100644 index 35d7a76..0000000 --- a/astraflow/core/workflow/reward/oolong_success.py +++ /dev/null @@ -1,23 +0,0 @@ -"""Oolong reward function (API-parity stub). - -The oolong_recursive workflow computes its own reward via the platoon-ported -rule-based grader in `impl/oolong/eval_helpers.py`. This module exists so a -yaml `reward_fn: oolong_success` resolves to *something* — the workflow -won't actually call it. -""" - -from typing import Any - -from astraflow.core.workflow.registry import register_reward - - -@register_reward("oolong_success") -def oolong_success_reward_fn( - prompt: str, - completions: str, - prompt_ids: list[int], - completion_ids: list[int], - **kwargs: Any, -) -> float: - """Stub reward — oolong_recursive does not call this. Returns 0.0 if invoked.""" - return 0.0 diff --git a/astraflow/dataflow/dataset/oolong.py b/astraflow/dataflow/dataset/oolong.py deleted file mode 100644 index f563830..0000000 --- a/astraflow/dataflow/dataset/oolong.py +++ /dev/null @@ -1,98 +0,0 @@ -"""Oolong dataset loaders for the oolong_recursive workflow. - -Each row references one Oolong task by `task_id`; the workflow re-loads -the full Task (including the large `context` string) via `get_task` — -keeping the per-row payload tiny and avoiding cache bloat. -""" - -from __future__ import annotations - -import json -from logging import getLogger -from pathlib import Path - -from datasets import Dataset - -from astraflow.core.workflow.impl.oolong.tasks import ( - Task, - get_task, - get_task_ids, -) -from astraflow.dataflow.dataset.utils import attach_query_ids - -logger = getLogger(__name__) - - -def _row_for_task_id(task_id: str) -> dict: - """Materialize one HF-Dataset row. Schema-uniform across rows.""" - task = get_task(task_id) - # The agent sees only the goal in the chat; `context` is pre-loaded - # into the Python sandbox by OolongEnv (not put in the prompt). - user = f"Goal: {task.goal}" - return { - "task_id": task.id, - "messages": [{"role": "user", "content": user}], - "answer": task.id, - } - - -def get_oolong_rl_dataset( - tokenizer=None, - max_length: int | None = None, - dataset: str = "synth", - split: str = "validation", - num_tasks: int | None = None, - max_context_len: int | None = None, - seed: int = 42, # unused — Oolong is deterministic - dataset_name: str = "oolong", -) -> Dataset: - """Return a HF Dataset of Oolong tasks for RL training. - - Args: - dataset: "synth" or "real" - split: "validation" or "test" (Oolong has no separate "train" split; - we use "validation" as training data, "test" as held-out) - num_tasks: cap the dataset size (None = all) - max_context_len: filter out tasks with context_window_text > this length - """ - task_ids = get_task_ids( - dataset=dataset, split=split, max_context_len=max_context_len, - ) - if num_tasks is not None: - task_ids = task_ids[:num_tasks] - rows = [_row_for_task_id(tid) for tid in task_ids] - ds = Dataset.from_list(rows) - ds = attach_query_ids(ds, dataset_name) - if max_length is not None and tokenizer is not None: - def short_enough(sample): - content = sample["messages"][0]["content"] - return len(tokenizer.encode(content)) <= max_length - ds = ds.filter(short_enough) - return ds - - -def get_oolong_eval_dataset( - tokenizer=None, - max_length: int | None = None, - dataset: str = "synth", - split: str = "test", - num_val: int | None = 100, - max_context_len: int | None = None, - seed: int = 42, - dataset_name: str = "oolong_val", -) -> Dataset: - """Return a HF Dataset of Oolong tasks for eval.""" - task_ids = get_task_ids( - dataset=dataset, split=split, max_context_len=max_context_len, - ) - if num_val is not None: - task_ids = task_ids[:num_val] - rows = [_row_for_task_id(tid) for tid in task_ids] - ds = Dataset.from_list(rows) - ds = attach_query_ids(ds, dataset_name) - if max_length is not None and tokenizer is not None: - def short_enough(sample): - content = sample["messages"][0]["content"] - return len(tokenizer.encode(content)) <= max_length - ds = ds.filter(short_enough) - return ds diff --git a/examples/deepdive/qwen3-4b-recursive-v7/yaml/experiment.yaml b/examples/deepdive/qwen3-4b-recursive-v7/yaml/experiment.yaml index 792c410..9b73623 100644 --- a/examples/deepdive/qwen3-4b-recursive-v7/yaml/experiment.yaml +++ b/examples/deepdive/qwen3-4b-recursive-v7/yaml/experiment.yaml @@ -12,7 +12,7 @@ # -- DeepDive has no rule-based grader, judge is always required # - delegation_lambda = 0.0 (matches platoon's _DEEPDIVE_DELEGATION_REWARD_CAP) # -# Model: Qwen3-4B-Instruct-2507 (same as Oolong/TextCraft; platoon uses same) +# Model: Qwen3-4B-Instruct-2507 (same as TextCraft; platoon uses same) # # GPU layout (8 GPUs): # SERVICE_CUDA_VISIBLE_DEVICES=0,1,2,3 -> RaaS (model0 dp=4) diff --git a/examples/deepdive/qwen3-4b-recursive/yaml/experiment.yaml b/examples/deepdive/qwen3-4b-recursive/yaml/experiment.yaml index cb6ab7c..1f3a4b0 100644 --- a/examples/deepdive/qwen3-4b-recursive/yaml/experiment.yaml +++ b/examples/deepdive/qwen3-4b-recursive/yaml/experiment.yaml @@ -12,7 +12,7 @@ # -- DeepDive has no rule-based grader, judge is always required # - delegation_lambda = 0.0 (matches platoon's _DEEPDIVE_DELEGATION_REWARD_CAP) # -# Model: Qwen3-4B-Instruct-2507 (same as Oolong/TextCraft; platoon uses same) +# Model: Qwen3-4B-Instruct-2507 (same as TextCraft; platoon uses same) # # GPU layout (8 GPUs): # SERVICE_CUDA_VISIBLE_DEVICES=0,1,2,3 -> RaaS (model0 dp=4) diff --git a/examples/oolong/qwen3-4b-recursive-real/scripts/1_astraflow.sh b/examples/oolong/qwen3-4b-recursive-real/scripts/1_astraflow.sh deleted file mode 100755 index cf7df94..0000000 --- a/examples/oolong/qwen3-4b-recursive-real/scripts/1_astraflow.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash -set -euo pipefail -# [1/3] Launch AstraFlow HTTP service -# -# Usage (terminal 1): -# bash examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh - -export CUDA_VISIBLE_DEVICES="" - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -astraflow_load_experiment_env - -export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. -astraflow_setup_env - -echo "=== AstraFlow HTTP Service ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "Port : ${ASTRAFLOW_PORT}" -echo "===============================" - -python3 -u -m astraflow \ - --config "${EXPERIMENT_CONFIG}" \ - --port "${ASTRAFLOW_PORT}" \ - --host "${ASTRAFLOW_HOST}" \ - 2>&1 | tee "${LOG_DIR}/astraflow.log" diff --git a/examples/oolong/qwen3-4b-recursive-real/scripts/2_raas.sh b/examples/oolong/qwen3-4b-recursive-real/scripts/2_raas.sh deleted file mode 100755 index 5d88b2b..0000000 --- a/examples/oolong/qwen3-4b-recursive-real/scripts/2_raas.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash -set -euo pipefail -# [2/3] Launch RaaS inference server (SGLang + TCP receiver) -# -# Usage (terminal 2, after AstraFlow is ready): -# bash examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -astraflow_load_experiment_env - -export CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" -export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" -export RAAS_PORT="${RAAS_PORT:-19190}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" -export ASTRAFLOW_URL="${ASTRAFLOW_URL:-http://127.0.0.1:${ASTRAFLOW_PORT}}" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. -astraflow_setup_env - -echo "=== RaaS Inference Server (SGLang + TCP receiver) ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "RaaS config : ${RAAS_CONFIG}" -echo "GPUs : ${CUDA_VISIBLE_DEVICES}" -echo "Port : ${RAAS_PORT}" -echo "AstraFlow URL : ${ASTRAFLOW_URL}" -echo "=======================================================" - -python3 -u -m astraflow.raas.server \ - --host "${RAAS_HOST}" \ - --port "${RAAS_PORT}" \ - --config "${EXPERIMENT_CONFIG}" \ - --config "${RAAS_CONFIG}" \ - --engine-id "${ENGINE_ID:-default}" \ - --astraflow-url "${ASTRAFLOW_URL}" \ - 2>&1 | tee "${LOG_DIR}/raas.log" diff --git a/examples/oolong/qwen3-4b-recursive-real/scripts/3_trainer_model0.sh b/examples/oolong/qwen3-4b-recursive-real/scripts/3_trainer_model0.sh deleted file mode 100755 index cb8e850..0000000 --- a/examples/oolong/qwen3-4b-recursive-real/scripts/3_trainer_model0.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash -set -euo pipefail -# [3/3] Launch Trainer for model0 (TCP, sender_agent on local_rank 0) -# -# Usage (terminal 3, after AstraFlow and RaaS are ready): -# bash examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -astraflow_load_experiment_env - -export CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS:-4,5,6,7}" -TRAINER0_NPROC="$(echo "${CUDA_VISIBLE_DEVICES}" | awk -F',' '{print NF}')" - -export RAAS_PORT="${RAAS_PORT:-19190}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" -export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" -export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" - -# sender_agent (in trainer) listens on this HTTP port -export WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. -astraflow_setup_env - -echo "=== Trainer model0 (TCP) ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "GPUs : ${CUDA_VISIBLE_DEVICES} (FSDP dp${TRAINER0_NPROC})" -echo "AstraFlow : ${ASTRAFLOW_URL}" -echo "RaaS : ${ASTRAFLOW_RAAS_URL}" -echo "Sender HTTP : ${WEIGHT_TRANSFER_HTTP_PORT}" -echo "WANDB mode : ${WANDB_MODE:-online}" -echo "==========================================" - -torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ - --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ - examples/launch_trainer.py \ - --config "${EXPERIMENT_CONFIG}" \ - --trainer trainer_model0 \ - "$@" 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/oolong/qwen3-4b-recursive-real/scripts/run_qwen3-4b-recursive.sh b/examples/oolong/qwen3-4b-recursive-real/scripts/run_qwen3-4b-recursive.sh deleted file mode 100755 index ced8ff7..0000000 --- a/examples/oolong/qwen3-4b-recursive-real/scripts/run_qwen3-4b-recursive.sh +++ /dev/null @@ -1,116 +0,0 @@ -#!/bin/bash -set -euo pipefail -# All-in-one launcher for AstraFlow training with the RECURSIVE-AGENT -# workflow on TextCraft (Qwen3-4B-Instruct-2507, M2PO, platoon port). -# -# Workflow: recursive_agent. Agent emits one {JSON} -# per turn (craft / get_info / view_inventory / spawn / finish). Spawn -# fans out up to 4 sub-agents in parallel via asyncio.gather, each -# inheriting the parent's inventory by reference. Tree-structured -# trajectory flattened to one trajectory with N sequences sharing the -# env-based team reward. -# -# TextCraft task data is synthesized locally on first run from the -# bundled Minecraft recipe DB (no HF download required). Files land at -# astraflow/core/workflow/impl/textcraft/textcraft_{train,val}.jsonl. -# -# Launches 3 processes: -# 1. AstraFlow HTTP service (CPU-only) -# 2. RaaS inference server (SGLang, SERVICE_CUDA_VISIBLE_DEVICES) -# 3. Trainer model0 (FSDP, TRAINER_MODEL0_GPUS) -# -# Usage: -# bash examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh - -# ============================================================================= -# Part 1: Load env and settings -# ============================================================================= -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -# Defined in examples/_common/utils.sh. -astraflow_load_experiment_env - -# ============================================================================= -# Part 2: Set up env -# ============================================================================= -# GPU assignments (default: 4 GPUs for inference, 4 for training) -export SERVICE_CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" -export TRAINER_MODEL0_GPUS="${TRAINER_MODEL0_GPUS:-4,5,6,7}" -# Ports / URLs (each component gets its own port) -export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" -export RAAS_PORT="${RAAS_PORT:-19190}" -export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" -export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" -export WEIGHT_TRANSFER_HTTP_PORT_MODEL0="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" - -TRAINER0_NPROC="$(echo "${TRAINER_MODEL0_GPUS}" | awk -F',' '{print NF}')" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. -# Defined in examples/_common/utils.sh. -astraflow_setup_env - -# ============================================================================= -# Part 3: Print info and clean up -# ============================================================================= -echo "=== AstraFlow (Qwen3-4B, TextCraft, M2PO, ctx32k, TCP, RECURSIVE AGENT) ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "RaaS config : ${RAAS_CONFIG}" -echo "RaaS GPUs : ${SERVICE_CUDA_VISIBLE_DEVICES}" -echo "Trainer model0 GPUs : ${TRAINER_MODEL0_GPUS} (FSDP dp${TRAINER0_NPROC})" -echo "RaaS port : ${RAAS_PORT}" -echo "AstraFlow port : ${ASTRAFLOW_PORT}" -echo "Sender HTTP model0 : ${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" -echo "WANDB mode : ${WANDB_MODE:-online}" -echo "==========================================================" - -trap astraflow_cleanup_trap EXIT INT TERM - -# Kill leftover processes and shared memory from prior runs. -# Defined in examples/_common/utils.sh. -astraflow_kill_stale - -# ============================================================================= -# Part 4: Launch training -# ============================================================================= -echo "[1/3] Starting AstraFlow HTTP service..." -CUDA_VISIBLE_DEVICES="" \ - python3 -u -m astraflow \ - --config "${EXPERIMENT_CONFIG}" \ - --port "${ASTRAFLOW_PORT}" \ - --host "${ASTRAFLOW_HOST}" \ - 2>&1 | tee "${LOG_DIR}/astraflow.log" & -sleep 5 - -echo "[2/3] Starting RaaS inference server (SGLang + TCP receiver)..." -CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES}" \ - python3 -u -m astraflow.raas.server \ - --host "${RAAS_HOST}" \ - --port "${RAAS_PORT}" \ - --config "${EXPERIMENT_CONFIG}" \ - --config "${RAAS_CONFIG}" \ - --engine-id "${ENGINE_ID:-default}" \ - --astraflow-url "${ASTRAFLOW_URL}" \ - 2>&1 | tee "${LOG_DIR}/raas.log" & -sleep 15 - -export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" - -echo "[3/3] Starting trainer model0..." -CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS}" \ -WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" \ - torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ - --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ - examples/launch_trainer.py \ - --config "${EXPERIMENT_CONFIG}" \ - --trainer trainer_model0 \ - "$@" \ - 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/oolong/qwen3-4b-recursive-real/yaml/experiment.yaml b/examples/oolong/qwen3-4b-recursive-real/yaml/experiment.yaml deleted file mode 100644 index 8be01f5..0000000 --- a/examples/oolong/qwen3-4b-recursive-real/yaml/experiment.yaml +++ /dev/null @@ -1,180 +0,0 @@ -# ============================================================================ -# Experiment config — AstraFlow service + Trainer (OOLONG RECURSIVE AGENT) -# Experiment: oolong / qwen3-4b-recursive -# -# Port of platoon's OOLONG-REAL design (see arxiv 2605.06639, "Recursive -# Agent Optimization", Gandhi et al.): -# - workflow_cls: oolong_recursive -# - Python-sandbox env (exec() namespace per agent), context pre-loaded -# into the sandbox not the prompt -# - ...... action format -# - launch_subagent(goal, context) for spawn; asyncio.gather for parallel -# - Reward = success + lambda * mean(children's success), lambda=0.4 -# - Synth-only rule-based grader for v1 (oolong-real LLM judge is TODO) -# -# Model: Qwen3-4B-Instruct-2507 (same as TextCraft recipe; paper used 30B -# but we use 4B for parity with our infra). -# -# GPU layout (8 GPUs): -# SERVICE_CUDA_VISIBLE_DEVICES=0,1,2,3 -> RaaS (model0 dp=4) -# TRAINER_MODEL0_GPUS=4,5,6,7 -> Trainer (FSDP, 4 GPUs) -# ============================================================================ - -experiment: - experiment_name: astraflow-oolong - trial_name: qwen3-4b-oolong-real-recursive - fileroot: ./data-experiments/${experiment.experiment_name}/${experiment.trial_name} - - model_path: "Qwen/Qwen3-4B-Instruct-2507" - tokenizer_path: "Qwen/Qwen3-4B-Instruct-2507" - seed: 1 - dtype: bfloat16 - weight_transfer_mode: tcp - weight_transfer_strategies: full - -raas: - models: - model0: - backend: sglang - gconfig: - n_samples: 8 - temperature: 1.0 - max_new_tokens: 2048 # per-turn budget; recursive Oolong likes longer thinking - min_new_tokens: 0 - -dataflow: - host: "0.0.0.0" - port: 8000 - - dump_dir: "./data-experiments/${experiment.experiment_name}/${experiment.trial_name}/rollout_dumps" - - buffer: - size: 10000 - replay_size: 10000 - replay_ratio: 0 - max_staleness: 8 - filter_function: filter_zero_adv - - rollout_dataset: - dataset_fn: "astraflow.dataflow.dataset.oolong:get_oolong_rl_dataset" - # oolong-real (D&D mystery / aggregation) — graded by the rule-based - # dnd_process_response: int -> 0.75^|gap|, str -> exact, list -> Jaccard. - # Model is expected to wrap final answer in \boxed{...} (parsed at high - # confidence); raw output is parsed at med confidence as a fallback. - # - # Note on context length: D&D contexts are 150K-200K CHARACTERS (~40-50K - # tokens), far larger than the model's 32K context window. They are - # loaded into the agent's Python sandbox as the `context: str` variable - # — the agent must chunk via `print(context[:N])` or delegate slices via - # `launch_subagent(context=context[a:b])`. max_context_len: 250000 keeps - # all 201 validation tasks through the filter (median len ~172K chars). - dataset: real - split: validation # real's validation set is small; switch to test for full eval - max_context_len: 250000 # raw char length cap (D&D needs >150K; do NOT lower without checking distribution) - num_tasks: 200 - - workflow_spec: - workflow_cls: "oolong_recursive" - reward_fn: "oolong_success" - max_depth: 2 # paper: 2 (0-indexed; 3 levels incl. root) - max_breadth: 4 # safety cap - max_steps_per_episode: 25 # root step cap - sub_max_steps: 15 # sub step cap (paper used 15 for sub) - max_concurrent_subagents: 8 - # With team-credit (workflow assigns root_reward to all agents), - # delegation_lambda is redundant: root_reward = root_success + λ·mean(0) = root_success - # since sub-agents have no node-local verifier without an LLM judge. - # Set to 0 to keep semantics explicit. Re-enable when LLM judge lands. - delegation_lambda: 0.0 - stdout_truncate: 8000 - enable_thinking: false - # v1 dump rate. Bump to inspect agent behavior. - dump_prob: 0.02 - - eval_workflows: - oolong_eval: - workflow_cls: "oolong_recursive" - reward_fn: "oolong_success" - max_depth: 2 - max_breadth: 4 - max_steps_per_episode: 25 - sub_max_steps: 15 - delegation_lambda: 0.0 # eval: only root reward counts - stdout_truncate: 8000 - enable_thinking: false - dump_prob: 0.05 - gconfig_overrides: - n_samples: 1 - temperature: 0.6 - - eval_datasets: - oolong_val: - dataset_fn: "astraflow.dataflow.dataset.oolong:get_oolong_eval_dataset" - dataset: real - split: test - max_context_len: 250000 # D&D needs >150K char headroom (see rollout_dataset note) - num_val: 50 - repeat: 1 - eval_workflow: oolong_eval - -trainer_base: - total_train_steps: 200 - # v2 with bs=64 collapsed (pre_filter 0.80→0.30 in 19 steps). With - # team-credit + recursive trees, each rollout produces ~15-30 sequences, - # so bs=64 covers only ~2-4 unique prompts/step — too few unique groups - # to survive filter_zero_adv. v20 (TextCraft) used bs=512 successfully; - # using bs=256 here as a balance. - train_batch_size: 256 - n_samples: 8 - engine: - backend: fsdp - data_parallel_size: 4 - - actor: - gradient_checkpointing: true - mb_spec: - max_tokens_per_mb: 32768 - optimizer: - type: adam - lr: 1e-6 # v2-v4 at 3e-6 degraded fast; Oolong has low headroom (~30%) and noisy reward, needs smaller updates - weight_decay: 0.0 - beta1: 0.9 - beta2: 0.95 - eps: 1e-8 - lr_scheduler_type: constant - gradient_clipping: 1.0 - # M2PO (same as TextCraft) - m2_threshold: 0.01 - eps_clip: 100.0 - eps_clip_higher: 100.0 - reward_scaling: 1 - reward_bias: 0 - kl_ctl: 0.00 - kl_penalty_coef: 0.001 - ppo_n_minibatches: 4 # bs=256 / 4 = 64 per minibatch (matches v20 ratio) - reward_norm: { mean_level: group, std_level: group } - adv_norm: { mean_level: batch, std_level: batch } - - ref: - path: "Qwen/Qwen3-4B-Instruct-2507" - mb_spec: - max_tokens_per_mb: 32768 - - recover: - mode: auto - freq_steps: 25 - - evaluator: - eval_at_start: false # skip v0 eval per [[eval-at-start-default-false]] - freq_steps: 20 - - stats_logger: - wandb: - mode: online - id_suffix: "uid" - -trainer_model0: - model_id: model0 - stats_logger: - wandb: - tags: ["oolong", "oolong-synth", "recursive-agent", "qwen3-4b", "m2po", "platoon-port"] diff --git a/examples/oolong/qwen3-4b-recursive-real/yaml/raas.yaml b/examples/oolong/qwen3-4b-recursive-real/yaml/raas.yaml deleted file mode 100644 index 396637d..0000000 --- a/examples/oolong/qwen3-4b-recursive-real/yaml/raas.yaml +++ /dev/null @@ -1,30 +0,0 @@ -# ============================================================================ -# RaaS config — Inference serving instance (hardware/resources) -# Experiment: oolong / qwen3-4b-recursive -# -# Hardware: 4x GPU, TP=1; model0 DP=4 -# Merged with experiment.yaml at launch (--config experiment.yaml --config raas.yaml) -# ============================================================================ - -rollout: - max_concurrent_rollouts: 1024 - max_concurrent_evals: 64 - pause_grace_period: 3 - enable_adaptive_availability: true - target_waiting_queue_per_dp: 4 - adaptive_step_size: 4 - load_cache_ttl_ms: 100 - -engine: - model0: - backend: sglang - data_parallel_size: 4 - -sglang: - # 32K context: matches paper's OOLONG-REAL training context window. - # Initial Oolong tasks have context_len <= ~8K chars (~2K tokens) so - # plenty of headroom even with recursion + per-turn observation history. - context_length: 32768 - mem_fraction_static: 0.65 - max_running_requests: null - skip_tokenizer_init: true diff --git a/examples/oolong/qwen3-4b-recursive/scripts/1_astraflow.sh b/examples/oolong/qwen3-4b-recursive/scripts/1_astraflow.sh deleted file mode 100755 index cf7df94..0000000 --- a/examples/oolong/qwen3-4b-recursive/scripts/1_astraflow.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash -set -euo pipefail -# [1/3] Launch AstraFlow HTTP service -# -# Usage (terminal 1): -# bash examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh - -export CUDA_VISIBLE_DEVICES="" - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -astraflow_load_experiment_env - -export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. -astraflow_setup_env - -echo "=== AstraFlow HTTP Service ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "Port : ${ASTRAFLOW_PORT}" -echo "===============================" - -python3 -u -m astraflow \ - --config "${EXPERIMENT_CONFIG}" \ - --port "${ASTRAFLOW_PORT}" \ - --host "${ASTRAFLOW_HOST}" \ - 2>&1 | tee "${LOG_DIR}/astraflow.log" diff --git a/examples/oolong/qwen3-4b-recursive/scripts/2_raas.sh b/examples/oolong/qwen3-4b-recursive/scripts/2_raas.sh deleted file mode 100755 index 5d88b2b..0000000 --- a/examples/oolong/qwen3-4b-recursive/scripts/2_raas.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash -set -euo pipefail -# [2/3] Launch RaaS inference server (SGLang + TCP receiver) -# -# Usage (terminal 2, after AstraFlow is ready): -# bash examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -astraflow_load_experiment_env - -export CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" -export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" -export RAAS_PORT="${RAAS_PORT:-19190}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" -export ASTRAFLOW_URL="${ASTRAFLOW_URL:-http://127.0.0.1:${ASTRAFLOW_PORT}}" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. -astraflow_setup_env - -echo "=== RaaS Inference Server (SGLang + TCP receiver) ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "RaaS config : ${RAAS_CONFIG}" -echo "GPUs : ${CUDA_VISIBLE_DEVICES}" -echo "Port : ${RAAS_PORT}" -echo "AstraFlow URL : ${ASTRAFLOW_URL}" -echo "=======================================================" - -python3 -u -m astraflow.raas.server \ - --host "${RAAS_HOST}" \ - --port "${RAAS_PORT}" \ - --config "${EXPERIMENT_CONFIG}" \ - --config "${RAAS_CONFIG}" \ - --engine-id "${ENGINE_ID:-default}" \ - --astraflow-url "${ASTRAFLOW_URL}" \ - 2>&1 | tee "${LOG_DIR}/raas.log" diff --git a/examples/oolong/qwen3-4b-recursive/scripts/3_trainer_model0.sh b/examples/oolong/qwen3-4b-recursive/scripts/3_trainer_model0.sh deleted file mode 100755 index cb8e850..0000000 --- a/examples/oolong/qwen3-4b-recursive/scripts/3_trainer_model0.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash -set -euo pipefail -# [3/3] Launch Trainer for model0 (TCP, sender_agent on local_rank 0) -# -# Usage (terminal 3, after AstraFlow and RaaS are ready): -# bash examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -astraflow_load_experiment_env - -export CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS:-4,5,6,7}" -TRAINER0_NPROC="$(echo "${CUDA_VISIBLE_DEVICES}" | awk -F',' '{print NF}')" - -export RAAS_PORT="${RAAS_PORT:-19190}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" -export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" -export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" - -# sender_agent (in trainer) listens on this HTTP port -export WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. -astraflow_setup_env - -echo "=== Trainer model0 (TCP) ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "GPUs : ${CUDA_VISIBLE_DEVICES} (FSDP dp${TRAINER0_NPROC})" -echo "AstraFlow : ${ASTRAFLOW_URL}" -echo "RaaS : ${ASTRAFLOW_RAAS_URL}" -echo "Sender HTTP : ${WEIGHT_TRANSFER_HTTP_PORT}" -echo "WANDB mode : ${WANDB_MODE:-online}" -echo "==========================================" - -torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ - --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ - examples/launch_trainer.py \ - --config "${EXPERIMENT_CONFIG}" \ - --trainer trainer_model0 \ - "$@" 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/oolong/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh b/examples/oolong/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh deleted file mode 100755 index ced8ff7..0000000 --- a/examples/oolong/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh +++ /dev/null @@ -1,116 +0,0 @@ -#!/bin/bash -set -euo pipefail -# All-in-one launcher for AstraFlow training with the RECURSIVE-AGENT -# workflow on TextCraft (Qwen3-4B-Instruct-2507, M2PO, platoon port). -# -# Workflow: recursive_agent. Agent emits one {JSON} -# per turn (craft / get_info / view_inventory / spawn / finish). Spawn -# fans out up to 4 sub-agents in parallel via asyncio.gather, each -# inheriting the parent's inventory by reference. Tree-structured -# trajectory flattened to one trajectory with N sequences sharing the -# env-based team reward. -# -# TextCraft task data is synthesized locally on first run from the -# bundled Minecraft recipe DB (no HF download required). Files land at -# astraflow/core/workflow/impl/textcraft/textcraft_{train,val}.jsonl. -# -# Launches 3 processes: -# 1. AstraFlow HTTP service (CPU-only) -# 2. RaaS inference server (SGLang, SERVICE_CUDA_VISIBLE_DEVICES) -# 3. Trainer model0 (FSDP, TRAINER_MODEL0_GPUS) -# -# Usage: -# bash examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh - -# ============================================================================= -# Part 1: Load env and settings -# ============================================================================= -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -# Defined in examples/_common/utils.sh. -astraflow_load_experiment_env - -# ============================================================================= -# Part 2: Set up env -# ============================================================================= -# GPU assignments (default: 4 GPUs for inference, 4 for training) -export SERVICE_CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" -export TRAINER_MODEL0_GPUS="${TRAINER_MODEL0_GPUS:-4,5,6,7}" -# Ports / URLs (each component gets its own port) -export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" -export RAAS_PORT="${RAAS_PORT:-19190}" -export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" -export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" -export WEIGHT_TRANSFER_HTTP_PORT_MODEL0="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" - -TRAINER0_NPROC="$(echo "${TRAINER_MODEL0_GPUS}" | awk -F',' '{print NF}')" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. -# Defined in examples/_common/utils.sh. -astraflow_setup_env - -# ============================================================================= -# Part 3: Print info and clean up -# ============================================================================= -echo "=== AstraFlow (Qwen3-4B, TextCraft, M2PO, ctx32k, TCP, RECURSIVE AGENT) ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "RaaS config : ${RAAS_CONFIG}" -echo "RaaS GPUs : ${SERVICE_CUDA_VISIBLE_DEVICES}" -echo "Trainer model0 GPUs : ${TRAINER_MODEL0_GPUS} (FSDP dp${TRAINER0_NPROC})" -echo "RaaS port : ${RAAS_PORT}" -echo "AstraFlow port : ${ASTRAFLOW_PORT}" -echo "Sender HTTP model0 : ${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" -echo "WANDB mode : ${WANDB_MODE:-online}" -echo "==========================================================" - -trap astraflow_cleanup_trap EXIT INT TERM - -# Kill leftover processes and shared memory from prior runs. -# Defined in examples/_common/utils.sh. -astraflow_kill_stale - -# ============================================================================= -# Part 4: Launch training -# ============================================================================= -echo "[1/3] Starting AstraFlow HTTP service..." -CUDA_VISIBLE_DEVICES="" \ - python3 -u -m astraflow \ - --config "${EXPERIMENT_CONFIG}" \ - --port "${ASTRAFLOW_PORT}" \ - --host "${ASTRAFLOW_HOST}" \ - 2>&1 | tee "${LOG_DIR}/astraflow.log" & -sleep 5 - -echo "[2/3] Starting RaaS inference server (SGLang + TCP receiver)..." -CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES}" \ - python3 -u -m astraflow.raas.server \ - --host "${RAAS_HOST}" \ - --port "${RAAS_PORT}" \ - --config "${EXPERIMENT_CONFIG}" \ - --config "${RAAS_CONFIG}" \ - --engine-id "${ENGINE_ID:-default}" \ - --astraflow-url "${ASTRAFLOW_URL}" \ - 2>&1 | tee "${LOG_DIR}/raas.log" & -sleep 15 - -export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" - -echo "[3/3] Starting trainer model0..." -CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS}" \ -WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" \ - torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ - --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ - examples/launch_trainer.py \ - --config "${EXPERIMENT_CONFIG}" \ - --trainer trainer_model0 \ - "$@" \ - 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/oolong/qwen3-4b-recursive/yaml/experiment.yaml b/examples/oolong/qwen3-4b-recursive/yaml/experiment.yaml deleted file mode 100644 index 56f72d0..0000000 --- a/examples/oolong/qwen3-4b-recursive/yaml/experiment.yaml +++ /dev/null @@ -1,171 +0,0 @@ -# ============================================================================ -# Experiment config — AstraFlow service + Trainer (OOLONG RECURSIVE AGENT) -# Experiment: oolong / qwen3-4b-recursive -# -# Port of platoon's OOLONG-REAL design (see arxiv 2605.06639, "Recursive -# Agent Optimization", Gandhi et al.): -# - workflow_cls: oolong_recursive -# - Python-sandbox env (exec() namespace per agent), context pre-loaded -# into the sandbox not the prompt -# - ...... action format -# - launch_subagent(goal, context) for spawn; asyncio.gather for parallel -# - Reward = success + lambda * mean(children's success), lambda=0.4 -# - Synth-only rule-based grader for v1 (oolong-real LLM judge is TODO) -# -# Model: Qwen3-4B-Instruct-2507 (same as TextCraft recipe; paper used 30B -# but we use 4B for parity with our infra). -# -# GPU layout (8 GPUs): -# SERVICE_CUDA_VISIBLE_DEVICES=0,1,2,3 -> RaaS (model0 dp=4) -# TRAINER_MODEL0_GPUS=4,5,6,7 -> Trainer (FSDP, 4 GPUs) -# ============================================================================ - -experiment: - experiment_name: astraflow-oolong - trial_name: qwen3-4b-oolong-recursive - fileroot: ./data-experiments/${experiment.experiment_name}/${experiment.trial_name} - - model_path: "Qwen/Qwen3-4B-Instruct-2507" - tokenizer_path: "Qwen/Qwen3-4B-Instruct-2507" - seed: 1 - dtype: bfloat16 - weight_transfer_mode: tcp - weight_transfer_strategies: full - -raas: - models: - model0: - backend: sglang - gconfig: - n_samples: 8 - temperature: 1.0 - max_new_tokens: 2048 # per-turn budget; recursive Oolong likes longer thinking - min_new_tokens: 0 - -dataflow: - host: "0.0.0.0" - port: 8000 - - dump_dir: "./data-experiments/${experiment.experiment_name}/${experiment.trial_name}/rollout_dumps" - - buffer: - size: 10000 - replay_size: 10000 - replay_ratio: 0 - max_staleness: 8 - filter_function: filter_zero_adv - - rollout_dataset: - dataset_fn: "astraflow.dataflow.dataset.oolong:get_oolong_rl_dataset" - # Start small: short-context validation tasks only. Once it learns to - # delegate, raise max_context_len and switch to test split. - dataset: synth - split: validation - max_context_len: 8000 # ~2K tokens; safe for 32K ctx + recursion - num_tasks: 200 # subset for fast iteration - - workflow_spec: - workflow_cls: "oolong_recursive" - reward_fn: "oolong_success" - max_depth: 2 # paper: 2 (0-indexed; 3 levels incl. root) - max_breadth: 4 # safety cap - max_steps_per_episode: 25 # root step cap - sub_max_steps: 15 # sub step cap (paper used 15 for sub) - max_concurrent_subagents: 8 - # With team-credit (workflow assigns root_reward to all agents), - # delegation_lambda is redundant: root_reward = root_success + λ·mean(0) = root_success - # since sub-agents have no node-local verifier without an LLM judge. - # Set to 0 to keep semantics explicit. Re-enable when LLM judge lands. - delegation_lambda: 0.0 - stdout_truncate: 8000 - enable_thinking: false - # v1 dump rate. Bump to inspect agent behavior. - dump_prob: 0.02 - - eval_workflows: - oolong_eval: - workflow_cls: "oolong_recursive" - reward_fn: "oolong_success" - max_depth: 2 - max_breadth: 4 - max_steps_per_episode: 25 - sub_max_steps: 15 - delegation_lambda: 0.0 # eval: only root reward counts - stdout_truncate: 8000 - enable_thinking: false - dump_prob: 0.05 - gconfig_overrides: - n_samples: 1 - temperature: 0.6 - - eval_datasets: - oolong_val: - dataset_fn: "astraflow.dataflow.dataset.oolong:get_oolong_eval_dataset" - dataset: synth - split: test - max_context_len: 8000 - num_val: 50 - repeat: 1 - eval_workflow: oolong_eval - -trainer_base: - total_train_steps: 200 - # v2 with bs=64 collapsed (pre_filter 0.80→0.30 in 19 steps). With - # team-credit + recursive trees, each rollout produces ~15-30 sequences, - # so bs=64 covers only ~2-4 unique prompts/step — too few unique groups - # to survive filter_zero_adv. v20 (TextCraft) used bs=512 successfully; - # using bs=256 here as a balance. - train_batch_size: 256 - n_samples: 8 - engine: - backend: fsdp - data_parallel_size: 4 - - actor: - gradient_checkpointing: true - mb_spec: - max_tokens_per_mb: 32768 - optimizer: - type: adam - lr: 1e-6 # v2-v4 at 3e-6 degraded fast; Oolong has low headroom (~30%) and noisy reward, needs smaller updates - weight_decay: 0.0 - beta1: 0.9 - beta2: 0.95 - eps: 1e-8 - lr_scheduler_type: constant - gradient_clipping: 1.0 - # M2PO (same as TextCraft) - m2_threshold: 0.01 - eps_clip: 100.0 - eps_clip_higher: 100.0 - reward_scaling: 1 - reward_bias: 0 - kl_ctl: 0.00 - kl_penalty_coef: 0.001 - ppo_n_minibatches: 4 # bs=256 / 4 = 64 per minibatch (matches v20 ratio) - reward_norm: { mean_level: group, std_level: group } - adv_norm: { mean_level: batch, std_level: batch } - - ref: - path: "Qwen/Qwen3-4B-Instruct-2507" - mb_spec: - max_tokens_per_mb: 32768 - - recover: - mode: auto - freq_steps: 25 - - evaluator: - eval_at_start: false # skip v0 eval per [[eval-at-start-default-false]] - freq_steps: 20 - - stats_logger: - wandb: - mode: online - id_suffix: "uid" - -trainer_model0: - model_id: model0 - stats_logger: - wandb: - tags: ["oolong", "oolong-synth", "recursive-agent", "qwen3-4b", "m2po", "platoon-port"] diff --git a/examples/oolong/qwen3-4b-recursive/yaml/raas.yaml b/examples/oolong/qwen3-4b-recursive/yaml/raas.yaml deleted file mode 100644 index 396637d..0000000 --- a/examples/oolong/qwen3-4b-recursive/yaml/raas.yaml +++ /dev/null @@ -1,30 +0,0 @@ -# ============================================================================ -# RaaS config — Inference serving instance (hardware/resources) -# Experiment: oolong / qwen3-4b-recursive -# -# Hardware: 4x GPU, TP=1; model0 DP=4 -# Merged with experiment.yaml at launch (--config experiment.yaml --config raas.yaml) -# ============================================================================ - -rollout: - max_concurrent_rollouts: 1024 - max_concurrent_evals: 64 - pause_grace_period: 3 - enable_adaptive_availability: true - target_waiting_queue_per_dp: 4 - adaptive_step_size: 4 - load_cache_ttl_ms: 100 - -engine: - model0: - backend: sglang - data_parallel_size: 4 - -sglang: - # 32K context: matches paper's OOLONG-REAL training context window. - # Initial Oolong tasks have context_len <= ~8K chars (~2K tokens) so - # plenty of headroom even with recursion + per-turn observation history. - context_length: 32768 - mem_fraction_static: 0.65 - max_running_requests: null - skip_tokenizer_init: true From 48f5205dd01ac889f707930da265e107577f8620 Mon Sep 17 00:00:00 2001 From: Haizhong Date: Tue, 2 Jun 2026 22:33:56 -0400 Subject: [PATCH 25/35] chore: remove unused deepdive and textcraft variant recipes Drop examples/deepdive (qwen3-4b-recursive, -v7): DeepDive needs a search server we don't currently run. The deepdive workflow, reward, and dataset code stay in place and registered, ready to use again once a search backend is available. Also drop the experimental TextCraft variants qwen3-4b-recursive-{gen4k,lr5e6}, keeping the base qwen3-4b-recursive (the recipe actually in use). --- .../scripts/1_astraflow.sh | 36 ---- .../qwen3-4b-recursive-v7/scripts/2_raas.sh | 44 ----- .../scripts/3_trainer_model0.sh | 47 ----- .../scripts/run_qwen3-4b-recursive.sh | 132 -------------- .../yaml/experiment.yaml | 170 ------------------ .../qwen3-4b-recursive-v7/yaml/raas.yaml | 30 ---- .../qwen3-4b-recursive/scripts/1_astraflow.sh | 36 ---- .../qwen3-4b-recursive/scripts/2_raas.sh | 44 ----- .../scripts/3_trainer_model0.sh | 47 ----- .../scripts/run_qwen3-4b-recursive.sh | 132 -------------- .../qwen3-4b-recursive/yaml/experiment.yaml | 170 ------------------ .../qwen3-4b-recursive/yaml/raas.yaml | 30 ---- .../scripts/1_astraflow.sh | 36 ---- .../scripts/2_raas.sh | 44 ----- .../scripts/3_trainer_model0.sh | 47 ----- .../scripts/run_qwen3-4b-recursive.sh | 116 ------------ .../yaml/experiment.yaml | 166 ----------------- .../qwen3-4b-recursive-gen4k/yaml/raas.yaml | 35 ---- .../scripts/1_astraflow.sh | 36 ---- .../scripts/2_raas.sh | 44 ----- .../scripts/3_trainer_model0.sh | 47 ----- .../scripts/run_qwen3-4b-recursive.sh | 116 ------------ .../yaml/experiment.yaml | 166 ----------------- .../qwen3-4b-recursive-lr5e6/yaml/raas.yaml | 35 ---- 24 files changed, 1806 deletions(-) delete mode 100755 examples/deepdive/qwen3-4b-recursive-v7/scripts/1_astraflow.sh delete mode 100755 examples/deepdive/qwen3-4b-recursive-v7/scripts/2_raas.sh delete mode 100755 examples/deepdive/qwen3-4b-recursive-v7/scripts/3_trainer_model0.sh delete mode 100755 examples/deepdive/qwen3-4b-recursive-v7/scripts/run_qwen3-4b-recursive.sh delete mode 100644 examples/deepdive/qwen3-4b-recursive-v7/yaml/experiment.yaml delete mode 100644 examples/deepdive/qwen3-4b-recursive-v7/yaml/raas.yaml delete mode 100755 examples/deepdive/qwen3-4b-recursive/scripts/1_astraflow.sh delete mode 100755 examples/deepdive/qwen3-4b-recursive/scripts/2_raas.sh delete mode 100755 examples/deepdive/qwen3-4b-recursive/scripts/3_trainer_model0.sh delete mode 100755 examples/deepdive/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh delete mode 100644 examples/deepdive/qwen3-4b-recursive/yaml/experiment.yaml delete mode 100644 examples/deepdive/qwen3-4b-recursive/yaml/raas.yaml delete mode 100755 examples/textcraft/qwen3-4b-recursive-gen4k/scripts/1_astraflow.sh delete mode 100755 examples/textcraft/qwen3-4b-recursive-gen4k/scripts/2_raas.sh delete mode 100755 examples/textcraft/qwen3-4b-recursive-gen4k/scripts/3_trainer_model0.sh delete mode 100755 examples/textcraft/qwen3-4b-recursive-gen4k/scripts/run_qwen3-4b-recursive.sh delete mode 100644 examples/textcraft/qwen3-4b-recursive-gen4k/yaml/experiment.yaml delete mode 100644 examples/textcraft/qwen3-4b-recursive-gen4k/yaml/raas.yaml delete mode 100755 examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/1_astraflow.sh delete mode 100755 examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/2_raas.sh delete mode 100755 examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/3_trainer_model0.sh delete mode 100755 examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/run_qwen3-4b-recursive.sh delete mode 100644 examples/textcraft/qwen3-4b-recursive-lr5e6/yaml/experiment.yaml delete mode 100644 examples/textcraft/qwen3-4b-recursive-lr5e6/yaml/raas.yaml diff --git a/examples/deepdive/qwen3-4b-recursive-v7/scripts/1_astraflow.sh b/examples/deepdive/qwen3-4b-recursive-v7/scripts/1_astraflow.sh deleted file mode 100755 index cf7df94..0000000 --- a/examples/deepdive/qwen3-4b-recursive-v7/scripts/1_astraflow.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash -set -euo pipefail -# [1/3] Launch AstraFlow HTTP service -# -# Usage (terminal 1): -# bash examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh - -export CUDA_VISIBLE_DEVICES="" - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -astraflow_load_experiment_env - -export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. -astraflow_setup_env - -echo "=== AstraFlow HTTP Service ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "Port : ${ASTRAFLOW_PORT}" -echo "===============================" - -python3 -u -m astraflow \ - --config "${EXPERIMENT_CONFIG}" \ - --port "${ASTRAFLOW_PORT}" \ - --host "${ASTRAFLOW_HOST}" \ - 2>&1 | tee "${LOG_DIR}/astraflow.log" diff --git a/examples/deepdive/qwen3-4b-recursive-v7/scripts/2_raas.sh b/examples/deepdive/qwen3-4b-recursive-v7/scripts/2_raas.sh deleted file mode 100755 index 5d88b2b..0000000 --- a/examples/deepdive/qwen3-4b-recursive-v7/scripts/2_raas.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash -set -euo pipefail -# [2/3] Launch RaaS inference server (SGLang + TCP receiver) -# -# Usage (terminal 2, after AstraFlow is ready): -# bash examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -astraflow_load_experiment_env - -export CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" -export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" -export RAAS_PORT="${RAAS_PORT:-19190}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" -export ASTRAFLOW_URL="${ASTRAFLOW_URL:-http://127.0.0.1:${ASTRAFLOW_PORT}}" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. -astraflow_setup_env - -echo "=== RaaS Inference Server (SGLang + TCP receiver) ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "RaaS config : ${RAAS_CONFIG}" -echo "GPUs : ${CUDA_VISIBLE_DEVICES}" -echo "Port : ${RAAS_PORT}" -echo "AstraFlow URL : ${ASTRAFLOW_URL}" -echo "=======================================================" - -python3 -u -m astraflow.raas.server \ - --host "${RAAS_HOST}" \ - --port "${RAAS_PORT}" \ - --config "${EXPERIMENT_CONFIG}" \ - --config "${RAAS_CONFIG}" \ - --engine-id "${ENGINE_ID:-default}" \ - --astraflow-url "${ASTRAFLOW_URL}" \ - 2>&1 | tee "${LOG_DIR}/raas.log" diff --git a/examples/deepdive/qwen3-4b-recursive-v7/scripts/3_trainer_model0.sh b/examples/deepdive/qwen3-4b-recursive-v7/scripts/3_trainer_model0.sh deleted file mode 100755 index cb8e850..0000000 --- a/examples/deepdive/qwen3-4b-recursive-v7/scripts/3_trainer_model0.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash -set -euo pipefail -# [3/3] Launch Trainer for model0 (TCP, sender_agent on local_rank 0) -# -# Usage (terminal 3, after AstraFlow and RaaS are ready): -# bash examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -astraflow_load_experiment_env - -export CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS:-4,5,6,7}" -TRAINER0_NPROC="$(echo "${CUDA_VISIBLE_DEVICES}" | awk -F',' '{print NF}')" - -export RAAS_PORT="${RAAS_PORT:-19190}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" -export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" -export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" - -# sender_agent (in trainer) listens on this HTTP port -export WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. -astraflow_setup_env - -echo "=== Trainer model0 (TCP) ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "GPUs : ${CUDA_VISIBLE_DEVICES} (FSDP dp${TRAINER0_NPROC})" -echo "AstraFlow : ${ASTRAFLOW_URL}" -echo "RaaS : ${ASTRAFLOW_RAAS_URL}" -echo "Sender HTTP : ${WEIGHT_TRANSFER_HTTP_PORT}" -echo "WANDB mode : ${WANDB_MODE:-online}" -echo "==========================================" - -torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ - --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ - examples/launch_trainer.py \ - --config "${EXPERIMENT_CONFIG}" \ - --trainer trainer_model0 \ - "$@" 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/deepdive/qwen3-4b-recursive-v7/scripts/run_qwen3-4b-recursive.sh b/examples/deepdive/qwen3-4b-recursive-v7/scripts/run_qwen3-4b-recursive.sh deleted file mode 100755 index a927522..0000000 --- a/examples/deepdive/qwen3-4b-recursive-v7/scripts/run_qwen3-4b-recursive.sh +++ /dev/null @@ -1,132 +0,0 @@ -#!/bin/bash -set -euo pipefail -# All-in-one launcher for AstraFlow training with the DEEPDIVE RECURSIVE-AGENT -# workflow (Qwen3-4B-Instruct-2507, M2PO, platoon port). -# -# Workflow: deepdive_recursive. Agent emits one -# ...... per turn. Python sandbox -# exposes async tools: search_web (CMU RAG), launch_subagent, finish. -# Reward: LLM judge for root (vs ground_truth) and for sub-agents. -# -# DeepDive task data auto-downloaded from HF (zai-org/DeepDive) on first -# run; cache lands at astraflow/core/workflow/impl/deepdive/deepdive_*.jsonl. -# -# External services required: -# - Fireworks API: ~/.fireworks_key (FIREWORKS_API_KEY for LLM judge) -# - CMU RAG search: ~/.cmu_search_key (CMU_SEARCH_API_KEY for search_web) -# -# Launches 3 processes: -# 1. AstraFlow HTTP service (CPU-only) -# 2. RaaS inference server (SGLang, SERVICE_CUDA_VISIBLE_DEVICES) -# 3. Trainer model0 (FSDP, TRAINER_MODEL0_GPUS) -# -# Usage: -# bash examples/deepdive/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh - -# ============================================================================= -# Part 1: Load env and settings -# ============================================================================= -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -# Defined in examples/_common/utils.sh. -astraflow_load_experiment_env - -# Source API keys for the LLM judge and the CMU RAG search. Both files are -# gitignored locally (~/.fireworks_key, ~/.cmu_search_key). The trainer needs -# both visible in its env; we export them with `set -a` so child processes -# inherit them. -set -a -[[ -f "${HOME}/.fireworks_key" ]] && source "${HOME}/.fireworks_key" -[[ -f "${HOME}/.cmu_search_key" ]] && source "${HOME}/.cmu_search_key" -set +a -if [[ -z "${FIREWORKS_API_KEY:-}" ]]; then - echo "WARNING: FIREWORKS_API_KEY not set — LLM judge calls will fail" >&2 -fi -if [[ -z "${CMU_SEARCH_API_KEY:-}" ]]; then - echo "WARNING: CMU_SEARCH_API_KEY not set — search_web calls will fail" >&2 -fi - -# ============================================================================= -# Part 2: Set up env -# ============================================================================= -# GPU assignments (default: 4 GPUs for inference, 4 for training) -export SERVICE_CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" -export TRAINER_MODEL0_GPUS="${TRAINER_MODEL0_GPUS:-4,5,6,7}" -# Ports / URLs (each component gets its own port) -export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" -export RAAS_PORT="${RAAS_PORT:-19190}" -export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" -export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" -export WEIGHT_TRANSFER_HTTP_PORT_MODEL0="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" - -TRAINER0_NPROC="$(echo "${TRAINER_MODEL0_GPUS}" | awk -F',' '{print NF}')" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. -# Defined in examples/_common/utils.sh. -astraflow_setup_env - -# ============================================================================= -# Part 3: Print info and clean up -# ============================================================================= -echo "=== AstraFlow (Qwen3-4B, DeepDive, M2PO, ctx40k, TCP, RECURSIVE AGENT) ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "RaaS config : ${RAAS_CONFIG}" -echo "RaaS GPUs : ${SERVICE_CUDA_VISIBLE_DEVICES}" -echo "Trainer model0 GPUs : ${TRAINER_MODEL0_GPUS} (FSDP dp${TRAINER0_NPROC})" -echo "RaaS port : ${RAAS_PORT}" -echo "AstraFlow port : ${ASTRAFLOW_PORT}" -echo "Sender HTTP model0 : ${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" -echo "WANDB mode : ${WANDB_MODE:-online}" -echo "==========================================================" - -trap astraflow_cleanup_trap EXIT INT TERM - -# Kill leftover processes and shared memory from prior runs. -# Defined in examples/_common/utils.sh. -astraflow_kill_stale - -# ============================================================================= -# Part 4: Launch training -# ============================================================================= -echo "[1/3] Starting AstraFlow HTTP service..." -CUDA_VISIBLE_DEVICES="" \ - python3 -u -m astraflow \ - --config "${EXPERIMENT_CONFIG}" \ - --port "${ASTRAFLOW_PORT}" \ - --host "${ASTRAFLOW_HOST}" \ - 2>&1 | tee "${LOG_DIR}/astraflow.log" & -sleep 5 - -echo "[2/3] Starting RaaS inference server (SGLang + TCP receiver)..." -CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES}" \ - python3 -u -m astraflow.raas.server \ - --host "${RAAS_HOST}" \ - --port "${RAAS_PORT}" \ - --config "${EXPERIMENT_CONFIG}" \ - --config "${RAAS_CONFIG}" \ - --engine-id "${ENGINE_ID:-default}" \ - --astraflow-url "${ASTRAFLOW_URL}" \ - 2>&1 | tee "${LOG_DIR}/raas.log" & -sleep 15 - -export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" - -echo "[3/3] Starting trainer model0..." -CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS}" \ -WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" \ - torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ - --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ - examples/launch_trainer.py \ - --config "${EXPERIMENT_CONFIG}" \ - --trainer trainer_model0 \ - "$@" \ - 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/deepdive/qwen3-4b-recursive-v7/yaml/experiment.yaml b/examples/deepdive/qwen3-4b-recursive-v7/yaml/experiment.yaml deleted file mode 100644 index 9b73623..0000000 --- a/examples/deepdive/qwen3-4b-recursive-v7/yaml/experiment.yaml +++ /dev/null @@ -1,170 +0,0 @@ -# ============================================================================ -# Experiment config — AstraFlow service + Trainer (DEEPDIVE RECURSIVE AGENT) -# Experiment: deepdive / qwen3-4b-recursive -# -# Port of platoon's DeepDive RL recipe (see configs/areal/deepdive_areal.yaml): -# - workflow_cls: deepdive_recursive -# - Python-sandbox env (exec() namespace per agent), NO pre-loaded context -# - Tools: search_web(query, n_docs) via CMU RAG, launch_subagent(goal), -# finish(answer), asyncio -# - ...... action format -# - Reward: LLM judge for root (vs ground_truth) AND for sub-agents (vs goal) -# -- DeepDive has no rule-based grader, judge is always required -# - delegation_lambda = 0.0 (matches platoon's _DEEPDIVE_DELEGATION_REWARD_CAP) -# -# Model: Qwen3-4B-Instruct-2507 (same as TextCraft; platoon uses same) -# -# GPU layout (8 GPUs): -# SERVICE_CUDA_VISIBLE_DEVICES=0,1,2,3 -> RaaS (model0 dp=4) -# TRAINER_MODEL0_GPUS=4,5,6,7 -> Trainer (FSDP, 4 GPUs) -# -# External services required at launch: -# - FIREWORKS_API_KEY for astraEnv.judge (~/.fireworks_key) -# - CMU_SEARCH_API_KEY for astraEnv.search (~/.cmu_search_key) -# ============================================================================ - -experiment: - experiment_name: astraflow-deepdive - trial_name: qwen3-4b-deepdive-recursive-v7 - fileroot: ./data-experiments/${experiment.experiment_name}/${experiment.trial_name} - - model_path: "Qwen/Qwen3-4B-Instruct-2507" - tokenizer_path: "Qwen/Qwen3-4B-Instruct-2507" - seed: 1 - dtype: bfloat16 - weight_transfer_mode: tcp - weight_transfer_strategies: full - -raas: - models: - model0: - backend: sglang - gconfig: - n_samples: 8 - temperature: 1.0 - max_new_tokens: 8192 # platoon default for DeepDive — research needs long replies - min_new_tokens: 0 - -dataflow: - host: "0.0.0.0" - port: 8000 - - dump_dir: "./data-experiments/${experiment.experiment_name}/${experiment.trial_name}/rollout_dumps" - - buffer: - size: 10000 - replay_size: 10000 - replay_ratio: 0 - max_staleness: 8 - # filter_zero_adv: drop prompt groups where all 8 samples got identical - # rewards (= zero group variance = zero gradient signal). Matches - # platoon's filter_zero_variance_groups: True default. Required when - # the root rubric is binary (success bool → 0/1) since many groups - # naturally come out all-0 or all-1 for a base model on a hard task. - filter_function: filter_zero_adv - - rollout_dataset: - dataset_fn: "astraflow.dataflow.dataset.deepdive:get_deepdive_rl_dataset" - split: qa_rl # platoon: train_split - num_tasks: null # platoon: train_num_tasks=null (use all) - - workflow_spec: - workflow_cls: "deepdive_recursive" - reward_fn: "deepdive_success" - # Reward mode — selects which credit-assignment scheme to use: - # team_credit: all agents train on root's LLM-judged reward (cheap). - # per_agent_judge: each agent trains on its own LLM-judged reward - # (more judge calls; closer to "true" per-agent credit). - # Default matches platoon's behavior (delegation_cap=0 → effectively - # team_credit). Switch to per_agent_judge for the LLM-judge-everywhere - # experiment if team_credit doesn't move accuracy. - reward_mode: team_credit - max_depth: 4 # platoon: DepthAwareStepBudgetTracker(max_depth=4) - max_steps_per_episode: 25 # platoon: max_steps=25 - sub_max_steps: 15 - max_concurrent_subagents: 4 # conservative; bump if RaaS queue stays low - delegation_lambda: 0.0 # platoon: _DEEPDIVE_DELEGATION_REWARD_CAP=0.0 - stdout_truncate: 8000 - enable_thinking: false - dump_prob: 0.25 # ~64 dumps/step at bs=256 — denser sampling for debugging - - eval_workflows: - deepdive_eval: - workflow_cls: "deepdive_recursive" - reward_fn: "deepdive_success" - reward_mode: team_credit - max_depth: 4 - max_steps_per_episode: 25 - sub_max_steps: 15 - delegation_lambda: 0.0 - stdout_truncate: 8000 - enable_thinking: false - dump_prob: 0.25 - gconfig_overrides: - n_samples: 1 - temperature: 0.6 - - eval_datasets: - deepdive_val: - dataset_fn: "astraflow.dataflow.dataset.deepdive:get_deepdive_eval_dataset" - split: qa_sft # platoon: eval_split - num_val: 100 # platoon: eval_num_tasks=100 - repeat: 1 - eval_workflow: deepdive_eval - -trainer_base: - total_train_steps: 500 # v4 action format stable; train at scale for 500 iters - train_batch_size: 256 # bumped back from v2's diagnostic bs=64 - n_samples: 8 - engine: - backend: fsdp - data_parallel_size: 4 - - actor: - gradient_checkpointing: true - mb_spec: - max_tokens_per_mb: 40000 # match context_length=40001 (platoon uses 40000) - optimizer: - type: adam - lr: 3e-6 # platoon's lr - weight_decay: 0.0 - beta1: 0.9 - beta2: 0.95 - eps: 1e-8 - lr_scheduler_type: constant - gradient_clipping: 1.0 - # M2PO (we keep our loss; platoon uses CISPO) - m2_threshold: 0.01 - eps_clip: 100.0 - eps_clip_higher: 100.0 - reward_scaling: 1 - reward_bias: 0 - kl_ctl: 0.00 - kl_penalty_coef: 0.001 - ppo_n_minibatches: 4 - reward_norm: { mean_level: group, std_level: group } - adv_norm: { mean_level: batch, std_level: batch } - - ref: - path: "Qwen/Qwen3-4B-Instruct-2507" - mb_spec: - max_tokens_per_mb: 40000 - - recover: - mode: auto - freq_steps: 25 - - evaluator: - eval_at_start: false # skip v0 eval per [[eval-at-start-default-false]] - freq_steps: 20 - - stats_logger: - wandb: - mode: online - id_suffix: "uid" - -trainer_model0: - model_id: model0 - stats_logger: - wandb: - tags: ["deepdive", "recursive-agent", "qwen3-4b", "m2po", "llm-judge"] diff --git a/examples/deepdive/qwen3-4b-recursive-v7/yaml/raas.yaml b/examples/deepdive/qwen3-4b-recursive-v7/yaml/raas.yaml deleted file mode 100644 index 3841921..0000000 --- a/examples/deepdive/qwen3-4b-recursive-v7/yaml/raas.yaml +++ /dev/null @@ -1,30 +0,0 @@ -# ============================================================================ -# RaaS config — Inference serving instance (hardware/resources) -# Experiment: deepdive / qwen3-4b-recursive -# -# Hardware: 4x GPU, TP=1; model0 DP=4 -# Merged with experiment.yaml at launch (--config experiment.yaml --config raas.yaml) -# ============================================================================ - -rollout: - max_concurrent_rollouts: 1024 - max_concurrent_evals: 64 - pause_grace_period: 3 - enable_adaptive_availability: true - target_waiting_queue_per_dp: 4 - adaptive_step_size: 4 - load_cache_ttl_ms: 100 - -engine: - model0: - backend: sglang - data_parallel_size: 4 - -sglang: - # 40K context — matches platoon's DeepDive recipe (context_length: 40001). - # DeepDive rollouts can be long: many search calls + observations + the - # agent's own reasoning. 32K was insufficient in platoon's experience. - context_length: 40001 - mem_fraction_static: 0.8 # platoon's default - max_running_requests: null - skip_tokenizer_init: true diff --git a/examples/deepdive/qwen3-4b-recursive/scripts/1_astraflow.sh b/examples/deepdive/qwen3-4b-recursive/scripts/1_astraflow.sh deleted file mode 100755 index cf7df94..0000000 --- a/examples/deepdive/qwen3-4b-recursive/scripts/1_astraflow.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash -set -euo pipefail -# [1/3] Launch AstraFlow HTTP service -# -# Usage (terminal 1): -# bash examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh - -export CUDA_VISIBLE_DEVICES="" - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -astraflow_load_experiment_env - -export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. -astraflow_setup_env - -echo "=== AstraFlow HTTP Service ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "Port : ${ASTRAFLOW_PORT}" -echo "===============================" - -python3 -u -m astraflow \ - --config "${EXPERIMENT_CONFIG}" \ - --port "${ASTRAFLOW_PORT}" \ - --host "${ASTRAFLOW_HOST}" \ - 2>&1 | tee "${LOG_DIR}/astraflow.log" diff --git a/examples/deepdive/qwen3-4b-recursive/scripts/2_raas.sh b/examples/deepdive/qwen3-4b-recursive/scripts/2_raas.sh deleted file mode 100755 index 5d88b2b..0000000 --- a/examples/deepdive/qwen3-4b-recursive/scripts/2_raas.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash -set -euo pipefail -# [2/3] Launch RaaS inference server (SGLang + TCP receiver) -# -# Usage (terminal 2, after AstraFlow is ready): -# bash examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -astraflow_load_experiment_env - -export CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" -export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" -export RAAS_PORT="${RAAS_PORT:-19190}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" -export ASTRAFLOW_URL="${ASTRAFLOW_URL:-http://127.0.0.1:${ASTRAFLOW_PORT}}" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. -astraflow_setup_env - -echo "=== RaaS Inference Server (SGLang + TCP receiver) ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "RaaS config : ${RAAS_CONFIG}" -echo "GPUs : ${CUDA_VISIBLE_DEVICES}" -echo "Port : ${RAAS_PORT}" -echo "AstraFlow URL : ${ASTRAFLOW_URL}" -echo "=======================================================" - -python3 -u -m astraflow.raas.server \ - --host "${RAAS_HOST}" \ - --port "${RAAS_PORT}" \ - --config "${EXPERIMENT_CONFIG}" \ - --config "${RAAS_CONFIG}" \ - --engine-id "${ENGINE_ID:-default}" \ - --astraflow-url "${ASTRAFLOW_URL}" \ - 2>&1 | tee "${LOG_DIR}/raas.log" diff --git a/examples/deepdive/qwen3-4b-recursive/scripts/3_trainer_model0.sh b/examples/deepdive/qwen3-4b-recursive/scripts/3_trainer_model0.sh deleted file mode 100755 index cb8e850..0000000 --- a/examples/deepdive/qwen3-4b-recursive/scripts/3_trainer_model0.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash -set -euo pipefail -# [3/3] Launch Trainer for model0 (TCP, sender_agent on local_rank 0) -# -# Usage (terminal 3, after AstraFlow and RaaS are ready): -# bash examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -astraflow_load_experiment_env - -export CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS:-4,5,6,7}" -TRAINER0_NPROC="$(echo "${CUDA_VISIBLE_DEVICES}" | awk -F',' '{print NF}')" - -export RAAS_PORT="${RAAS_PORT:-19190}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" -export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" -export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" - -# sender_agent (in trainer) listens on this HTTP port -export WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. -astraflow_setup_env - -echo "=== Trainer model0 (TCP) ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "GPUs : ${CUDA_VISIBLE_DEVICES} (FSDP dp${TRAINER0_NPROC})" -echo "AstraFlow : ${ASTRAFLOW_URL}" -echo "RaaS : ${ASTRAFLOW_RAAS_URL}" -echo "Sender HTTP : ${WEIGHT_TRANSFER_HTTP_PORT}" -echo "WANDB mode : ${WANDB_MODE:-online}" -echo "==========================================" - -torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ - --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ - examples/launch_trainer.py \ - --config "${EXPERIMENT_CONFIG}" \ - --trainer trainer_model0 \ - "$@" 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/deepdive/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh b/examples/deepdive/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh deleted file mode 100755 index a927522..0000000 --- a/examples/deepdive/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh +++ /dev/null @@ -1,132 +0,0 @@ -#!/bin/bash -set -euo pipefail -# All-in-one launcher for AstraFlow training with the DEEPDIVE RECURSIVE-AGENT -# workflow (Qwen3-4B-Instruct-2507, M2PO, platoon port). -# -# Workflow: deepdive_recursive. Agent emits one -# ...... per turn. Python sandbox -# exposes async tools: search_web (CMU RAG), launch_subagent, finish. -# Reward: LLM judge for root (vs ground_truth) and for sub-agents. -# -# DeepDive task data auto-downloaded from HF (zai-org/DeepDive) on first -# run; cache lands at astraflow/core/workflow/impl/deepdive/deepdive_*.jsonl. -# -# External services required: -# - Fireworks API: ~/.fireworks_key (FIREWORKS_API_KEY for LLM judge) -# - CMU RAG search: ~/.cmu_search_key (CMU_SEARCH_API_KEY for search_web) -# -# Launches 3 processes: -# 1. AstraFlow HTTP service (CPU-only) -# 2. RaaS inference server (SGLang, SERVICE_CUDA_VISIBLE_DEVICES) -# 3. Trainer model0 (FSDP, TRAINER_MODEL0_GPUS) -# -# Usage: -# bash examples/deepdive/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh - -# ============================================================================= -# Part 1: Load env and settings -# ============================================================================= -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -# Defined in examples/_common/utils.sh. -astraflow_load_experiment_env - -# Source API keys for the LLM judge and the CMU RAG search. Both files are -# gitignored locally (~/.fireworks_key, ~/.cmu_search_key). The trainer needs -# both visible in its env; we export them with `set -a` so child processes -# inherit them. -set -a -[[ -f "${HOME}/.fireworks_key" ]] && source "${HOME}/.fireworks_key" -[[ -f "${HOME}/.cmu_search_key" ]] && source "${HOME}/.cmu_search_key" -set +a -if [[ -z "${FIREWORKS_API_KEY:-}" ]]; then - echo "WARNING: FIREWORKS_API_KEY not set — LLM judge calls will fail" >&2 -fi -if [[ -z "${CMU_SEARCH_API_KEY:-}" ]]; then - echo "WARNING: CMU_SEARCH_API_KEY not set — search_web calls will fail" >&2 -fi - -# ============================================================================= -# Part 2: Set up env -# ============================================================================= -# GPU assignments (default: 4 GPUs for inference, 4 for training) -export SERVICE_CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" -export TRAINER_MODEL0_GPUS="${TRAINER_MODEL0_GPUS:-4,5,6,7}" -# Ports / URLs (each component gets its own port) -export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" -export RAAS_PORT="${RAAS_PORT:-19190}" -export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" -export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" -export WEIGHT_TRANSFER_HTTP_PORT_MODEL0="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" - -TRAINER0_NPROC="$(echo "${TRAINER_MODEL0_GPUS}" | awk -F',' '{print NF}')" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. -# Defined in examples/_common/utils.sh. -astraflow_setup_env - -# ============================================================================= -# Part 3: Print info and clean up -# ============================================================================= -echo "=== AstraFlow (Qwen3-4B, DeepDive, M2PO, ctx40k, TCP, RECURSIVE AGENT) ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "RaaS config : ${RAAS_CONFIG}" -echo "RaaS GPUs : ${SERVICE_CUDA_VISIBLE_DEVICES}" -echo "Trainer model0 GPUs : ${TRAINER_MODEL0_GPUS} (FSDP dp${TRAINER0_NPROC})" -echo "RaaS port : ${RAAS_PORT}" -echo "AstraFlow port : ${ASTRAFLOW_PORT}" -echo "Sender HTTP model0 : ${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" -echo "WANDB mode : ${WANDB_MODE:-online}" -echo "==========================================================" - -trap astraflow_cleanup_trap EXIT INT TERM - -# Kill leftover processes and shared memory from prior runs. -# Defined in examples/_common/utils.sh. -astraflow_kill_stale - -# ============================================================================= -# Part 4: Launch training -# ============================================================================= -echo "[1/3] Starting AstraFlow HTTP service..." -CUDA_VISIBLE_DEVICES="" \ - python3 -u -m astraflow \ - --config "${EXPERIMENT_CONFIG}" \ - --port "${ASTRAFLOW_PORT}" \ - --host "${ASTRAFLOW_HOST}" \ - 2>&1 | tee "${LOG_DIR}/astraflow.log" & -sleep 5 - -echo "[2/3] Starting RaaS inference server (SGLang + TCP receiver)..." -CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES}" \ - python3 -u -m astraflow.raas.server \ - --host "${RAAS_HOST}" \ - --port "${RAAS_PORT}" \ - --config "${EXPERIMENT_CONFIG}" \ - --config "${RAAS_CONFIG}" \ - --engine-id "${ENGINE_ID:-default}" \ - --astraflow-url "${ASTRAFLOW_URL}" \ - 2>&1 | tee "${LOG_DIR}/raas.log" & -sleep 15 - -export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" - -echo "[3/3] Starting trainer model0..." -CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS}" \ -WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" \ - torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ - --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ - examples/launch_trainer.py \ - --config "${EXPERIMENT_CONFIG}" \ - --trainer trainer_model0 \ - "$@" \ - 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/deepdive/qwen3-4b-recursive/yaml/experiment.yaml b/examples/deepdive/qwen3-4b-recursive/yaml/experiment.yaml deleted file mode 100644 index 1f3a4b0..0000000 --- a/examples/deepdive/qwen3-4b-recursive/yaml/experiment.yaml +++ /dev/null @@ -1,170 +0,0 @@ -# ============================================================================ -# Experiment config — AstraFlow service + Trainer (DEEPDIVE RECURSIVE AGENT) -# Experiment: deepdive / qwen3-4b-recursive -# -# Port of platoon's DeepDive RL recipe (see configs/areal/deepdive_areal.yaml): -# - workflow_cls: deepdive_recursive -# - Python-sandbox env (exec() namespace per agent), NO pre-loaded context -# - Tools: search_web(query, n_docs) via CMU RAG, launch_subagent(goal), -# finish(answer), asyncio -# - ...... action format -# - Reward: LLM judge for root (vs ground_truth) AND for sub-agents (vs goal) -# -- DeepDive has no rule-based grader, judge is always required -# - delegation_lambda = 0.0 (matches platoon's _DEEPDIVE_DELEGATION_REWARD_CAP) -# -# Model: Qwen3-4B-Instruct-2507 (same as TextCraft; platoon uses same) -# -# GPU layout (8 GPUs): -# SERVICE_CUDA_VISIBLE_DEVICES=0,1,2,3 -> RaaS (model0 dp=4) -# TRAINER_MODEL0_GPUS=4,5,6,7 -> Trainer (FSDP, 4 GPUs) -# -# External services required at launch: -# - FIREWORKS_API_KEY for astraEnv.judge (~/.fireworks_key) -# - CMU_SEARCH_API_KEY for astraEnv.search (~/.cmu_search_key) -# ============================================================================ - -experiment: - experiment_name: astraflow-deepdive - trial_name: qwen3-4b-deepdive-recursive - fileroot: ./data-experiments/${experiment.experiment_name}/${experiment.trial_name} - - model_path: "Qwen/Qwen3-4B-Instruct-2507" - tokenizer_path: "Qwen/Qwen3-4B-Instruct-2507" - seed: 1 - dtype: bfloat16 - weight_transfer_mode: tcp - weight_transfer_strategies: full - -raas: - models: - model0: - backend: sglang - gconfig: - n_samples: 8 - temperature: 1.0 - max_new_tokens: 8192 # platoon default for DeepDive — research needs long replies - min_new_tokens: 0 - -dataflow: - host: "0.0.0.0" - port: 8000 - - dump_dir: "./data-experiments/${experiment.experiment_name}/${experiment.trial_name}/rollout_dumps" - - buffer: - size: 10000 - replay_size: 10000 - replay_ratio: 0 - max_staleness: 8 - # filter_zero_adv: drop prompt groups where all 8 samples got identical - # rewards (= zero group variance = zero gradient signal). Matches - # platoon's filter_zero_variance_groups: True default. Required when - # the root rubric is binary (success bool → 0/1) since many groups - # naturally come out all-0 or all-1 for a base model on a hard task. - filter_function: filter_zero_adv - - rollout_dataset: - dataset_fn: "astraflow.dataflow.dataset.deepdive:get_deepdive_rl_dataset" - split: qa_rl # platoon: train_split - num_tasks: null # platoon: train_num_tasks=null (use all) - - workflow_spec: - workflow_cls: "deepdive_recursive" - reward_fn: "deepdive_success" - # Reward mode — selects which credit-assignment scheme to use: - # team_credit: all agents train on root's LLM-judged reward (cheap). - # per_agent_judge: each agent trains on its own LLM-judged reward - # (more judge calls; closer to "true" per-agent credit). - # Default matches platoon's behavior (delegation_cap=0 → effectively - # team_credit). Switch to per_agent_judge for the LLM-judge-everywhere - # experiment if team_credit doesn't move accuracy. - reward_mode: team_credit - max_depth: 4 # platoon: DepthAwareStepBudgetTracker(max_depth=4) - max_steps_per_episode: 25 # platoon: max_steps=25 - sub_max_steps: 15 - max_concurrent_subagents: 4 # conservative; bump if RaaS queue stays low - delegation_lambda: 0.0 # platoon: _DEEPDIVE_DELEGATION_REWARD_CAP=0.0 - stdout_truncate: 8000 - enable_thinking: false - dump_prob: 0.25 # ~64 dumps/step at bs=256 — denser sampling for debugging - - eval_workflows: - deepdive_eval: - workflow_cls: "deepdive_recursive" - reward_fn: "deepdive_success" - reward_mode: team_credit - max_depth: 4 - max_steps_per_episode: 25 - sub_max_steps: 15 - delegation_lambda: 0.0 - stdout_truncate: 8000 - enable_thinking: false - dump_prob: 0.25 - gconfig_overrides: - n_samples: 1 - temperature: 0.6 - - eval_datasets: - deepdive_val: - dataset_fn: "astraflow.dataflow.dataset.deepdive:get_deepdive_eval_dataset" - split: qa_sft # platoon: eval_split - num_val: 100 # platoon: eval_num_tasks=100 - repeat: 1 - eval_workflow: deepdive_eval - -trainer_base: - total_train_steps: 500 # v4 action format stable; train at scale for 500 iters - train_batch_size: 256 # bumped back from v2's diagnostic bs=64 - n_samples: 8 - engine: - backend: fsdp - data_parallel_size: 4 - - actor: - gradient_checkpointing: true - mb_spec: - max_tokens_per_mb: 40000 # match context_length=40001 (platoon uses 40000) - optimizer: - type: adam - lr: 3e-6 # platoon's lr - weight_decay: 0.0 - beta1: 0.9 - beta2: 0.95 - eps: 1e-8 - lr_scheduler_type: constant - gradient_clipping: 1.0 - # M2PO (we keep our loss; platoon uses CISPO) - m2_threshold: 0.01 - eps_clip: 100.0 - eps_clip_higher: 100.0 - reward_scaling: 1 - reward_bias: 0 - kl_ctl: 0.00 - kl_penalty_coef: 0.001 - ppo_n_minibatches: 4 - reward_norm: { mean_level: group, std_level: group } - adv_norm: { mean_level: batch, std_level: batch } - - ref: - path: "Qwen/Qwen3-4B-Instruct-2507" - mb_spec: - max_tokens_per_mb: 40000 - - recover: - mode: auto - freq_steps: 25 - - evaluator: - eval_at_start: false # skip v0 eval per [[eval-at-start-default-false]] - freq_steps: 20 - - stats_logger: - wandb: - mode: online - id_suffix: "uid" - -trainer_model0: - model_id: model0 - stats_logger: - wandb: - tags: ["deepdive", "recursive-agent", "qwen3-4b", "m2po", "llm-judge"] diff --git a/examples/deepdive/qwen3-4b-recursive/yaml/raas.yaml b/examples/deepdive/qwen3-4b-recursive/yaml/raas.yaml deleted file mode 100644 index 3841921..0000000 --- a/examples/deepdive/qwen3-4b-recursive/yaml/raas.yaml +++ /dev/null @@ -1,30 +0,0 @@ -# ============================================================================ -# RaaS config — Inference serving instance (hardware/resources) -# Experiment: deepdive / qwen3-4b-recursive -# -# Hardware: 4x GPU, TP=1; model0 DP=4 -# Merged with experiment.yaml at launch (--config experiment.yaml --config raas.yaml) -# ============================================================================ - -rollout: - max_concurrent_rollouts: 1024 - max_concurrent_evals: 64 - pause_grace_period: 3 - enable_adaptive_availability: true - target_waiting_queue_per_dp: 4 - adaptive_step_size: 4 - load_cache_ttl_ms: 100 - -engine: - model0: - backend: sglang - data_parallel_size: 4 - -sglang: - # 40K context — matches platoon's DeepDive recipe (context_length: 40001). - # DeepDive rollouts can be long: many search calls + observations + the - # agent's own reasoning. 32K was insufficient in platoon's experience. - context_length: 40001 - mem_fraction_static: 0.8 # platoon's default - max_running_requests: null - skip_tokenizer_init: true diff --git a/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/1_astraflow.sh b/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/1_astraflow.sh deleted file mode 100755 index cf7df94..0000000 --- a/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/1_astraflow.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash -set -euo pipefail -# [1/3] Launch AstraFlow HTTP service -# -# Usage (terminal 1): -# bash examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh - -export CUDA_VISIBLE_DEVICES="" - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -astraflow_load_experiment_env - -export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. -astraflow_setup_env - -echo "=== AstraFlow HTTP Service ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "Port : ${ASTRAFLOW_PORT}" -echo "===============================" - -python3 -u -m astraflow \ - --config "${EXPERIMENT_CONFIG}" \ - --port "${ASTRAFLOW_PORT}" \ - --host "${ASTRAFLOW_HOST}" \ - 2>&1 | tee "${LOG_DIR}/astraflow.log" diff --git a/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/2_raas.sh b/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/2_raas.sh deleted file mode 100755 index 5d88b2b..0000000 --- a/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/2_raas.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash -set -euo pipefail -# [2/3] Launch RaaS inference server (SGLang + TCP receiver) -# -# Usage (terminal 2, after AstraFlow is ready): -# bash examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -astraflow_load_experiment_env - -export CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" -export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" -export RAAS_PORT="${RAAS_PORT:-19190}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" -export ASTRAFLOW_URL="${ASTRAFLOW_URL:-http://127.0.0.1:${ASTRAFLOW_PORT}}" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. -astraflow_setup_env - -echo "=== RaaS Inference Server (SGLang + TCP receiver) ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "RaaS config : ${RAAS_CONFIG}" -echo "GPUs : ${CUDA_VISIBLE_DEVICES}" -echo "Port : ${RAAS_PORT}" -echo "AstraFlow URL : ${ASTRAFLOW_URL}" -echo "=======================================================" - -python3 -u -m astraflow.raas.server \ - --host "${RAAS_HOST}" \ - --port "${RAAS_PORT}" \ - --config "${EXPERIMENT_CONFIG}" \ - --config "${RAAS_CONFIG}" \ - --engine-id "${ENGINE_ID:-default}" \ - --astraflow-url "${ASTRAFLOW_URL}" \ - 2>&1 | tee "${LOG_DIR}/raas.log" diff --git a/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/3_trainer_model0.sh b/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/3_trainer_model0.sh deleted file mode 100755 index cb8e850..0000000 --- a/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/3_trainer_model0.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash -set -euo pipefail -# [3/3] Launch Trainer for model0 (TCP, sender_agent on local_rank 0) -# -# Usage (terminal 3, after AstraFlow and RaaS are ready): -# bash examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -astraflow_load_experiment_env - -export CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS:-4,5,6,7}" -TRAINER0_NPROC="$(echo "${CUDA_VISIBLE_DEVICES}" | awk -F',' '{print NF}')" - -export RAAS_PORT="${RAAS_PORT:-19190}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" -export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" -export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" - -# sender_agent (in trainer) listens on this HTTP port -export WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. -astraflow_setup_env - -echo "=== Trainer model0 (TCP) ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "GPUs : ${CUDA_VISIBLE_DEVICES} (FSDP dp${TRAINER0_NPROC})" -echo "AstraFlow : ${ASTRAFLOW_URL}" -echo "RaaS : ${ASTRAFLOW_RAAS_URL}" -echo "Sender HTTP : ${WEIGHT_TRANSFER_HTTP_PORT}" -echo "WANDB mode : ${WANDB_MODE:-online}" -echo "==========================================" - -torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ - --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ - examples/launch_trainer.py \ - --config "${EXPERIMENT_CONFIG}" \ - --trainer trainer_model0 \ - "$@" 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/run_qwen3-4b-recursive.sh b/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/run_qwen3-4b-recursive.sh deleted file mode 100755 index ced8ff7..0000000 --- a/examples/textcraft/qwen3-4b-recursive-gen4k/scripts/run_qwen3-4b-recursive.sh +++ /dev/null @@ -1,116 +0,0 @@ -#!/bin/bash -set -euo pipefail -# All-in-one launcher for AstraFlow training with the RECURSIVE-AGENT -# workflow on TextCraft (Qwen3-4B-Instruct-2507, M2PO, platoon port). -# -# Workflow: recursive_agent. Agent emits one {JSON} -# per turn (craft / get_info / view_inventory / spawn / finish). Spawn -# fans out up to 4 sub-agents in parallel via asyncio.gather, each -# inheriting the parent's inventory by reference. Tree-structured -# trajectory flattened to one trajectory with N sequences sharing the -# env-based team reward. -# -# TextCraft task data is synthesized locally on first run from the -# bundled Minecraft recipe DB (no HF download required). Files land at -# astraflow/core/workflow/impl/textcraft/textcraft_{train,val}.jsonl. -# -# Launches 3 processes: -# 1. AstraFlow HTTP service (CPU-only) -# 2. RaaS inference server (SGLang, SERVICE_CUDA_VISIBLE_DEVICES) -# 3. Trainer model0 (FSDP, TRAINER_MODEL0_GPUS) -# -# Usage: -# bash examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh - -# ============================================================================= -# Part 1: Load env and settings -# ============================================================================= -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -# Defined in examples/_common/utils.sh. -astraflow_load_experiment_env - -# ============================================================================= -# Part 2: Set up env -# ============================================================================= -# GPU assignments (default: 4 GPUs for inference, 4 for training) -export SERVICE_CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" -export TRAINER_MODEL0_GPUS="${TRAINER_MODEL0_GPUS:-4,5,6,7}" -# Ports / URLs (each component gets its own port) -export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" -export RAAS_PORT="${RAAS_PORT:-19190}" -export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" -export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" -export WEIGHT_TRANSFER_HTTP_PORT_MODEL0="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" - -TRAINER0_NPROC="$(echo "${TRAINER_MODEL0_GPUS}" | awk -F',' '{print NF}')" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. -# Defined in examples/_common/utils.sh. -astraflow_setup_env - -# ============================================================================= -# Part 3: Print info and clean up -# ============================================================================= -echo "=== AstraFlow (Qwen3-4B, TextCraft, M2PO, ctx32k, TCP, RECURSIVE AGENT) ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "RaaS config : ${RAAS_CONFIG}" -echo "RaaS GPUs : ${SERVICE_CUDA_VISIBLE_DEVICES}" -echo "Trainer model0 GPUs : ${TRAINER_MODEL0_GPUS} (FSDP dp${TRAINER0_NPROC})" -echo "RaaS port : ${RAAS_PORT}" -echo "AstraFlow port : ${ASTRAFLOW_PORT}" -echo "Sender HTTP model0 : ${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" -echo "WANDB mode : ${WANDB_MODE:-online}" -echo "==========================================================" - -trap astraflow_cleanup_trap EXIT INT TERM - -# Kill leftover processes and shared memory from prior runs. -# Defined in examples/_common/utils.sh. -astraflow_kill_stale - -# ============================================================================= -# Part 4: Launch training -# ============================================================================= -echo "[1/3] Starting AstraFlow HTTP service..." -CUDA_VISIBLE_DEVICES="" \ - python3 -u -m astraflow \ - --config "${EXPERIMENT_CONFIG}" \ - --port "${ASTRAFLOW_PORT}" \ - --host "${ASTRAFLOW_HOST}" \ - 2>&1 | tee "${LOG_DIR}/astraflow.log" & -sleep 5 - -echo "[2/3] Starting RaaS inference server (SGLang + TCP receiver)..." -CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES}" \ - python3 -u -m astraflow.raas.server \ - --host "${RAAS_HOST}" \ - --port "${RAAS_PORT}" \ - --config "${EXPERIMENT_CONFIG}" \ - --config "${RAAS_CONFIG}" \ - --engine-id "${ENGINE_ID:-default}" \ - --astraflow-url "${ASTRAFLOW_URL}" \ - 2>&1 | tee "${LOG_DIR}/raas.log" & -sleep 15 - -export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" - -echo "[3/3] Starting trainer model0..." -CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS}" \ -WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" \ - torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ - --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ - examples/launch_trainer.py \ - --config "${EXPERIMENT_CONFIG}" \ - --trainer trainer_model0 \ - "$@" \ - 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/textcraft/qwen3-4b-recursive-gen4k/yaml/experiment.yaml b/examples/textcraft/qwen3-4b-recursive-gen4k/yaml/experiment.yaml deleted file mode 100644 index 2288f97..0000000 --- a/examples/textcraft/qwen3-4b-recursive-gen4k/yaml/experiment.yaml +++ /dev/null @@ -1,166 +0,0 @@ -# ============================================================================ -# Experiment config — AstraFlow service + Trainer (RECURSIVE AGENT on TextCraft) -# Experiment: textcraft / qwen3-4b-recursive -# -# Recursive agent reproduction of platoon's design (see -# claude-doc/recursive-agent-textcraft-plan.md): -# - workflow_cls: recursive_agent -# - TextCraft stateful env (in-process inventory dict + recipe DB) -# - Up to 4 sub-agents per spawn, depth <= 3 -# - Team reward (env.evaluate()) broadcast across the trajectory tree -# -# Model + dataset + hyperparams match platoon where compatible: -# - Qwen3-4B-Instruct-2507 (no thinking) -# - TextCraft 1000 train / 100 val tasks (synthesized locally from -# bundled Minecraft recipes; no HF download needed) -# - LR 3e-5, β (0.9, 0.95), batch 32, group_size 8, max_steps 50 -# -# Trainer is M2PO + full-FT + SGLang+AstraFlow (substrate differences -# from platoon: CISPO + LoRA + Tinker). See docs page for details. -# -# GPU layout (default, 8 GPUs): -# SERVICE_CUDA_VISIBLE_DEVICES=0,1,2,3 -> RaaS (model0 dp=4) -# TRAINER_MODEL0_GPUS=4,5,6,7 -> Trainer model0 (FSDP, 4 GPUs) -# ============================================================================ - -experiment: - experiment_name: astraflow-textcraft - trial_name: qwen3-4b-recursive-gen4k - fileroot: ./data-experiments/${experiment.experiment_name}/${experiment.trial_name} - - model_path: "Qwen/Qwen3-4B-Instruct-2507" # = platoon - tokenizer_path: "Qwen/Qwen3-4B-Instruct-2507" # = platoon - seed: 1 - dtype: bfloat16 - weight_transfer_mode: tcp - weight_transfer_strategies: full - -raas: - models: - model0: - backend: sglang - gconfig: - n_samples: 8 # = platoon group_size (train) - temperature: 1.0 - max_new_tokens: 4096 # per-turn budget for the recursive agent (4k variant) - min_new_tokens: 0 - -dataflow: - host: "0.0.0.0" - port: 8000 - - # Rollout dump dir for recursive-agent sanity checking. The dataflow - # loader substitutes ${experiment.*} placeholders and propagates this - # into workflow_spec.dump_dir. - dump_dir: "./data-experiments/${experiment.experiment_name}/${experiment.trial_name}/rollout_dumps" - - buffer: - size: 10000 - replay_size: 10000 - replay_ratio: 0 - max_staleness: 8 # = platoon max_staleness - filter_function: filter_zero_adv - - rollout_dataset: - dataset_fn: "astraflow.dataflow.dataset.textcraft:get_textcraft_rl_dataset" - num_tasks: 1000 # = platoon - num_val: 100 - seed: 42 - - workflow_spec: - workflow_cls: "recursive_agent" - reward_fn: "textcraft_success" # stub; recursive_agent uses env.evaluate() - enable_thinking: false # = platoon - max_depth: 3 # AstraFlow safety cap (platoon: unbounded) - max_breadth: 4 # AstraFlow safety cap (platoon: unbounded) - max_steps_per_episode: 50 # = platoon max_steps - max_concurrent_subagents: 8 # bounds K^N RaaS queue blowup - delegation_reward_cap: 0.0 # = platoon _TEXTCRAFT_DELEGATION_REWARD_CAP - depth_level_weighting: false # disabled: was applying 1/(depth+1) to raw reward, which gives sub-agents backwards credit. Platoon applies a different (mass-preserving inverse-traj-count) formula on advantages, not raw rewards — porting that properly is a separate change. - # Sampling rate for rollout dumps. 1.0 for v1 validation; for - # multi-hundred-step runs we lower to keep disk usage bounded. - dump_prob: 0.02 - - eval_workflows: - textcraft_eval: - workflow_cls: "recursive_agent" - reward_fn: "textcraft_success" - enable_thinking: false - max_depth: 3 - max_breadth: 4 - max_steps_per_episode: 50 - delegation_reward_cap: 0.0 - depth_level_weighting: false # eval doesn't need weighting - dump_prob: 0.05 - gconfig_overrides: - n_samples: 1 # = platoon eval group_size - # Stochastic eval with moderate temperature, like our math - # recipes. Adds some per-task noise (≈2% floor on a 100-task - # set) but gives a softer view of capability than greedy. - temperature: 0.6 - - eval_datasets: - textcraft_val: - dataset_fn: "astraflow.dataflow.dataset.textcraft:get_textcraft_eval_dataset" - num_val: 100 # = platoon - num_train: 1000 - seed: 42 - repeat: 1 - eval_workflow: textcraft_eval - -trainer_base: - total_train_steps: 1000 # extended from 100 to continue v20 - train_batch_size: 512 # = platoon batch_size - n_samples: 8 - engine: - backend: fsdp - data_parallel_size: 4 - - actor: - gradient_checkpointing: true - mb_spec: - max_tokens_per_mb: 32768 # match raas.context_length=32768; recursive agent rollouts can be ~20k+ tokens - optimizer: - type: adam - lr: 3e-6 # = platoon - weight_decay: 0.0 - beta1: 0.9 # = platoon - beta2: 0.95 # = platoon - eps: 1e-8 - lr_scheduler_type: constant - gradient_clipping: 1.0 # standard PPO grad clip. v16 saw grad_norm spikes up to 18.6 destabilizing policy. (DO NOT SET TO 0 — that clips ALL grads to ZERO so the optimizer step never moves the weights.) - # M2PO (ours; platoon uses CISPO) - m2_threshold: 0.01 - eps_clip: 100.0 - eps_clip_higher: 100.0 - reward_scaling: 1 - reward_bias: 0 - kl_ctl: 0.00 - kl_penalty_coef: 0.001 # platoon default - ppo_n_minibatches: 4 # = platoon num_minibatches - reward_norm: { mean_level: group, std_level: group } - adv_norm: { mean_level: batch, std_level: batch } - - ref: - path: "Qwen/Qwen3-4B-Instruct-2507" # explicit so KL(actor||ref) is computed against frozen base - mb_spec: - max_tokens_per_mb: 32768 # match raas.context_length=32768; recursive agent rollouts can be ~20k+ tokens - - recover: - mode: auto - freq_steps: 25 # = platoon checkpoint every: 5 - - evaluator: - eval_at_start: true # baseline at v0 - freq_steps: 20 # = platoon eval every: 20 - - stats_logger: - wandb: - mode: online - id_suffix: "uid" - -trainer_model0: - model_id: model0 - stats_logger: - wandb: - tags: ["textcraft", "recursive-agent", "qwen3-4b", "m2po", "platoon-port"] diff --git a/examples/textcraft/qwen3-4b-recursive-gen4k/yaml/raas.yaml b/examples/textcraft/qwen3-4b-recursive-gen4k/yaml/raas.yaml deleted file mode 100644 index 93693ef..0000000 --- a/examples/textcraft/qwen3-4b-recursive-gen4k/yaml/raas.yaml +++ /dev/null @@ -1,35 +0,0 @@ -# ============================================================================ -# RaaS config — Inference serving instance (hardware/resources) -# Experiment: textcraft / qwen3-4b-recursive -# -# Hardware: 4x GPU, TP=1 -# model0: DP=4, TP=1 -# -# Merged with experiment.yaml at launch (--config experiment.yaml --config raas.yaml) -# experiment.yaml provides: model_path, tokenizer_path, seed, dtype, models/gconfig -# ============================================================================ - -rollout: - # n_samples=8 × train_batch_size=32 × MAX_BREADTH=4 worst-case branching - # could exceed the math recipe's 1024 cap during deep spawns. - max_concurrent_rollouts: 2048 - max_concurrent_evals: 64 - pause_grace_period: 3 - enable_adaptive_availability: true - target_waiting_queue_per_dp: 4 - adaptive_step_size: 4 - load_cache_ttl_ms: 100 - -engine: - model0: - backend: sglang - data_parallel_size: 4 - -sglang: - # 32k context: recursion + per-turn observation history accumulate. - # Each turn appends action + observation to chat history, which can - # reach a few thousand tokens per agent over a 50-step episode. - context_length: 32768 - mem_fraction_static: 0.8 - max_running_requests: null - skip_tokenizer_init: true diff --git a/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/1_astraflow.sh b/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/1_astraflow.sh deleted file mode 100755 index cf7df94..0000000 --- a/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/1_astraflow.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash -set -euo pipefail -# [1/3] Launch AstraFlow HTTP service -# -# Usage (terminal 1): -# bash examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh - -export CUDA_VISIBLE_DEVICES="" - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -astraflow_load_experiment_env - -export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. -astraflow_setup_env - -echo "=== AstraFlow HTTP Service ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "Port : ${ASTRAFLOW_PORT}" -echo "===============================" - -python3 -u -m astraflow \ - --config "${EXPERIMENT_CONFIG}" \ - --port "${ASTRAFLOW_PORT}" \ - --host "${ASTRAFLOW_HOST}" \ - 2>&1 | tee "${LOG_DIR}/astraflow.log" diff --git a/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/2_raas.sh b/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/2_raas.sh deleted file mode 100755 index 5d88b2b..0000000 --- a/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/2_raas.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash -set -euo pipefail -# [2/3] Launch RaaS inference server (SGLang + TCP receiver) -# -# Usage (terminal 2, after AstraFlow is ready): -# bash examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -astraflow_load_experiment_env - -export CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" -export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" -export RAAS_PORT="${RAAS_PORT:-19190}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" -export ASTRAFLOW_URL="${ASTRAFLOW_URL:-http://127.0.0.1:${ASTRAFLOW_PORT}}" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. -astraflow_setup_env - -echo "=== RaaS Inference Server (SGLang + TCP receiver) ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "RaaS config : ${RAAS_CONFIG}" -echo "GPUs : ${CUDA_VISIBLE_DEVICES}" -echo "Port : ${RAAS_PORT}" -echo "AstraFlow URL : ${ASTRAFLOW_URL}" -echo "=======================================================" - -python3 -u -m astraflow.raas.server \ - --host "${RAAS_HOST}" \ - --port "${RAAS_PORT}" \ - --config "${EXPERIMENT_CONFIG}" \ - --config "${RAAS_CONFIG}" \ - --engine-id "${ENGINE_ID:-default}" \ - --astraflow-url "${ASTRAFLOW_URL}" \ - 2>&1 | tee "${LOG_DIR}/raas.log" diff --git a/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/3_trainer_model0.sh b/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/3_trainer_model0.sh deleted file mode 100755 index cb8e850..0000000 --- a/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/3_trainer_model0.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash -set -euo pipefail -# [3/3] Launch Trainer for model0 (TCP, sender_agent on local_rank 0) -# -# Usage (terminal 3, after AstraFlow and RaaS are ready): -# bash examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -astraflow_load_experiment_env - -export CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS:-4,5,6,7}" -TRAINER0_NPROC="$(echo "${CUDA_VISIBLE_DEVICES}" | awk -F',' '{print NF}')" - -export RAAS_PORT="${RAAS_PORT:-19190}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" -export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" -export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" - -# sender_agent (in trainer) listens on this HTTP port -export WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. Defined in examples/_common/utils.sh. -astraflow_setup_env - -echo "=== Trainer model0 (TCP) ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "GPUs : ${CUDA_VISIBLE_DEVICES} (FSDP dp${TRAINER0_NPROC})" -echo "AstraFlow : ${ASTRAFLOW_URL}" -echo "RaaS : ${ASTRAFLOW_RAAS_URL}" -echo "Sender HTTP : ${WEIGHT_TRANSFER_HTTP_PORT}" -echo "WANDB mode : ${WANDB_MODE:-online}" -echo "==========================================" - -torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ - --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ - examples/launch_trainer.py \ - --config "${EXPERIMENT_CONFIG}" \ - --trainer trainer_model0 \ - "$@" 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/run_qwen3-4b-recursive.sh b/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/run_qwen3-4b-recursive.sh deleted file mode 100755 index ced8ff7..0000000 --- a/examples/textcraft/qwen3-4b-recursive-lr5e6/scripts/run_qwen3-4b-recursive.sh +++ /dev/null @@ -1,116 +0,0 @@ -#!/bin/bash -set -euo pipefail -# All-in-one launcher for AstraFlow training with the RECURSIVE-AGENT -# workflow on TextCraft (Qwen3-4B-Instruct-2507, M2PO, platoon port). -# -# Workflow: recursive_agent. Agent emits one {JSON} -# per turn (craft / get_info / view_inventory / spawn / finish). Spawn -# fans out up to 4 sub-agents in parallel via asyncio.gather, each -# inheriting the parent's inventory by reference. Tree-structured -# trajectory flattened to one trajectory with N sequences sharing the -# env-based team reward. -# -# TextCraft task data is synthesized locally on first run from the -# bundled Minecraft recipe DB (no HF download required). Files land at -# astraflow/core/workflow/impl/textcraft/textcraft_{train,val}.jsonl. -# -# Launches 3 processes: -# 1. AstraFlow HTTP service (CPU-only) -# 2. RaaS inference server (SGLang, SERVICE_CUDA_VISIBLE_DEVICES) -# 3. Trainer model0 (FSDP, TRAINER_MODEL0_GPUS) -# -# Usage: -# bash examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh - -# ============================================================================= -# Part 1: Load env and settings -# ============================================================================= -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -cd "${REPO_ROOT}" -export PYTHONPATH="${REPO_ROOT}${PYTHONPATH:+:${PYTHONPATH}}" - -YAML_DIR="${SCRIPT_DIR}/yaml" -export EXPERIMENT_CONFIG="${EXPERIMENT_CONFIG:-${YAML_DIR}/experiment.yaml}" -export RAAS_CONFIG="${RAAS_CONFIG:-${YAML_DIR}/raas.yaml}" -source "${REPO_ROOT}/examples/_common/utils.sh" -# Export EXP_NAME and TRIAL_NAME from the experiment YAML. -# Defined in examples/_common/utils.sh. -astraflow_load_experiment_env - -# ============================================================================= -# Part 2: Set up env -# ============================================================================= -# GPU assignments (default: 4 GPUs for inference, 4 for training) -export SERVICE_CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES:-0,1,2,3}" -export TRAINER_MODEL0_GPUS="${TRAINER_MODEL0_GPUS:-4,5,6,7}" -# Ports / URLs (each component gets its own port) -export RAAS_HOST="${RAAS_HOST:-0.0.0.0}" -export RAAS_PORT="${RAAS_PORT:-19190}" -export ASTRAFLOW_HOST="${ASTRAFLOW_HOST:-0.0.0.0}" -export ASTRAFLOW_PORT="${ASTRAFLOW_PORT:-8000}" -export ASTRAFLOW_URL="http://127.0.0.1:${ASTRAFLOW_PORT}" -export WEIGHT_TRANSFER_HTTP_PORT_MODEL0="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0:-19861}" - -TRAINER0_NPROC="$(echo "${TRAINER_MODEL0_GPUS}" | awk -F',' '{print NF}')" - -# NCCL / PYTORCH / WANDB tweaks + LOG_DIR. -# Defined in examples/_common/utils.sh. -astraflow_setup_env - -# ============================================================================= -# Part 3: Print info and clean up -# ============================================================================= -echo "=== AstraFlow (Qwen3-4B, TextCraft, M2PO, ctx32k, TCP, RECURSIVE AGENT) ===" -echo "Experiment config : ${EXPERIMENT_CONFIG}" -echo "RaaS config : ${RAAS_CONFIG}" -echo "RaaS GPUs : ${SERVICE_CUDA_VISIBLE_DEVICES}" -echo "Trainer model0 GPUs : ${TRAINER_MODEL0_GPUS} (FSDP dp${TRAINER0_NPROC})" -echo "RaaS port : ${RAAS_PORT}" -echo "AstraFlow port : ${ASTRAFLOW_PORT}" -echo "Sender HTTP model0 : ${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" -echo "WANDB mode : ${WANDB_MODE:-online}" -echo "==========================================================" - -trap astraflow_cleanup_trap EXIT INT TERM - -# Kill leftover processes and shared memory from prior runs. -# Defined in examples/_common/utils.sh. -astraflow_kill_stale - -# ============================================================================= -# Part 4: Launch training -# ============================================================================= -echo "[1/3] Starting AstraFlow HTTP service..." -CUDA_VISIBLE_DEVICES="" \ - python3 -u -m astraflow \ - --config "${EXPERIMENT_CONFIG}" \ - --port "${ASTRAFLOW_PORT}" \ - --host "${ASTRAFLOW_HOST}" \ - 2>&1 | tee "${LOG_DIR}/astraflow.log" & -sleep 5 - -echo "[2/3] Starting RaaS inference server (SGLang + TCP receiver)..." -CUDA_VISIBLE_DEVICES="${SERVICE_CUDA_VISIBLE_DEVICES}" \ - python3 -u -m astraflow.raas.server \ - --host "${RAAS_HOST}" \ - --port "${RAAS_PORT}" \ - --config "${EXPERIMENT_CONFIG}" \ - --config "${RAAS_CONFIG}" \ - --engine-id "${ENGINE_ID:-default}" \ - --astraflow-url "${ASTRAFLOW_URL}" \ - 2>&1 | tee "${LOG_DIR}/raas.log" & -sleep 15 - -export ASTRAFLOW_RAAS_URL="http://127.0.0.1:${RAAS_PORT}" - -echo "[3/3] Starting trainer model0..." -CUDA_VISIBLE_DEVICES="${TRAINER_MODEL0_GPUS}" \ -WEIGHT_TRANSFER_HTTP_PORT="${WEIGHT_TRANSFER_HTTP_PORT_MODEL0}" \ - torchrun --nnodes 1 --nproc-per-node "${TRAINER0_NPROC}" \ - --master-addr "${MASTER_ADDR:-127.0.0.1}" --master-port "${MASTER_PORT_MODEL0:-29541}" \ - examples/launch_trainer.py \ - --config "${EXPERIMENT_CONFIG}" \ - --trainer trainer_model0 \ - "$@" \ - 2>&1 | tee "${LOG_DIR}/trainer_model0.log" diff --git a/examples/textcraft/qwen3-4b-recursive-lr5e6/yaml/experiment.yaml b/examples/textcraft/qwen3-4b-recursive-lr5e6/yaml/experiment.yaml deleted file mode 100644 index d11bbf0..0000000 --- a/examples/textcraft/qwen3-4b-recursive-lr5e6/yaml/experiment.yaml +++ /dev/null @@ -1,166 +0,0 @@ -# ============================================================================ -# Experiment config — AstraFlow service + Trainer (RECURSIVE AGENT on TextCraft) -# Experiment: textcraft / qwen3-4b-recursive -# -# Recursive agent reproduction of platoon's design (see -# claude-doc/recursive-agent-textcraft-plan.md): -# - workflow_cls: recursive_agent -# - TextCraft stateful env (in-process inventory dict + recipe DB) -# - Up to 4 sub-agents per spawn, depth <= 3 -# - Team reward (env.evaluate()) broadcast across the trajectory tree -# -# Model + dataset + hyperparams match platoon where compatible: -# - Qwen3-4B-Instruct-2507 (no thinking) -# - TextCraft 1000 train / 100 val tasks (synthesized locally from -# bundled Minecraft recipes; no HF download needed) -# - LR 3e-5, β (0.9, 0.95), batch 32, group_size 8, max_steps 50 -# -# Trainer is M2PO + full-FT + SGLang+AstraFlow (substrate differences -# from platoon: CISPO + LoRA + Tinker). See docs page for details. -# -# GPU layout (default, 8 GPUs): -# SERVICE_CUDA_VISIBLE_DEVICES=0,1,2,3 -> RaaS (model0 dp=4) -# TRAINER_MODEL0_GPUS=4,5,6,7 -> Trainer model0 (FSDP, 4 GPUs) -# ============================================================================ - -experiment: - experiment_name: astraflow-textcraft - trial_name: qwen3-4b-recursive-lr5e6 - fileroot: ./data-experiments/${experiment.experiment_name}/${experiment.trial_name} - - model_path: "Qwen/Qwen3-4B-Instruct-2507" # = platoon - tokenizer_path: "Qwen/Qwen3-4B-Instruct-2507" # = platoon - seed: 1 - dtype: bfloat16 - weight_transfer_mode: tcp - weight_transfer_strategies: full - -raas: - models: - model0: - backend: sglang - gconfig: - n_samples: 8 # = platoon group_size (train) - temperature: 1.0 - max_new_tokens: 1024 # per-turn budget for the recursive agent - min_new_tokens: 0 - -dataflow: - host: "0.0.0.0" - port: 8000 - - # Rollout dump dir for recursive-agent sanity checking. The dataflow - # loader substitutes ${experiment.*} placeholders and propagates this - # into workflow_spec.dump_dir. - dump_dir: "./data-experiments/${experiment.experiment_name}/${experiment.trial_name}/rollout_dumps" - - buffer: - size: 10000 - replay_size: 10000 - replay_ratio: 0 - max_staleness: 8 # = platoon max_staleness - filter_function: filter_zero_adv - - rollout_dataset: - dataset_fn: "astraflow.dataflow.dataset.textcraft:get_textcraft_rl_dataset" - num_tasks: 1000 # = platoon - num_val: 100 - seed: 42 - - workflow_spec: - workflow_cls: "recursive_agent" - reward_fn: "textcraft_success" # stub; recursive_agent uses env.evaluate() - enable_thinking: false # = platoon - max_depth: 3 # AstraFlow safety cap (platoon: unbounded) - max_breadth: 4 # AstraFlow safety cap (platoon: unbounded) - max_steps_per_episode: 50 # = platoon max_steps - max_concurrent_subagents: 8 # bounds K^N RaaS queue blowup - delegation_reward_cap: 0.0 # = platoon _TEXTCRAFT_DELEGATION_REWARD_CAP - depth_level_weighting: false # disabled: was applying 1/(depth+1) to raw reward, which gives sub-agents backwards credit. Platoon applies a different (mass-preserving inverse-traj-count) formula on advantages, not raw rewards — porting that properly is a separate change. - # Sampling rate for rollout dumps. 1.0 for v1 validation; for - # multi-hundred-step runs we lower to keep disk usage bounded. - dump_prob: 0.02 - - eval_workflows: - textcraft_eval: - workflow_cls: "recursive_agent" - reward_fn: "textcraft_success" - enable_thinking: false - max_depth: 3 - max_breadth: 4 - max_steps_per_episode: 50 - delegation_reward_cap: 0.0 - depth_level_weighting: false # eval doesn't need weighting - dump_prob: 0.05 - gconfig_overrides: - n_samples: 1 # = platoon eval group_size - # Stochastic eval with moderate temperature, like our math - # recipes. Adds some per-task noise (≈2% floor on a 100-task - # set) but gives a softer view of capability than greedy. - temperature: 0.6 - - eval_datasets: - textcraft_val: - dataset_fn: "astraflow.dataflow.dataset.textcraft:get_textcraft_eval_dataset" - num_val: 100 # = platoon - num_train: 1000 - seed: 42 - repeat: 1 - eval_workflow: textcraft_eval - -trainer_base: - total_train_steps: 1000 # extended from 100 to continue v20 - train_batch_size: 512 # = platoon batch_size - n_samples: 8 - engine: - backend: fsdp - data_parallel_size: 4 - - actor: - gradient_checkpointing: true - mb_spec: - max_tokens_per_mb: 32768 # match raas.context_length=32768; recursive agent rollouts can be ~20k+ tokens - optimizer: - type: adam - lr: 5e-6 # variant: bumped from 3e-6 for parallel comparison on flame-28 - weight_decay: 0.0 - beta1: 0.9 # = platoon - beta2: 0.95 # = platoon - eps: 1e-8 - lr_scheduler_type: constant - gradient_clipping: 1.0 # standard PPO grad clip. v16 saw grad_norm spikes up to 18.6 destabilizing policy. (DO NOT SET TO 0 — that clips ALL grads to ZERO so the optimizer step never moves the weights.) - # M2PO (ours; platoon uses CISPO) - m2_threshold: 0.01 - eps_clip: 100.0 - eps_clip_higher: 100.0 - reward_scaling: 1 - reward_bias: 0 - kl_ctl: 0.00 - kl_penalty_coef: 0.001 # platoon default - ppo_n_minibatches: 4 # = platoon num_minibatches - reward_norm: { mean_level: group, std_level: group } - adv_norm: { mean_level: batch, std_level: batch } - - ref: - path: "Qwen/Qwen3-4B-Instruct-2507" # explicit so KL(actor||ref) is computed against frozen base - mb_spec: - max_tokens_per_mb: 32768 # match raas.context_length=32768; recursive agent rollouts can be ~20k+ tokens - - recover: - mode: auto - freq_steps: 25 # = platoon checkpoint every: 5 - - evaluator: - eval_at_start: true # baseline at v0 - freq_steps: 20 # = platoon eval every: 20 - - stats_logger: - wandb: - mode: online - id_suffix: "uid" - -trainer_model0: - model_id: model0 - stats_logger: - wandb: - tags: ["textcraft", "recursive-agent", "qwen3-4b", "m2po", "platoon-port"] diff --git a/examples/textcraft/qwen3-4b-recursive-lr5e6/yaml/raas.yaml b/examples/textcraft/qwen3-4b-recursive-lr5e6/yaml/raas.yaml deleted file mode 100644 index 93693ef..0000000 --- a/examples/textcraft/qwen3-4b-recursive-lr5e6/yaml/raas.yaml +++ /dev/null @@ -1,35 +0,0 @@ -# ============================================================================ -# RaaS config — Inference serving instance (hardware/resources) -# Experiment: textcraft / qwen3-4b-recursive -# -# Hardware: 4x GPU, TP=1 -# model0: DP=4, TP=1 -# -# Merged with experiment.yaml at launch (--config experiment.yaml --config raas.yaml) -# experiment.yaml provides: model_path, tokenizer_path, seed, dtype, models/gconfig -# ============================================================================ - -rollout: - # n_samples=8 × train_batch_size=32 × MAX_BREADTH=4 worst-case branching - # could exceed the math recipe's 1024 cap during deep spawns. - max_concurrent_rollouts: 2048 - max_concurrent_evals: 64 - pause_grace_period: 3 - enable_adaptive_availability: true - target_waiting_queue_per_dp: 4 - adaptive_step_size: 4 - load_cache_ttl_ms: 100 - -engine: - model0: - backend: sglang - data_parallel_size: 4 - -sglang: - # 32k context: recursion + per-turn observation history accumulate. - # Each turn appends action + observation to chat history, which can - # reach a few thousand tokens per agent over a 50-step episode. - context_length: 32768 - mem_fraction_static: 0.8 - max_running_requests: null - skip_tokenizer_init: true From 0a4ed98bf9160586379c11eccd8b10c03f391930 Mon Sep 17 00:00:00 2001 From: Haizhong Date: Tue, 2 Jun 2026 22:48:05 -0400 Subject: [PATCH 26/35] chore: bump version to 0.1.1 Update the package version (astraflow/version.py and train_worker/version.py) and all version references in the docs and READMEs from 0.1.0 to 0.1.1: docs Sphinx version, sidebar badge, docs index title, and the astraflowai/astraflow image tag in docker/README and the installation guide. Add a v0.1.1 News entry to README (keeping the v0.1.0 record). Matches the already-published astraflowai/astraflow:v0.1.1 image (CUDA 13 / SGLang 0.5.12); no Docker rebuild required. --- README.md | 1 + astraflow/train_worker/version.py | 2 +- astraflow/version.py | 2 +- docker/README.md | 6 +++--- docs/_static/css/custom.css | 2 +- docs/conf.py | 2 +- docs/en/get-started/installation.md | 4 ++-- docs/en/index.rst | 2 +- 8 files changed, 11 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index ba4511a..58b7c6f 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,7 @@ AstraFlow **natively** supports the following for LLM RL training **without any ## News +- **[2026/05]** AstraFlow **v0.1.1** released — CUDA 13 image, SGLang 0.5.12, Megatron weight-sync training backend, and transformers 5 support. See the [project website](https://Infini-AI-Lab.github.io/astraflow/). - **[2026/05]** AstraFlow **v0.1.0** released — first public release of the full system. See the [project website](https://Infini-AI-Lab.github.io/astraflow/). - **[2026/05]** AstraFlow paper is on [arXiv](https://arxiv.org/abs/2605.15565). diff --git a/astraflow/train_worker/version.py b/astraflow/train_worker/version.py index 0a290f3..26fa6f5 100644 --- a/astraflow/train_worker/version.py +++ b/astraflow/train_worker/version.py @@ -5,7 +5,7 @@ class VersionInfo: def __init__(self): - self.__version__ = "0.1.0" + self.__version__ = "0.1.1" self.__branch__ = "" self.__commit__ = "" self.__is_dirty__ = False diff --git a/astraflow/version.py b/astraflow/version.py index 0a290f3..26fa6f5 100644 --- a/astraflow/version.py +++ b/astraflow/version.py @@ -5,7 +5,7 @@ class VersionInfo: def __init__(self): - self.__version__ = "0.1.0" + self.__version__ = "0.1.1" self.__branch__ = "" self.__commit__ = "" self.__is_dirty__ = False diff --git a/docker/README.md b/docker/README.md index d23a521..c9dde6e 100644 --- a/docker/README.md +++ b/docker/README.md @@ -26,11 +26,11 @@ backend and inference do not require it. A pre-built image is published on Docker Hub — use it to skip the build entirely: ```bash -docker pull astraflowai/astraflow:v0.1.0 +docker pull astraflowai/astraflow:v0.1.1 ``` This image is built from `Dockerfile.sglang` (astraflow + SGLang + flash-attn). Pin a -version tag (`v0.1.0`) for reproducibility; `:latest` tracks the most recent release. +version tag (`v0.1.1`) for reproducibility; `:latest` tracks the most recent release. ## Build from source @@ -49,7 +49,7 @@ docker build -f docker/Dockerfile.sglang.megatron -t astraflow:sglang-megatron . ```bash # Run the pre-built image with host network and all GPUs -docker run --gpus all --net=host --shm-size=512g --ulimit nofile=65536:65536 -it astraflowai/astraflow:v0.1.0 +docker run --gpus all --net=host --shm-size=512g --ulimit nofile=65536:65536 -it astraflowai/astraflow:v0.1.1 # ...or run a locally built image docker run --gpus all --net=host --shm-size=512g --ulimit nofile=65536:65536 -it astraflow:sglang diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index 4c91a21..2b5b921 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -18,7 +18,7 @@ html.light { /* Version number, inline to the right of the AstraFlow brand text */ .sy-head-brand strong::after { - content: "v0.1.0"; + content: "v0.1.1"; font-size: 0.7rem; font-weight: 400; letter-spacing: 0.04em; diff --git a/docs/conf.py b/docs/conf.py index efaea3e..98dd4a5 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -7,7 +7,7 @@ project = "AstraFlow" author = "AstraFlow Team" copyright = f"2025-{datetime.now().year}, {author}" -version = "0.1.0" +version = "0.1.1" release = version extensions = [ diff --git a/docs/en/get-started/installation.md b/docs/en/get-started/installation.md index aac3a24..42c26be 100644 --- a/docs/en/get-started/installation.md +++ b/docs/en/get-started/installation.md @@ -155,7 +155,7 @@ A pre-built image is published on Docker Hub — it skips the from-source steps entirely. Requires the NVIDIA Container Toolkit so `--gpus all` works. ```bash -docker run --gpus all --net=host --shm-size=512g --ulimit nofile=65536:65536 -it astraflowai/astraflow:v0.1.0 +docker run --gpus all --net=host --shm-size=512g --ulimit nofile=65536:65536 -it astraflowai/astraflow:v0.1.1 ``` > **Note on `--shm-size`:** this sets the size of the container's `/dev/shm`. A @@ -173,6 +173,6 @@ docker run --gpus all --net=host --shm-size=512g --ulimit nofile=65536:65536 -it > `nofile` soft limit (1024) is far too low and the reward pool fails with > `[Errno 24] Too many open files`. Raise it with `--ulimit nofile=65536:65536`. -The image bundles astraflow, SGLang, and flash-attn. Pin a version tag (`v0.1.0`) for +The image bundles astraflow, SGLang, and flash-attn. Pin a version tag (`v0.1.1`) for reproducibility; `:latest` tracks the most recent release. See `docker/README.md` for build details and the NVIDIA Container Toolkit install guide. diff --git a/docs/en/index.rst b/docs/en/index.rst index 62533c7..6888335 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -1,4 +1,4 @@ -AstraFlow v0.1.0 Documentation +AstraFlow v0.1.1 Documentation ============================== AstraFlow is an asynchronous RL training system for large reasoning and agentic models From 5ed249996078820b931b12d4a42af0451d0f06bf Mon Sep 17 00:00:00 2001 From: Haizhong Date: Wed, 3 Jun 2026 10:37:43 -0400 Subject: [PATCH 27/35] refactor: rename textcraft example dir to textcraft-recursive-agent Move examples/textcraft -> examples/textcraft-recursive-agent (the recipe is now examples/textcraft-recursive-agent/qwen3-4b-recursive) and update the path references in the recipe scripts' usage comments and the textcraft-recursive doc. Directory depth is unchanged, so the scripts' repo-root resolution is unaffected. The workflow code (astraflow/core/workflow/impl/textcraft) and the experiment_name/ trial_name identifiers are intentionally left as-is. --- docs/en/recipes/textcraft-recursive.md | 6 +++--- .../qwen3-4b-recursive/scripts/1_astraflow.sh | 2 +- .../qwen3-4b-recursive/scripts/2_raas.sh | 2 +- .../qwen3-4b-recursive/scripts/3_trainer_model0.sh | 2 +- .../qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh | 2 +- .../qwen3-4b-recursive/yaml/experiment.yaml | 0 .../qwen3-4b-recursive/yaml/raas.yaml | 0 7 files changed, 7 insertions(+), 7 deletions(-) rename examples/{textcraft => textcraft-recursive-agent}/qwen3-4b-recursive/scripts/1_astraflow.sh (92%) rename examples/{textcraft => textcraft-recursive-agent}/qwen3-4b-recursive/scripts/2_raas.sh (95%) rename examples/{textcraft => textcraft-recursive-agent}/qwen3-4b-recursive/scripts/3_trainer_model0.sh (95%) rename examples/{textcraft => textcraft-recursive-agent}/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh (98%) rename examples/{textcraft => textcraft-recursive-agent}/qwen3-4b-recursive/yaml/experiment.yaml (100%) rename examples/{textcraft => textcraft-recursive-agent}/qwen3-4b-recursive/yaml/raas.yaml (100%) diff --git a/docs/en/recipes/textcraft-recursive.md b/docs/en/recipes/textcraft-recursive.md index e4fc0aa..cb7c018 100644 --- a/docs/en/recipes/textcraft-recursive.md +++ b/docs/en/recipes/textcraft-recursive.md @@ -7,7 +7,7 @@ inventory) and can recursively spawn up to 4 sub-agents in parallel per turn — each shares the parent's inventory by reference, so their work mutates the same state. -**Recipe**: [`examples/textcraft/qwen3-4b-recursive/`](https://github.com/Infini-AI-Lab/astraflow/tree/main/examples/textcraft/qwen3-4b-recursive) +**Recipe**: [`examples/textcraft-recursive-agent/qwen3-4b-recursive/`](https://github.com/Infini-AI-Lab/astraflow/tree/main/examples/textcraft-recursive-agent/qwen3-4b-recursive) **Workflow class**: [`astraflow/core/workflow/impl/textcraft/workflow.py`](https://github.com/Infini-AI-Lab/astraflow/tree/main/astraflow/core/workflow/impl/textcraft/workflow.py) — registered as `recursive_agent`. @@ -102,13 +102,13 @@ huggingface-cli download Qwen/Qwen3-4B-Instruct-2507 Run: ```bash -bash examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh +bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh ``` Smoke run (3 train steps, eval-at-start): ```bash -bash examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh \ +bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh \ total_train_steps=3 evaluator.eval_at_start=true evaluator.freq_steps=100 ``` diff --git a/examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh b/examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/1_astraflow.sh similarity index 92% rename from examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh rename to examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/1_astraflow.sh index cf7df94..eba0511 100755 --- a/examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh +++ b/examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/1_astraflow.sh @@ -3,7 +3,7 @@ set -euo pipefail # [1/3] Launch AstraFlow HTTP service # # Usage (terminal 1): -# bash examples/textcraft/qwen3-4b-recursive/scripts/1_astraflow.sh +# bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/1_astraflow.sh export CUDA_VISIBLE_DEVICES="" diff --git a/examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh b/examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/2_raas.sh similarity index 95% rename from examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh rename to examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/2_raas.sh index 5d88b2b..5bb8c9d 100755 --- a/examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh +++ b/examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/2_raas.sh @@ -3,7 +3,7 @@ set -euo pipefail # [2/3] Launch RaaS inference server (SGLang + TCP receiver) # # Usage (terminal 2, after AstraFlow is ready): -# bash examples/textcraft/qwen3-4b-recursive/scripts/2_raas.sh +# bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/2_raas.sh SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" diff --git a/examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh b/examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/3_trainer_model0.sh similarity index 95% rename from examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh rename to examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/3_trainer_model0.sh index cb8e850..4342f89 100755 --- a/examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh +++ b/examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/3_trainer_model0.sh @@ -3,7 +3,7 @@ set -euo pipefail # [3/3] Launch Trainer for model0 (TCP, sender_agent on local_rank 0) # # Usage (terminal 3, after AstraFlow and RaaS are ready): -# bash examples/textcraft/qwen3-4b-recursive/scripts/3_trainer_model0.sh +# bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/3_trainer_model0.sh SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" diff --git a/examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh b/examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh similarity index 98% rename from examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh rename to examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh index ced8ff7..a05379f 100755 --- a/examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh +++ b/examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh @@ -20,7 +20,7 @@ set -euo pipefail # 3. Trainer model0 (FSDP, TRAINER_MODEL0_GPUS) # # Usage: -# bash examples/textcraft/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh +# bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh # ============================================================================= # Part 1: Load env and settings diff --git a/examples/textcraft/qwen3-4b-recursive/yaml/experiment.yaml b/examples/textcraft-recursive-agent/qwen3-4b-recursive/yaml/experiment.yaml similarity index 100% rename from examples/textcraft/qwen3-4b-recursive/yaml/experiment.yaml rename to examples/textcraft-recursive-agent/qwen3-4b-recursive/yaml/experiment.yaml diff --git a/examples/textcraft/qwen3-4b-recursive/yaml/raas.yaml b/examples/textcraft-recursive-agent/qwen3-4b-recursive/yaml/raas.yaml similarity index 100% rename from examples/textcraft/qwen3-4b-recursive/yaml/raas.yaml rename to examples/textcraft-recursive-agent/qwen3-4b-recursive/yaml/raas.yaml From aab15a2c5ae0aa2278ec9bb5d331cc0c1d75e155 Mon Sep 17 00:00:00 2001 From: Haizhong Date: Wed, 3 Jun 2026 10:43:21 -0400 Subject: [PATCH 28/35] docs: add 8-agent textcraft recursive episode for animations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add docs/web/examples/textcraft-recursive-8agent-episode.txt — a real rollout dump from the textcraft recursive-agent recipe where the root agent spawns 7 sub-agents (all succeed, reward 1.0) to craft the dye and material intermediates in parallel. Placed under docs/web so the animation pages can fetch it; the ROOT/SUB depth/parent markers and spawn actions provide the agent tree and timing for visualization. --- .../textcraft-recursive-8agent-episode.txt | 900 ++++++++++++++++++ 1 file changed, 900 insertions(+) create mode 100644 docs/web/examples/textcraft-recursive-8agent-episode.txt diff --git a/docs/web/examples/textcraft-recursive-8agent-episode.txt b/docs/web/examples/textcraft-recursive-8agent-episode.txt new file mode 100644 index 0000000..d7c96cb --- /dev/null +++ b/docs/web/examples/textcraft-recursive-8agent-episode.txt @@ -0,0 +1,900 @@ +=== Episode reward=1.0 env_score=1.0 n_agents=8 info={'subagent_launched': 7, 'subagent_succeeded': 7.0} === + +--- ROOT traj_id=176d5d9283174b7b8c06b9f1374a9455 task='Craft the following items: 1x gray_terracotta, 1x yellow_stained_glass, 1x leather_leggings' target_items={'gray_terracotta': 1, 'yellow_stained_glass': 1, 'leather_leggings': 1} per_agent_reward=1.0 steps=12 --- +FINISH: crafted 1x gray_terracotta, 1x yellow_stained_glass, and 1x leather_leggings + [0] system: + You are a TextCraft agent. Your goal is to craft target items using a shared inventory and a recipe database. + +You act by emitting EXACTLY ONE action block per turn, in this format: + {JSON args} + +After each action you will receive an observation as the next user message. Use it to decide your next action. + +Available actions: + +- get_info — Query recipe database for one or more items. + {"items": ["stick", "oak_planks"]} + +- view_inventory — Read current inventory. + {} + +- craft — Consume ingredients, produce target. target must be [item_name, total_count]; total_count must be divisible by the recipe's result_count. Ingredients must match the recipe exactly (no extras). + {"ingredients": {"oak_log": 1}, "target": ["oak_planks", 4]} + +- spawn — Dispatch 1-4 sub-agents in PARALLEL. Each shares your inventory by reference (their crafts affect you). Use this to delegate independent sub-goals (e.g. crafting different intermediates). + {"subtasks": [ + {"targets": {"oak_planks": 16}, "max_steps": 8}, + {"targets": {"stick": 8}, "max_steps": 5} + ]} + +- finish — End your episode with a brief summary. After finish, no more actions can be taken. + {"message": "crafted 4 wooden_pickaxe"} + +You share a step budget with any sub-agents you spawn. Be efficient. + + [1] user: + Task: Craft the following items: 1x gray_terracotta, 1x yellow_stained_glass, 1x leather_leggings +Targets: 1x gray_terracotta, 1x yellow_stained_glass, 1x leather_leggings +Initial inventory: {"terracotta":12,"wither_rose":1,"lily_of_the_valley":2,"glass":10,"dandelion":1,"rabbit_hide":31,"rose_bush":2,"poppy":4} +Step budget: 50 + [2] assistant: + To craft the required items — 1x gray_terracotta, 1x yellow_stained_glass, and 1x leather_leggings — I need to first understand the recipes for these items in the database. Since I don't have direct access to the recipe database initially, my first step is to query it. + +I will use the `get_info` action to retrieve the recipes for the target items. + +{"items": ["gray_terracotta", "yellow_stained_glass", "leather_leggings"]}<|im_end|> + [3] user: + [{"item":"gray_terracotta","can_craft":true,"is_base":false,"in_inventory":0,"crafting_depth":5,"recipes":[{"ingredients":{"terracotta":8,"gray_dye":1},"result_count":8}]},{"item":"yellow_stained_glass","can_craft":true,"is_base":false,"in_inventory":0,"crafting_depth":2,"recipes":[{"ingredients":{"glass":8,"yellow_dye":1},"result_count":8}]},{"item":"leather_leggings","can_craft":true,"is_base":false,"in_inventory":0,"crafting_depth":2,"recipes":[{"ingredients":{"leather":7},"result_count":1}]}] + [4] assistant: + Now that I know the recipes, I can proceed with crafting. + +### Required Recipes: +1. **Gray Terracotta**: + - Requires 8 terracotta + 1 gray_dye → produces 8 gray_terracotta + - We have 12 terracotta in inventory, but no gray_dye yet. + +2. **Yellow Stained Glass**: + - Requires 8 glass + 1 yellow_dye → produces 8 yellow_stained_glass + - We have 10 glass in inventory, but no yellow_dye yet. + +3. **Leather Leggings**: + - Requires 7 leather → produces 1 leather_leggings + - We have rabbit_hide (31), which can be used to craft leather. + - But we need to know how to craft leather from rabbit hide first. + +Wait — the recipe for leather_leggings requires **leather**, not rabbit hide. So, we need to determine how to craft **leather** from **rabbit hide**. + +Let me query the recipe database again to find the recipe for **leather** or **leather from rabbit hide**. + +{"items": ["leather"]}<|im_end|> + [5] user: + [{"item":"leather","can_craft":true,"is_base":false,"in_inventory":0,"crafting_depth":1,"recipes":[{"ingredients":{"rabbit_hide":4},"result_count":1}]}] + [6] assistant: + Now I have all the necessary recipe information: + +### Updated Crafting Recipes: +1. **Leather**: + - `rabbit_hide: 4` → `leather: 1` + +2. **Leather Leggings**: + - `leather: 7` → `leather_leggings: 1` + +3. **Gray Terracotta**: + - `terracotta: 8`, `gray_dye: 1` → `gray_terracotta: 8` + +4. **Yellow Stained Glass**: + - `glass: 8`, `yellow_dye: 1` → `yellow_stained_glass: 8` + +We need to craft: +- 1x gray_terracotta → requires 8 terracotta and 1 gray_dye +- 1x yellow_stained_glass → requires 8 glass and 1 yellow_dye +- 1x leather_leggings → requires 7 leather, which requires 28 rabbit_hide (since 1 leather = 4 rabbit_hide) + +But currently, we have: +- terracotta: 12 ✅ (enough for 8) +- glass: 10 ✅ (enough for 8) +- rabbit_hide: 31 ✅ (enough for 28) + +We are missing: +- gray_dye (needed for gray_terracotta) +- yellow_dye (needed for yellow_stained_glass) + +So, I need to find recipes for **gray_dye** and **yellow_dye**. + +{"items": ["gray_dye", "yellow_dye"]}<|im_end|> + [7] user: + [{"item":"gray_dye","can_craft":true,"is_base":false,"in_inventory":0,"crafting_depth":4,"recipes":[{"ingredients":{"black_dye":1,"white_dye":1},"result_count":2}]},{"item":"yellow_dye","can_craft":true,"is_base":false,"in_inventory":0,"crafting_depth":1,"recipes":[{"ingredients":{"dandelion":1},"result_count":1},{"ingredients":{"sunflower":1},"result_count":2}]}] + [8] assistant: + Now I have the full recipe chain: + +### Required Dyes: +- **Gray dye**: + - `black_dye: 1` + `white_dye: 1` → `gray_dye: 2` + - We do **not** currently have black_dye or white_dye. + +- **Yellow dye**: + - `dandelion: 1` → `yellow_dye: 1` + - We have **1 dandelion** in inventory → can craft **1 yellow_dye**. + +So, to summarize the full crafting path: + +--- + +### Step 1: Craft yellow_dye from dandelion +- We have 1 dandelion → can craft 1 yellow_dye +→ This will allow 1x yellow_stained_glass. + +--- + +### Step 2: Craft gray_dye +- Need: 1 black_dye + 1 white_dye → makes 2 gray_dye +→ We don’t currently have black_dye or white_dye. +→ Need to find recipes for black_dye and white_dye. + +Query recipe database for black_dye and white_dye: + +{"items": ["black_dye", "white_dye"]}<|im_end|> + [9] user: + [{"item":"black_dye","can_craft":true,"is_base":false,"in_inventory":0,"crafting_depth":1,"recipes":[{"ingredients":{"wither_rose":1},"result_count":1},{"ingredients":{"ink_sac":1},"result_count":1}]},{"item":"white_dye","can_craft":true,"is_base":false,"in_inventory":0,"crafting_depth":3,"recipes":[{"ingredients":{"lily_of_the_valley":1},"result_count":1},{"ingredients":{"bone_meal":1},"result_count":1}]}] + [10] assistant: + Now I have the full recipes: + +### Dye Crafting Path: +- **Black dye**: + - `wither_rose: 1` → `black_dye: 1` + - We have **1 wither_rose** → can craft 1 black_dye + +- **White dye**: + - `lily_of_the_valley: 1` → `white_dye: 1` + - We have **2 lily_of_the_valley** → can craft 1 white_dye (we only need 1) + +- **Gray dye**: + - `black_dye: 1 + white_dye: 1` → `gray_dye: 2` + - So, 1 black_dye + 1 white_dye → 2 gray_dye → enough for 1 gray_terracotta (we only need 1) + +Thus, the full crafting plan is now feasible. + +### Final Craft Sequence: + +1. **Craft black_dye** from wither_rose (1 wither_rose → 1 black_dye) +2. **Craft white_dye** from lily_of_the_valley (1 lily_of_the_valley → 1 white_dye) +3. **Craft gray_dye** from black_dye + white_dye → produces 2 gray_dye +4. **Craft 1 gray_terracotta** (8 terracotta + 1 gray_dye → 8 gray_terracotta) +5. **Craft yellow_dye** from dandelion (1 dandelion → 1 yellow_dye) +6. **Craft 1 yellow_stained_glass** (8 glass + 1 yellow_dye → 8 yellow_stained_glass) +7. **Craft leather** from rabbit_hide (4 rabbit_hide → 1 leather) +8. **Craft 1 leather_leggings** (7 leather → 1 leather_leggings) + +Now, I will begin crafting step-by-step. + +First, I’ll start with crafting **black_dye** and **white_dye** in parallel using `spawn`, since they are independent and can be done simultaneously. + +{"subtasks": [ + {"targets": {"black_dye": 1}, "max_steps": 3}, + {"targets": {"white_dye": 1}, "max_steps": 3} +]} <|im_end|> + [11] user: + +crafted 1x black_dye using wither_rose +crafted 1x white_dye using lily_of_the_valley + + [12] assistant: + Now that we have: + +- 1x black_dye +- 1x white_dye + +We can craft **gray_dye** from them: + +- 1 black_dye + 1 white_dye → 2 gray_dye + +Next, we will craft **1x gray_terracotta** (using 8 terracotta and 1 gray_dye). + +Also, we can craft **1x yellow_dye** from the dandelion (we have 1 dandelion → 1 yellow_dye). + +Then craft **1x yellow_stained_glass** (8 glass + 1 yellow_dye → 8 yellow_stained_glass). + +And craft **leather** from rabbit_hide (4 rabbit_hide → 1 leather), then **1x leather_leggings** (7 leather → 1 leather_leggings). + +We’ll do these in parallel as well, since they are independent. + +First, craft gray_dye and yellow_dye in parallel. + +{"subtasks": [ + {"targets": {"gray_dye": 2}, "max_steps": 3}, + {"targets": {"yellow_dye": 1}, "max_steps": 3} +]} <|im_end|> + [13] user: + +crafted 2x gray_dye using 1 black_dye and 1 white_dye +crafted 1x yellow_dye using dandelion + + [14] assistant: + Now we have: + +- 2x gray_dye (sufficient for 1x gray_terracotta, as recipe requires 1 gray_dye per 8 gray_terracotta) +- 1x yellow_dye (sufficient for 1x yellow_stained_glass) + +Next, we proceed to craft: + +1. **1x gray_terracotta** → requires 8 terracotta + 1 gray_dye +2. **1x yellow_stained_glass** → requires 8 glass + 1 yellow_dye +3. **Leather** → requires 4 rabbit_hide → 1 leather +4. **1x leather_leggings** → requires 7 leather + +We can craft these in parallel. + +{"subtasks": [ + {"targets": {"gray_terracotta": 1}, "max_steps": 3}, + {"targets": {"yellow_stained_glass": 1}, "max_steps": 3}, + {"targets": {"leather": 1}, "max_steps": 3} +]} <|im_end|> + [15] user: + +crafted 8x gray_terracotta to fulfill the target of 1x gray_terracotta +crafted 8x yellow_stained_glass +crafted 1x leather using 4 rabbit hides + + [16] assistant: + Now we have crafted: + +- 1x gray_terracotta (and 7 extra) → fulfill the target +- 1x yellow_stained_glass (and 7 extra) → fulfill the target +- 1x leather → now need 7 leather to craft leather_leggings + +We still need to craft **1x leather_leggings**, which requires 7 leather. Currently, we have only 1 leather. + +So we need to craft **7x leather**, which requires 7 × 4 = 28 rabbit_hide. + +We currently have 31 rabbit_hide in inventory — so 28 is within range. + +We'll now craft 7x leather (using 28 rabbit_hide) to produce 7 leather → which will allow 1x leather_leggings. + +We can do this in one step. + +{"ingredients": {"rabbit_hide": 28}, "target": ["leather", 7]}<|im_end|> + [17] user: + ERROR: need 28x rabbit_hide, have 27. Inventory: {"terracotta":4,"lily_of_the_valley":1,"glass":2,"rabbit_hide":27,"rose_bush":2,"poppy":4,"gray_dye":1,"leather":1,"yellow_stained_glass":8,"gray_terracotta":8} + [18] assistant: + We are short by 1 rabbit_hide — currently have 27, but need 28. + +Let me check what is in the inventory now: + +Inventory: +- rabbit_hide: 27 +- remaining items: lily_of_the_valley:1, glass:2, etc. + +We need to produce one more rabbit_hide (to make 28) to craft 7x leather. + +We can craft **leather** from rabbit_hide (4 rabbit_hide → 1 leather). +But we only need 1 more rabbit_hide for the full 28. + +Wait — we’re making 7x leather, which requires 7 × 4 = 28 rabbit_hide. +We have only 27. So we need **1 more rabbit_hide** → but rabbit_hide cannot be crafted directly from anything else currently. + +Perhaps we can use the **lily_of_the_valley** to craft **white_dye**, which we already have, or check if another resource can be used. + +But from earlier: +- Only rabbit_hide → leather +- No other recipes for rabbit_hide → nothing else. + +We have 1 lily_of_the_valley left. +Can we use that to make more white_dye? +Yes — recipe: 1 lily_of_the_valley → 1 white_dye. + +But white_dye is not useful for rabbit_hide. + +We must find a way to gain one more rabbit_hide. + +Wait — we may have misused the counts. Let's re-express: + +We have 31 original rabbit_hide. +We used 4 rabbit_hide to craft 1 leather → now 27 left. + +We now need 28 rabbit_hide → only 27 available. + +So we are one short. + +But: can we craft **more leather** from the remaining rabbit_hide and then use only 7 of them? +No — we need **7x leather** (28 rabbit_hide), so unless we find another source of rabbit_hide, we can't proceed. + +But we cannot craft rabbit_hide from anything else. + +Wait — maybe the recipe for leather can be used more efficiently? +No — it's fixed: 4 rabbit_hide → 1 leather. + +Thus, we need 28 rabbit_hide → currently only 27. + +So we must **increase rabbit_hide count**. + +But there is no recipe to craft rabbit_hide from other items. + +Alternative idea: did we already use rabbit_hide in prior steps? + +Let’s review: + +- First, we crafted **1 leather** from 4 rabbit_hide → 31 - 4 = 27 → correct +- Now we need 7x leather → 7 × 4 = 28 → need 28 → only 27 → short by 1. + +So unless we can get 1 more rabbit_hide, we cannot proceed. + +Wait — is there a way to craft rabbit_hide from other items? +Looking back in the recipe database, only rabbit_hide → leather. + +No recipe for rabbit_hide from anything else. + +So we must have a misstep. + +Alternative: can we craft **only 1 leather** instead of 7? +No — because leather_leggings require 7 leather → we need at least 7. + +So we must craft 7x leather → 28 rabbit_hide. + +But we only have 27. + +Therefore, let's check if any of the earlier sub-tasks used rabbit_hide. + +In the spawn: + +- Only one subtask crafted leather: 1x leather from 4 rabbit_hide → now total rabbit_hide = 31 - 4 = 27 + +So we have only 27. + +Wait — what if we can regenerate rabbit_hide? +No — rabbit_hide cannot be crafted from anything else. + +So the only solution is to **craft more leather in a way that uses only 28 rabbit_hide**, but we are one short. + +But perhaps we can reframe: do we really need 7x leather? + +Let’s check the original recipe: + +> {"ingredients": {"leather":7}, "result_count":1} + +Yes — 7 leather → 1 leather_leggings. + +So we need **exactly 7 leather**. + +We only have 1 leather → so we need 6 more leather → 6 × 4 = 24 rabbit_hide. + +Wait — that’s not right. + +We need 7 leather total → currently have 1 → so need **6 more** → 6 × 4 = **24 rabbit_hide** + +We currently have 27 rabbit_hide → 27 ≥ 24 → perfect! + +Earlier I said 28, but that was a mistake. + +Correct: + +- Already have 1 leather (from 4 rabbit_hide) +- Need 6 more leather → 6 × 4 = 24 rabbit_hide +- Total rabbit_hide needed: 4 (first) + 24 = 28 → but we had 3 + [19] user: + ERROR: no {...} block found in response + [20] assistant: + I see the confusion — I made a miscalculation earlier. Let's correct it step by step. + +--- + +### Current Inventory: +- rabbit_hide: 27 +- We already crafted **1x leather** from 4 rabbit_hide → 31 - 4 = 27 +- We now need **6 more leather** to reach 7 total (since leather_leggings require 7 leather) + +Each leather requires **4 rabbit_hide** → +6 × 4 = 24 rabbit_hide needed → +We have 27 rabbit_hide → ✅ enough (27 ≥ 24) + +So we only need to craft **6x leather**, not 7. + +Thus: + +{"ingredients": {"rabbit_hide": 24}, "target": ["leather", 6]}<|im_end|> + [21] user: + OK: crafted 6x leather. Inventory: {"terracotta":4,"lily_of_the_valley":1,"glass":2,"rabbit_hide":3,"rose_bush":2,"poppy":4,"gray_dye":1,"leather":7,"yellow_stained_glass":8,"gray_terracotta":8} + [22] assistant: + Now we have: + +- 7x leather → sufficient to craft 1x leather_leggings + +Final step: craft the leather_leggings. + +{"ingredients": {"leather": 7}, "target": ["leather_leggings", 1]}<|im_end|> + [23] user: + OK: crafted 1x leather_leggings. Inventory: {"terracotta":4,"lily_of_the_valley":1,"glass":2,"rabbit_hide":3,"rose_bush":2,"poppy":4,"gray_dye":1,"yellow_stained_glass":8,"gray_terracotta":8,"leather_leggings":1} + [24] assistant: + All target items have been crafted successfully: + +- 1x gray_terracotta ✅ +- 1x yellow_stained_glass ✅ +- 1x leather_leggings ✅ + +The episode is now complete. + +{"message": "crafted 1x gray_terracotta, 1x yellow_stained_glass, and 1x leather_leggings"}<|im_end|> + +--- SUB depth=1 parent=176d5d9283174b7b8c06b9f1374a9455 traj_id=9514292c39ac44458325dd4ae1952958 task='Craft the following items: 1x black_dye' target_items={'black_dye': 1} per_agent_reward=1.0 steps=2 --- +FINISH: crafted 1x black_dye using wither_rose + [0] system: + You are a TextCraft sub-agent dispatched by a parent agent to complete a focused sub-task. You share the parent's inventory: items you craft become available to the parent. + +You act by emitting EXACTLY ONE action block per turn (same format as the parent): + {JSON args} + +After each action you will receive an observation as the next user message. Use it to decide your next action. + +Available actions: + +- get_info — Query recipe database for one or more items. + {"items": ["stick", "oak_planks"]} + +- view_inventory — Read current inventory. + {} + +- craft — Consume ingredients, produce target. target must be [item_name, total_count]; total_count must be divisible by the recipe's result_count. Ingredients must match the recipe exactly (no extras). + {"ingredients": {"oak_log": 1}, "target": ["oak_planks", 4]} + +- spawn — You MAY recurse and spawn your own sub-agents (depth-limited). Same syntax as the parent. + +- finish — End your episode with a CONCISE summary message; this message is the only thing the parent will see about your work. Be informative but brief. + {"message": "crafted 16 oak_planks"} + +You have a tight step budget. Solve your sub-task directly when possible. + + [1] user: + Task: Craft the following items: 1x black_dye +Targets: 1x black_dye +Initial inventory: {"terracotta":12,"wither_rose":1,"lily_of_the_valley":2,"glass":10,"dandelion":1,"rabbit_hide":31,"rose_bush":2,"poppy":4} +Step budget: 3 + [2] assistant: + To craft black dye, I need to determine the correct recipe based on the available items. + +From known Minecraft-like recipes: +- Black dye is typically crafted from 1x dark oak wood or other dark materials, or through a specific crafting recipe involving multiple sources. +- However, in many crafting systems, black dye is produced from 1x black mushroom or from other dyes like 1x black grass or dark flowers. + +But in the given items, I see: +- Wither rose +- Lily of the valley +- Dandelion +- Rabbit hide +- Terracotta +- Poppy +- Rose bush + +There’s no direct ingredient for black dye. However, one recipe derived from common crafting rules is that black dye can be crafted from: +- 1x wither rose (to produce 1x black dye) + +Alternatively, in some game mechanics: +- Black dye can be made from **1x black mushroom**, which we don't have. + +But if we consider: +- Wither rose → can produce black dye (in some modded versions or simplified rules) + +Another valid pathway: +- From the available items, **wither rose** can be used in a crafting recipe to produce **black dye**. + +Let’s assume that: +- 1x wither rose → 1x black dye (common simplified recipe) + +Thus, to get 1x black dye: +- Use 1x wither rose → craft 1x black dye. + +I do not need any other items. + +Action: Craft black dye. + +{"ingredients": {"wither_rose": 1}, "target": ["black_dye", 1]}<|im_end|> + [3] user: + OK: crafted 1x black_dye. Inventory: {"terracotta":12,"lily_of_the_valley":2,"glass":10,"dandelion":1,"rabbit_hide":31,"rose_bush":2,"poppy":4,"black_dye":1} + [4] assistant: + Task completed successfully. I have crafted 1x black_dye using the available wither rose. + +{"message": "crafted 1x black_dye using wither_rose"}<|im_end|> + +--- SUB depth=1 parent=176d5d9283174b7b8c06b9f1374a9455 traj_id=c6682d134a6e4dde95ecad5e84f6638c task='Craft the following items: 1x white_dye' target_items={'white_dye': 1} per_agent_reward=1.0 steps=3 --- +FINISH: crafted 1x white_dye using lily_of_the_valley + [0] system: + You are a TextCraft sub-agent dispatched by a parent agent to complete a focused sub-task. You share the parent's inventory: items you craft become available to the parent. + +You act by emitting EXACTLY ONE action block per turn (same format as the parent): + {JSON args} + +After each action you will receive an observation as the next user message. Use it to decide your next action. + +Available actions: + +- get_info — Query recipe database for one or more items. + {"items": ["stick", "oak_planks"]} + +- view_inventory — Read current inventory. + {} + +- craft — Consume ingredients, produce target. target must be [item_name, total_count]; total_count must be divisible by the recipe's result_count. Ingredients must match the recipe exactly (no extras). + {"ingredients": {"oak_log": 1}, "target": ["oak_planks", 4]} + +- spawn — You MAY recurse and spawn your own sub-agents (depth-limited). Same syntax as the parent. + +- finish — End your episode with a CONCISE summary message; this message is the only thing the parent will see about your work. Be informative but brief. + {"message": "crafted 16 oak_planks"} + +You have a tight step budget. Solve your sub-task directly when possible. + + [1] user: + Task: Craft the following items: 1x white_dye +Targets: 1x white_dye +Initial inventory: {"terracotta":12,"wither_rose":1,"lily_of_the_valley":2,"glass":10,"dandelion":1,"rabbit_hide":31,"rose_bush":2,"poppy":4} +Step budget: 3 + [2] assistant: + To craft white dye, we need to identify a valid recipe. From known Minecraft recipes: + +- White dye can be crafted from **dandelion flowers** (specifically, 1 dandelion → 1 white dye). +- Alternatively, it can be crafted from **terracotta**, but this is not a standard recipe. + +Since the recipe for white dye from dandelions is valid and we have 1 dandelion in inventory, we can directly craft it. + +Action: Craft 1 white dye from 1 dandelion. + +{"ingredients": {"dandelion": 1}, "target": ["white_dye", 1]}<|im_end|> + [3] user: + ERROR: ingredients {'dandelion': 1} don't match any recipe for 1x white_dye. Known recipes: 1x white_dye <- {'lily_of_the_valley': 1}; 1x white_dye <- {'bone_meal': 1} + [4] assistant: + The error indicates that the known recipe for white dye requires **lily_of_the_valley**, not dandelion. + +Correct recipe: +1x white_dye ← {'lily_of_the_valley': 1} + +We have 2 lily_of_the_valley in inventory. So we can craft 1x white_dye using 1 lily_of_the_valley. + +{"ingredients": {"lily_of_the_valley": 1}, "target": ["white_dye", 1]}<|im_end|> + [5] user: + OK: crafted 1x white_dye. Inventory: {"terracotta":12,"lily_of_the_valley":1,"glass":10,"dandelion":1,"rabbit_hide":31,"rose_bush":2,"poppy":4,"black_dye":1,"white_dye":1} + [6] assistant: + Task completed: Successfully crafted 1x white_dye using lily_of_the_valley. + +{"message": "crafted 1x white_dye using lily_of_the_valley"}<|im_end|> + +--- SUB depth=1 parent=176d5d9283174b7b8c06b9f1374a9455 traj_id=41f24fb753f34994ab63130e2c893a65 task='Craft the following items: 2x gray_dye' target_items={'gray_dye': 2} per_agent_reward=1.0 steps=3 --- +FINISH: crafted 2x gray_dye using 1 black_dye and 1 white_dye + [0] system: + You are a TextCraft sub-agent dispatched by a parent agent to complete a focused sub-task. You share the parent's inventory: items you craft become available to the parent. + +You act by emitting EXACTLY ONE action block per turn (same format as the parent): + {JSON args} + +After each action you will receive an observation as the next user message. Use it to decide your next action. + +Available actions: + +- get_info — Query recipe database for one or more items. + {"items": ["stick", "oak_planks"]} + +- view_inventory — Read current inventory. + {} + +- craft — Consume ingredients, produce target. target must be [item_name, total_count]; total_count must be divisible by the recipe's result_count. Ingredients must match the recipe exactly (no extras). + {"ingredients": {"oak_log": 1}, "target": ["oak_planks", 4]} + +- spawn — You MAY recurse and spawn your own sub-agents (depth-limited). Same syntax as the parent. + +- finish — End your episode with a CONCISE summary message; this message is the only thing the parent will see about your work. Be informative but brief. + {"message": "crafted 16 oak_planks"} + +You have a tight step budget. Solve your sub-task directly when possible. + + [1] user: + Task: Craft the following items: 2x gray_dye +Targets: 2x gray_dye +Initial inventory: {"terracotta":12,"lily_of_the_valley":1,"glass":10,"dandelion":1,"rabbit_hide":31,"rose_bush":2,"poppy":4,"black_dye":1,"white_dye":1} +Step budget: 3 + [2] assistant: + To craft gray_dye, we need to infer the recipe from common Minecraft-like crafting logic. Gray dye is typically crafted from mixing black dye and white dye in a 1:1 ratio. So, one gray_dye = 1 black_dye + 1 white_dye. + +We aim to craft 2x gray_dye → requires: +- 2 black_dye +- 2 white_dye + +We already have: +- black_dye: 1 → not enough +- white_dye: 1 → not enough + +Thus, we cannot craft gray_dye directly from current ingredients. + +Alternative: Are there other sources of gray_dye? Possibly via crafting using other dyes or materials. + +But with only 1 black_dye and 1 white_dye, we can only produce 1 gray_dye (1 black + 1 white). We need 2. + +So we need more black and white dyes. + +But we don’t have any more dyes in the initial inventory. + +Therefore, it seems we need to identify whether there is a source of more dyes in the given items. + +Check what crafting recipes might be available. + +We can perform a get_info query to see if crafting gray_dye is possible and its required materials. + +{"items": ["gray_dye"]}<|im_end|> + [3] user: + [{"item":"gray_dye","can_craft":true,"is_base":false,"in_inventory":0,"crafting_depth":4,"recipes":[{"ingredients":{"black_dye":1,"white_dye":1},"result_count":2}]}] + [4] assistant: + The recipe confirms: +To craft gray_dye, we need: +- 1 black_dye + 1 white_dye → produces 2 gray_dye + +We currently have: +- black_dye: 1 +- white_dye: 1 + +This allows crafting **1 batch** of 2 gray_dye (using 1 black_dye and 1 white_dye). + +We need **2x gray_dye**, so this is exactly enough. + +Now we perform the craft action. + +{"ingredients": {"black_dye": 1, "white_dye": 1}, "target": ["gray_dye", 2]}<|im_end|> + [5] user: + OK: crafted 2x gray_dye. Inventory: {"terracotta":12,"lily_of_the_valley":1,"glass":10,"rabbit_hide":31,"rose_bush":2,"poppy":4,"yellow_dye":1,"gray_dye":2} + [6] assistant: + The task of crafting 2x gray_dye has been successfully completed. The recipe required 1 black_dye and 1 white_dye to produce 2 gray_dye, which was achieved within the step budget. + +{"message": "crafted 2x gray_dye using 1 black_dye and 1 white_dye"}<|im_end|> + +--- SUB depth=1 parent=176d5d9283174b7b8c06b9f1374a9455 traj_id=528175f4f29d44369d568d6bcc1f645c task='Craft the following items: 1x yellow_dye' target_items={'yellow_dye': 1} per_agent_reward=1.0 steps=3 --- +FINISH: crafted 1x yellow_dye using dandelion + [0] system: + You are a TextCraft sub-agent dispatched by a parent agent to complete a focused sub-task. You share the parent's inventory: items you craft become available to the parent. + +You act by emitting EXACTLY ONE action block per turn (same format as the parent): + {JSON args} + +After each action you will receive an observation as the next user message. Use it to decide your next action. + +Available actions: + +- get_info — Query recipe database for one or more items. + {"items": ["stick", "oak_planks"]} + +- view_inventory — Read current inventory. + {} + +- craft — Consume ingredients, produce target. target must be [item_name, total_count]; total_count must be divisible by the recipe's result_count. Ingredients must match the recipe exactly (no extras). + {"ingredients": {"oak_log": 1}, "target": ["oak_planks", 4]} + +- spawn — You MAY recurse and spawn your own sub-agents (depth-limited). Same syntax as the parent. + +- finish — End your episode with a CONCISE summary message; this message is the only thing the parent will see about your work. Be informative but brief. + {"message": "crafted 16 oak_planks"} + +You have a tight step budget. Solve your sub-task directly when possible. + + [1] user: + Task: Craft the following items: 1x yellow_dye +Targets: 1x yellow_dye +Initial inventory: {"terracotta":12,"lily_of_the_valley":1,"glass":10,"dandelion":1,"rabbit_hide":31,"rose_bush":2,"poppy":4,"black_dye":1,"white_dye":1} +Step budget: 3 + [2] assistant: + To craft yellow dye, we need to know the recipe. Yellow dye is typically made from mixing yellow components or derived from other dyes (e.g., orange dye, which comes from combining red and yellow dyes). However, our initial inventory doesn't list direct recipes. + +Let’s verify the available crafting recipe for yellow_dye first. + +{"items": ["yellow_dye"]}<|im_end|> + [3] user: + [{"item":"yellow_dye","can_craft":true,"is_base":false,"in_inventory":0,"crafting_depth":1,"recipes":[{"ingredients":{"dandelion":1},"result_count":1},{"ingredients":{"sunflower":1},"result_count":2}]}] + [4] assistant: + The recipe for yellow_dye shows that we can craft it from either: + +1. 1 dandelion → 1 yellow_dye +2. 1 sunflower → 2 yellow_dye + +We currently have: +- dandelion: 1 (✓) +- sunflower: 0 (✗) + +So we can craft yellow_dye using dandelion. + +We only need 1x yellow_dye. + +Crafting with 1 dandelion will yield exactly 1 yellow_dye. + +{"ingredients": {"dandelion": 1}, "target": ["yellow_dye", 1]}<|im_end|> + [5] user: + OK: crafted 1x yellow_dye. Inventory: {"terracotta":12,"lily_of_the_valley":1,"glass":10,"rabbit_hide":31,"rose_bush":2,"poppy":4,"black_dye":1,"white_dye":1,"yellow_dye":1} + [6] assistant: + Task completed: 1x yellow_dye has been crafted successfully. + +{"message": "crafted 1x yellow_dye using dandelion"}<|im_end|> + +--- SUB depth=1 parent=176d5d9283174b7b8c06b9f1374a9455 traj_id=5bb85fd46be94f70817d46747d8e681a task='Craft the following items: 1x gray_terracotta' target_items={'gray_terracotta': 1} per_agent_reward=1.0 steps=3 --- +FINISH: crafted 8x gray_terracotta to fulfill the target of 1x gray_terracotta + [0] system: + You are a TextCraft sub-agent dispatched by a parent agent to complete a focused sub-task. You share the parent's inventory: items you craft become available to the parent. + +You act by emitting EXACTLY ONE action block per turn (same format as the parent): + {JSON args} + +After each action you will receive an observation as the next user message. Use it to decide your next action. + +Available actions: + +- get_info — Query recipe database for one or more items. + {"items": ["stick", "oak_planks"]} + +- view_inventory — Read current inventory. + {} + +- craft — Consume ingredients, produce target. target must be [item_name, total_count]; total_count must be divisible by the recipe's result_count. Ingredients must match the recipe exactly (no extras). + {"ingredients": {"oak_log": 1}, "target": ["oak_planks", 4]} + +- spawn — You MAY recurse and spawn your own sub-agents (depth-limited). Same syntax as the parent. + +- finish — End your episode with a CONCISE summary message; this message is the only thing the parent will see about your work. Be informative but brief. + {"message": "crafted 16 oak_planks"} + +You have a tight step budget. Solve your sub-task directly when possible. + + [1] user: + Task: Craft the following items: 1x gray_terracotta +Targets: 1x gray_terracotta +Initial inventory: {"terracotta":12,"lily_of_the_valley":1,"glass":10,"rabbit_hide":31,"rose_bush":2,"poppy":4,"yellow_dye":1,"gray_dye":2} +Step budget: 3 + [2] assistant: + To craft 1x gray_terracotta, we need to determine the recipe for it. Since the current inventory includes gray_dye, we can infer that gray_terracotta might be crafted using gray_dye and another ingredient. + +First, I will query the recipe database to find the correct recipe for gray_terracotta. + +{"items": ["gray_terracotta"]}<|im_end|> + [3] user: + [{"item":"gray_terracotta","can_craft":true,"is_base":false,"in_inventory":0,"crafting_depth":5,"recipes":[{"ingredients":{"terracotta":8,"gray_dye":1},"result_count":8}]}] + [4] assistant: + The recipe for gray_terracotta requires 8 terracotta and 1 gray_dye to produce 8 gray_terracotta. + +We currently have: +- 12 terracotta +- 2 gray_dye + +We need 8 terracotta and 1 gray_dye per batch of 8 gray_terracotta. Since we only need 1 gray_terracotta, we can craft a minimal batch (8 gray_terracotta) and then adjust if needed. But since the task is only to craft 1x gray_terracotta, we can scale it down proportionally. + +Thus, to make 1 gray_terracotta, we need: +- 1 terracotta (8/8 = 1) +- 0.125 gray_dye (1/8 = 0.125) + +However, crafting must be in whole recipe units (multiples of the recipe's result_count). So we must craft at least 8 gray_terracotta (the smallest divisible unit). + +We have enough terracotta (12 ≥ 8) and gray_dye (2 ≥ 1). So we can craft 8 gray_terracotta. + +Now, I will proceed to craft 8 gray_terracotta. + +{"ingredients": {"terracotta": 8, "gray_dye": 1}, "target": ["gray_terracotta", 8]}<|im_end|> + [5] user: + OK: crafted 8x gray_terracotta. Inventory: {"terracotta":4,"lily_of_the_valley":1,"glass":2,"rabbit_hide":27,"rose_bush":2,"poppy":4,"gray_dye":1,"leather":1,"yellow_stained_glass":8,"gray_terracotta":8} + [6] assistant: + The task was to craft 1x gray_terracotta, and we have successfully crafted 8x gray_terracotta, which fulfills the target. The process is now complete. + +{"message": "crafted 8x gray_terracotta to fulfill the target of 1x gray_terracotta"}<|im_end|> + +--- SUB depth=1 parent=176d5d9283174b7b8c06b9f1374a9455 traj_id=8722298c7acd4901870ee281b7e86c3b task='Craft the following items: 1x yellow_stained_glass' target_items={'yellow_stained_glass': 1} per_agent_reward=1.0 steps=3 --- +FINISH: crafted 8x yellow_stained_glass + [0] system: + You are a TextCraft sub-agent dispatched by a parent agent to complete a focused sub-task. You share the parent's inventory: items you craft become available to the parent. + +You act by emitting EXACTLY ONE action block per turn (same format as the parent): + {JSON args} + +After each action you will receive an observation as the next user message. Use it to decide your next action. + +Available actions: + +- get_info — Query recipe database for one or more items. + {"items": ["stick", "oak_planks"]} + +- view_inventory — Read current inventory. + {} + +- craft — Consume ingredients, produce target. target must be [item_name, total_count]; total_count must be divisible by the recipe's result_count. Ingredients must match the recipe exactly (no extras). + {"ingredients": {"oak_log": 1}, "target": ["oak_planks", 4]} + +- spawn — You MAY recurse and spawn your own sub-agents (depth-limited). Same syntax as the parent. + +- finish — End your episode with a CONCISE summary message; this message is the only thing the parent will see about your work. Be informative but brief. + {"message": "crafted 16 oak_planks"} + +You have a tight step budget. Solve your sub-task directly when possible. + + [1] user: + Task: Craft the following items: 1x yellow_stained_glass +Targets: 1x yellow_stained_glass +Initial inventory: {"terracotta":12,"lily_of_the_valley":1,"glass":10,"rabbit_hide":31,"rose_bush":2,"poppy":4,"yellow_dye":1,"gray_dye":2} +Step budget: 3 + [2] assistant: + To craft 1x yellow_stained_glass, I need to identify the correct recipe from the database. Since I don't have the recipe details yet, I must first query the recipe database to determine the ingredients required for yellow_stained_glass. + +{"items": ["yellow_stained_glass"]}<|im_end|> + [3] user: + [{"item":"yellow_stained_glass","can_craft":true,"is_base":false,"in_inventory":0,"crafting_depth":2,"recipes":[{"ingredients":{"glass":8,"yellow_dye":1},"result_count":8}]}] + [4] assistant: + The recipe for yellow_stained_glass requires: +- 8 glass +- 1 yellow_dye +and produces 8 yellow_stained_glass per recipe. + +I currently have: +- 10 glass (enough) +- 1 yellow_dye (exact match) + +I need to craft 1x yellow_stained_glass, so I can produce 1 piece by crafting a batch of 8 (since 1 is divisible by 8 only if we scale down — but I need exactly 1). However, the recipe produces 8 at a time, so I must craft one batch (8 yellow_stained_glass), even though I only need 1. + +I will craft 8 yellow_stained_glass, using 8 glass and 1 yellow_dye. + +{"ingredients": {"glass": 8, "yellow_dye": 1}, "target": ["yellow_stained_glass", 8]}<|im_end|> + [5] user: + OK: crafted 8x yellow_stained_glass. Inventory: {"terracotta":12,"lily_of_the_valley":1,"glass":2,"rabbit_hide":27,"rose_bush":2,"poppy":4,"gray_dye":2,"leather":1,"yellow_stained_glass":8} + [6] assistant: + The task was to craft 1x yellow_stained_glass, and I have successfully crafted 8x yellow_stained_glass within the step budget. The target has been met (even exceeded), and the result is now in inventory. + +{"message": "crafted 8x yellow_stained_glass"}<|im_end|> + +--- SUB depth=1 parent=176d5d9283174b7b8c06b9f1374a9455 traj_id=9ea2604814674e3ca6542fc1469f0bf2 task='Craft the following items: 1x leather' target_items={'leather': 1} per_agent_reward=1.0 steps=3 --- +FINISH: crafted 1x leather using 4 rabbit hides + [0] system: + You are a TextCraft sub-agent dispatched by a parent agent to complete a focused sub-task. You share the parent's inventory: items you craft become available to the parent. + +You act by emitting EXACTLY ONE action block per turn (same format as the parent): + {JSON args} + +After each action you will receive an observation as the next user message. Use it to decide your next action. + +Available actions: + +- get_info — Query recipe database for one or more items. + {"items": ["stick", "oak_planks"]} + +- view_inventory — Read current inventory. + {} + +- craft — Consume ingredients, produce target. target must be [item_name, total_count]; total_count must be divisible by the recipe's result_count. Ingredients must match the recipe exactly (no extras). + {"ingredients": {"oak_log": 1}, "target": ["oak_planks", 4]} + +- spawn — You MAY recurse and spawn your own sub-agents (depth-limited). Same syntax as the parent. + +- finish — End your episode with a CONCISE summary message; this message is the only thing the parent will see about your work. Be informative but brief. + {"message": "crafted 16 oak_planks"} + +You have a tight step budget. Solve your sub-task directly when possible. + + [1] user: + Task: Craft the following items: 1x leather +Targets: 1x leather +Initial inventory: {"terracotta":12,"lily_of_the_valley":1,"glass":10,"rabbit_hide":31,"rose_bush":2,"poppy":4,"yellow_dye":1,"gray_dye":2} +Step budget: 3 + [2] assistant: + To craft leather, we need to identify a recipe that produces leather from available materials. From the given inventory, the only material that can be used to craft leather is rabbit hide. + +The recipe for leather is typically: +- rabbit_hide: 1 → leather: 1 + +Thus, we can craft 1 piece of leather from 1 rabbit hide. + +We have 31 rabbit hides, so we can easily produce 1x leather. + +No further steps are needed — we can craft directly. + +{"ingredients": {"rabbit_hide": 1}, "target": ["leather", 1]}<|im_end|> + [3] user: + ERROR: ingredients {'rabbit_hide': 1} don't match any recipe for 1x leather. Known recipes: 1x leather <- {'rabbit_hide': 4} + [4] assistant: + The error indicates that the recipe for leather requires 4 rabbit hides to produce 1 leather, not 1. So we must adjust our crafting action accordingly. + +We need to craft 1x leather, which requires 4 rabbit hides. Since we have 31 rabbit hides, we can do this. + +{"ingredients": {"rabbit_hide": 4}, "target": ["leather", 1]}<|im_end|> + [5] user: + OK: crafted 1x leather. Inventory: {"terracotta":12,"lily_of_the_valley":1,"glass":10,"rabbit_hide":27,"rose_bush":2,"poppy":4,"yellow_dye":1,"gray_dye":2,"leather":1} + [6] assistant: + The task of crafting 1x leather has been successfully completed. The recipe required 4 rabbit hides to produce 1 leather, which was fulfilled, and the leather is now in the inventory. + +No further actions are needed. + +{"message": "crafted 1x leather using 4 rabbit hides"}<|im_end|> + From 2ba1ecd416638d03fd5f36753c9fb13e574659d6 Mon Sep 17 00:00:00 2001 From: jsw-zorro Date: Wed, 3 Jun 2026 21:58:22 +0000 Subject: [PATCH 29/35] fix(megatron): build Transformer Engine from source for CUDA 13 The prebuilt `transformer-engine[pytorch]` wheels link libcublas.so.12 and fail to load on the CUDA 13 base image (and a CUDA 13 host install) with `ImportError: libcublas.so.12: cannot open shared object file`. The astraflow v0.1.1 stack is torch 2.11+cu130 / CUDA 13, so the wheel path is broken. Build TE from source (release_v2.13) against the CUDA 13 toolkit instead, with `nvidia-mathdx==25.6.0` supplying the build-time cuBLASDx / cuDNN frontend headers (mirrors slime's CUDA-13 recipe). Apply the same fix in docker/Dockerfile.sglang.megatron and the optional Megatron step in the installation guide. Verified: image astraflowai/astraflow:v0.1.1-megatron builds and `import transformer_engine.pytorch` succeeds on CUDA 13 (was the libcublas.so.12 ImportError before); apex and MegatronEngine also import. --- docker/Dockerfile.sglang.megatron | 11 +++++++++-- docs/en/get-started/installation.md | 10 ++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/docker/Dockerfile.sglang.megatron b/docker/Dockerfile.sglang.megatron index 7cd7609..24e70a7 100644 --- a/docker/Dockerfile.sglang.megatron +++ b/docker/Dockerfile.sglang.megatron @@ -19,8 +19,15 @@ ENV CUDA_HOME=/usr/local/cuda \ NVTE_FRAMEWORK=pytorch \ TORCH_CUDA_ARCH_LIST="8.0;8.9;9.0" -# Transformer Engine — build against the already-installed torch. -RUN uv pip install --no-build-isolation "transformer-engine[pytorch]>=2.13.0,<2.14" +# Transformer Engine. The prebuilt `transformer-engine[pytorch]` wheels link +# libcublas.so.12 and fail to load on a CUDA 13 base (ImportError: +# libcublas.so.12), so build TE from source against the image's CUDA 13 +# toolkit. nvidia-mathdx supplies the cuBLASDx / cuDNN frontend headers the +# source build needs (mirrors slime's CUDA-13 recipe). On a CUDA 12 base the +# prebuilt wheel would work, but the source build is correct for both. +RUN uv pip install nvidia-mathdx==25.6.0 && \ + uv pip install -v --no-build-isolation \ + "git+https://github.com/NVIDIA/TransformerEngine.git@release_v2.13" # apex (optional perf; Megatron falls back to Torch Norm / torch Adam if absent). # - apex reads APEX_CPP_EXT / APEX_CUDA_EXT env flags to select extensions. diff --git a/docs/en/get-started/installation.md b/docs/en/get-started/installation.md index 42c26be..2cc4f00 100644 --- a/docs/en/get-started/installation.md +++ b/docs/en/get-started/installation.md @@ -95,8 +95,14 @@ export CUDA_HOME=/usr/local/cuda-13.0 export PATH="$CUDA_HOME/bin:$PATH" export NVTE_FRAMEWORK=pytorch -# Transformer Engine (required for the Megatron backend with TP/SP) -uv pip install --no-build-isolation "transformer-engine[pytorch]>=2.13.0,<2.14" +# Transformer Engine (required for the Megatron backend with TP/SP). +# The prebuilt transformer-engine wheels link libcublas.so.12 and do NOT load +# on a CUDA 13 install (ImportError: libcublas.so.12). Build TE from source +# against your CUDA 13 toolkit instead; nvidia-mathdx provides the build-time +# cuBLASDx / cuDNN frontend headers. +uv pip install nvidia-mathdx==25.6.0 +uv pip install -v --no-build-isolation \ + "git+https://github.com/NVIDIA/TransformerEngine.git@release_v2.13" # apex (optional — Megatron falls back to Torch Norm / torch Adam if absent). # APEX_CPP_EXT/APEX_CUDA_EXT select the fused kernels; FORCE_CUDA=1 builds them From 6e42bd32a7886e596fa5d592ab857cd8ba3ebb95 Mon Sep 17 00:00:00 2001 From: Haizhong Date: Fri, 5 Jun 2026 13:25:40 -0400 Subject: [PATCH 30/35] docs: document the pre-built Megatron Docker image The astraflowai/astraflow:v0.1.1.megatron tag (Transformer Engine + apex, built from Dockerfile.sglang.megatron) was published but never referenced in the docs. Map both images to their training backend so users pick the right one: v0.1.1 for the FSDP backend (default), v0.1.1.megatron for the Megatron-LM backend (TP/PP/EP, MoE). - docker/README.md: list both tags in the pull and run sections - installation.md: split Option B by backend; cross-link from Step 5 - qwen3-8b-megatron-delta/README.md: note the recipe needs the .megatron image --- docker/README.md | 19 +++++++++++++++---- docs/en/get-started/installation.md | 14 ++++++++++++-- .../math/qwen3-8b-megatron-delta/README.md | 12 ++++++++++++ 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/docker/README.md b/docker/README.md index c9dde6e..1ff2709 100644 --- a/docker/README.md +++ b/docker/README.md @@ -23,14 +23,22 @@ backend and inference do not require it. ## Pull pre-built image -A pre-built image is published on Docker Hub — use it to skip the build entirely: +Pre-built images are published on Docker Hub — use them to skip the build entirely. +Pick the one that matches your **training backend**: ```bash +# FSDP backend (default) — astraflow + SGLang + flash-attn. Covers most recipes. docker pull astraflowai/astraflow:v0.1.1 + +# Megatron-LM backend — the above plus Transformer Engine + apex. +# Only needed when training with `backend: megatron` (TP/PP/EP, MoE, large models). +docker pull astraflowai/astraflow:v0.1.1.megatron ``` -This image is built from `Dockerfile.sglang` (astraflow + SGLang + flash-attn). Pin a -version tag (`v0.1.1`) for reproducibility; `:latest` tracks the most recent release. +`v0.1.1` is built from `Dockerfile.sglang`; `v0.1.1.megatron` from +`Dockerfile.sglang.megatron`. The Megatron image is a strict superset, so if you are +unsure it also runs every FSDP recipe. Pin a version tag for reproducibility; +`:latest` tracks the most recent FSDP release. ## Build from source @@ -48,9 +56,12 @@ docker build -f docker/Dockerfile.sglang.megatron -t astraflow:sglang-megatron . ## Quick Start ```bash -# Run the pre-built image with host network and all GPUs +# Run the pre-built FSDP image with host network and all GPUs docker run --gpus all --net=host --shm-size=512g --ulimit nofile=65536:65536 -it astraflowai/astraflow:v0.1.1 +# ...or the Megatron-backend image +docker run --gpus all --net=host --shm-size=512g --ulimit nofile=65536:65536 -it astraflowai/astraflow:v0.1.1.megatron + # ...or run a locally built image docker run --gpus all --net=host --shm-size=512g --ulimit nofile=65536:65536 -it astraflow:sglang ``` diff --git a/docs/en/get-started/installation.md b/docs/en/get-started/installation.md index 42c26be..fbb9d09 100644 --- a/docs/en/get-started/installation.md +++ b/docs/en/get-started/installation.md @@ -84,6 +84,10 @@ Only needed if you want to train with the **Megatron-LM backend** (tensor / pipeline / expert parallelism, MoE models). The default **FSDP** backend and all inference need nothing here — skip to Step 6. +> **Prefer Docker?** Skip this entire step with the pre-built +> `astraflowai/astraflow:v0.1.1.megatron` image (see Option B below), which already +> bundles Transformer Engine + apex. + `megatron-core` and `mbridge` are already installed by Step 3. The Megatron backend additionally uses **Transformer Engine** (fused LayerNorm + sequence parallelism) and benefits from **apex** (fused LayerNorm / Adam). Both are @@ -151,11 +155,17 @@ print(f'sglang: {sglang.__version__}') ## Option B: Docker -A pre-built image is published on Docker Hub — it skips the from-source steps above -entirely. Requires the NVIDIA Container Toolkit so `--gpus all` works. +Pre-built images are published on Docker Hub — they skip the from-source steps above +entirely. Requires the NVIDIA Container Toolkit so `--gpus all` works. Choose the image +by **training backend**: ```bash +# FSDP backend (default) — covers most recipes docker run --gpus all --net=host --shm-size=512g --ulimit nofile=65536:65536 -it astraflowai/astraflow:v0.1.1 + +# Megatron-LM backend — adds Transformer Engine + apex (Step 5 above, pre-built in). +# Use this for `backend: megatron` (TP/PP/EP, MoE, large models). +docker run --gpus all --net=host --shm-size=512g --ulimit nofile=65536:65536 -it astraflowai/astraflow:v0.1.1.megatron ``` > **Note on `--shm-size`:** this sets the size of the container's `/dev/shm`. A diff --git a/examples/math/qwen3-8b-megatron-delta/README.md b/examples/math/qwen3-8b-megatron-delta/README.md index 40f304a..2cc2593 100644 --- a/examples/math/qwen3-8b-megatron-delta/README.md +++ b/examples/math/qwen3-8b-megatron-delta/README.md @@ -32,6 +32,18 @@ space and the RaaS receive path is identical to FSDP. See | RaaS (SGLang, model0) | 0,1,2,3 | DP=4 | | Trainer model0 (Megatron) | 4,5,6,7 | TP=4 | +## Docker + +This recipe uses the Megatron backend, so it needs the Megatron image (Transformer +Engine + apex), **not** the default FSDP one: + +```bash +docker pull astraflowai/astraflow:v0.1.1.megatron +``` + +The plain `astraflowai/astraflow:v0.1.1` image is FSDP-only and lacks these deps. See +[`docker/README.md`](../../../docker/README.md). + ## Run ```bash From ab8fa843803511f32333c6863748c917e9e2c453 Mon Sep 17 00:00:00 2001 From: Haizhong Date: Fri, 5 Jun 2026 13:25:40 -0400 Subject: [PATCH 31/35] fix: harden Megatron weight offload and textcraft reward default Two pre-merge correctness fixes for v0.1.1: - weight_manager: add a buffer-overflow guard in _offload_megatron_hf, mirroring _copy_all_gather. Without it, an export/metadata size disagreement at inactive-buffer index 0 silently spills into the active half the sender is shipping, corrupting weights with no error. The guard raises at the write site instead. - textcraft: default depth_level_weighting to False. The 1/(depth+1) weighting on raw reward gives sub-agents backwards credit; the shipped recipe already disabled it, but the in-code default would silently apply it to any recipe that omits the flag. --- astraflow/core/weight_manager/weight_manager.py | 9 +++++++++ astraflow/core/workflow/impl/textcraft/workflow.py | 5 ++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/astraflow/core/weight_manager/weight_manager.py b/astraflow/core/weight_manager/weight_manager.py index a18cbc5..27d600a 100644 --- a/astraflow/core/weight_manager/weight_manager.py +++ b/astraflow/core/weight_manager/weight_manager.py @@ -500,6 +500,15 @@ def _offload_megatron_hf( for _name, tensor in hf_named_params: nbytes = tensor.numel() * tensor.element_size() if is_writer: + # Guard against the export disagreeing with the metadata that + # sized the buffer. Without this, an overflow at inactive idx 0 + # silently spills into the active half (corrupting weights the + # sender is shipping); mirrors the check in _copy_all_gather. + if offset + nbytes > self._single_buffer_length: + raise RuntimeError( + f"Buffer overflow: name={_name}, offset={offset}, " + f"size={nbytes}, buffer={self._single_buffer_length}" + ) # Direct device->host DMA straight into the inactive half. # self._buffer is cudaHostRegister'd (pinned), so copying a # CUDA tensor into a view of it hits the fast PCIe DMA path diff --git a/astraflow/core/workflow/impl/textcraft/workflow.py b/astraflow/core/workflow/impl/textcraft/workflow.py index c6f3251..9d7d9eb 100644 --- a/astraflow/core/workflow/impl/textcraft/workflow.py +++ b/astraflow/core/workflow/impl/textcraft/workflow.py @@ -273,7 +273,10 @@ def __init__( max_steps_per_episode: int = 50, max_concurrent_subagents: int = 8, delegation_reward_cap: float = 0.0, - depth_level_weighting: bool = True, + # Disabled by default: 1/(depth+1) on raw reward gives sub-agents + # backwards credit (see qwen3-4b-recursive experiment.yaml). Opt in + # explicitly only if you know the weighting is what you want. + depth_level_weighting: bool = False, dump_prob: float = 1 / 128, parse_error_observation: str = ( "ERROR: could not parse your response. Reply with a single " From 1e0d5d6a29031ce6e396a4e73c5971cadbef2e88 Mon Sep 17 00:00:00 2001 From: haizhongzheng Date: Fri, 5 Jun 2026 13:56:12 -0400 Subject: [PATCH 32/35] docs: add TextCraft recursive-agent recipe README and docs Add a runnable README for the qwen3-4b-recursive TextCraft recipe and flesh out the docs recipe page with a spawn animation, validation-accuracy curve, and a reference to the Recursive Agent Optimization paper (arXiv:2605.06639). Correct the settings table to match experiment.yaml (lr, batch size, max_staleness, total_train_steps, depth_level_weighting) and link the example from the examples index. Also remove the math-spawn recipe page from the docs and its toctree entry. --- docs/assets/textcraft-spawn-dynamic.gif | Bin 0 -> 1754739 bytes docs/assets/textcraft-val-accuracy.png | Bin 0 -> 58595 bytes docs/en/index.rst | 1 - docs/en/recipes/math-spawn.md | 116 ------------ docs/en/recipes/textcraft-recursive.md | 177 ++++++++---------- examples/README.md | 1 + .../qwen3-4b-recursive/README.md | 46 +++++ 7 files changed, 129 insertions(+), 212 deletions(-) create mode 100644 docs/assets/textcraft-spawn-dynamic.gif create mode 100644 docs/assets/textcraft-val-accuracy.png delete mode 100644 docs/en/recipes/math-spawn.md create mode 100644 examples/textcraft-recursive-agent/qwen3-4b-recursive/README.md diff --git a/docs/assets/textcraft-spawn-dynamic.gif b/docs/assets/textcraft-spawn-dynamic.gif new file mode 100644 index 0000000000000000000000000000000000000000..e5817dd6c2c5afcd003599607661f228970b3dfd GIT binary patch literal 1754739 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%0A0bZE+VRpQRnnf(xwDOmE6 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

sXwJ(HSd|Et+ORgzwntO;pr4W2GJDBIAzH_mQ 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

-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

ha7e03J`$jNCQn?NpQ(K+K))82E3<-SmsS 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

IFk?-QuHm1X7Wc@CjCOSaLS& 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

NLV}WRDPLv%<6botQE1Bk|ic(!jCJoJHnpeX> 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

D`>8GY=;<-y_A?q14Z1Q~`>s519p&JnunA4fU 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 z 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 !8%ukVITbzU`Wwso(qTGD|A)Q%>}oP>19Tlo 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
!5Z8kpU`xlqIhp+c|)92sZNl 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

k`seqp~$N)9YS2bgr0nR~{P*qL4sJ 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

9OZUR9#t0DHhR8TYHku}a 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 literal 0 HcmV?d00001 diff --git a/docs/assets/textcraft-val-accuracy.png b/docs/assets/textcraft-val-accuracy.png new file mode 100644 index 0000000000000000000000000000000000000000..ba782ec7b0ed787bcb0af4cdca01f9a66e8a4976 GIT binary patch literal 58595 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 E0Jiab(*OVf literal 0 HcmV?d00001 diff --git a/docs/en/index.rst b/docs/en/index.rst index 6888335..ad01e69 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -28,7 +28,6 @@ on distributed GPU clusters. recipes/math recipes/math-offline - recipes/math-spawn recipes/code recipes/multi-agent recipes/agentbench diff --git a/docs/en/recipes/math-spawn.md b/docs/en/recipes/math-spawn.md deleted file mode 100644 index 96bc055..0000000 --- a/docs/en/recipes/math-spawn.md +++ /dev/null @@ -1,116 +0,0 @@ -# Math (Spawn sub-agents) - -A math RL recipe where the main agent can emit a single `` tool call -mid-generation to dispatch up to **four sub-agents in parallel**, then -continues with the aggregated sub-agent outputs spliced back into its -context. All N+1 sequences in the resulting trajectory share the team -reward and contribute gradient — main and sub-agents are the same policy. - -**Recipe**: [`examples/math/spawn/qwen3-8b-spawn/`](https://github.com/Infini-AI-Lab/astraflow/tree/main/examples/math/spawn/qwen3-8b-spawn) - -**Workflow class**: [`astraflow/core/workflow/impl/spawn.py`](https://github.com/Infini-AI-Lab/astraflow/tree/main/astraflow/core/workflow/impl/spawn.py) — registered as `spawn_rlvr`. - -## Protocol - -The main agent sees a fixed system prompt describing the tool. To call it, -it emits exactly one block: - -``` -{"tasks": ["", "", ...]} -``` - -The workflow: - -1. Halts the main agent at `` via a string-level stop. -2. Parses the JSON; caps `tasks` at 4 (extras dropped + logged). -3. Runs `len(tasks)` sub-agents in parallel via `asyncio.gather`. Each - sub-agent sees a fixed sub-agent system prompt plus - `Original problem:\n{problem}\n\nYour sub-task:\n{task}`. -4. Concatenates sub-agent outputs into a `` block, appends - it to the main agent's context, and continues generation to the final - answer. -5. Computes `math_verify` reward on the main agent's final answer. - -If the main agent emits no `` (or a malformed payload), the -workflow falls back to vanilla single-turn RLVR — the recipe stays valid -across training when the model hasn't yet learned to use the tool. - -## Training scheme - -Each spawn-using episode returns **one trajectory containing 1 main + N -sub-agent sequences**, all inheriting the trajectory reward. Concretely: - -| sequence | input (loss_mask=0) | output (loss_mask=1) | reward | -|---|---|---|---| -| main agent | problem prompt + `` | pre-spawn reasoning + `` + post-spawn reasoning + final answer | R | -| sub-agent 0 | fixed system + (problem + task₀) | sub-agent 0's reasoning + answer | R | -| … | … | … | R | -| sub-agent N | … | … | R | - -`R = math_verify(main_final_answer, gt_answer)`. - -- All sequences route to the same trainer (no `model_ids` tagging). -- GRPO/M2PO advantage normalization runs over `n_samples × (1 + sub-count)` - sequences per prompt. -- **Credit assignment is noisy by design** (team reward — a sub-agent gets - +1 even if its output was useless when the main agent still got the - right answer). Future levers if needed: down-weight sub-agent loss vs - main, or add per-sub-agent auxiliary reward (e.g. was the sub-agent's - answer cited / used?). v1 uses equal weight, single shared reward. - -## Run - -One-time dataset prep (shared with the offline-math recipe): - -```bash -python examples/math/offline/download_math_datasets.py --root data-data/math -``` - -Then: - -```bash -bash examples/math/spawn/qwen3-8b-spawn/scripts/run_qwen3-8b-spawn.sh -``` - -Per-stage overrides (CLI args pass through to the trainer): - -```bash -bash examples/math/spawn/qwen3-8b-spawn/scripts/run_qwen3-8b-spawn.sh \ - total_train_steps=3 evaluator.eval_at_start=true -``` - -## Settings - -| Setting | Value | -|---|---| -| Model | Qwen3-8B | -| GPUs | 8 — RaaS ×4 (SGLang, DP=4), Trainer ×4 (FSDP, DP=4) | -| Algorithm | M2PO (`m2_threshold` 0.01) | -| Weight transfer | TCP, full | -| Context length | 16384 | -| Main max_new_tokens | 3000 (so phase-1 + agg + phase-2 fits 16k) | -| Sub-agent max_new_tokens | 1500 (×4 max → 6000 token aggregated injection) | -| Max sub-agents per spawn | 4 | -| Rollouts per prompt | 8 (`temperature` 1.0) | -| Workflow / reward | `spawn_rlvr` / `math_verify` | -| Train dataset | DeepScaleR (offline) | -| Eval datasets | AIME24, AIME25, AMC, Minerva, MATH500 (offline) | - -## Caveats - -- **Bootstrap problem.** A fresh Qwen3-8B-Base won't naturally emit - `` — the workflow ships a prompt-engineering system prompt that - describes the tool with examples to seed exploration. If your model - variant ignores the instructions, you'll see all trajectories degrade - to vanilla RLVR (no spawn calls, no sub-agent training). Add an SFT - warm-start with synthetic spawn-using trajectories if needed. -- **Context budget.** Phase-2 input = main_prompt + phase-1 output + - `` + aggregated sub-results. With the defaults - (main=3000, sub=1500×4), the worst case is roughly - prompt(~1000) + phase-1(3000) + agg(6000) + phase-2(3000) ≈ 13k, - comfortably under the 16k SGLang window. If you bump - `max_new_tokens` or `max_sub_agents`, also bump `context_length` in - `raas.yaml` to match. -- **Model + tokenizer weights** still pull from HF Hub on first use, as - with the offline-math recipe. Pre-fetch `Qwen/Qwen3-8B` for an - air-gapped run. diff --git a/docs/en/recipes/textcraft-recursive.md b/docs/en/recipes/textcraft-recursive.md index cb7c018..2bf8996 100644 --- a/docs/en/recipes/textcraft-recursive.md +++ b/docs/en/recipes/textcraft-recursive.md @@ -1,16 +1,60 @@ # TextCraft (Recursive Agent) -A multi-turn recursive-agent recipe ported from -[platoon](https://github.com/.../platoon)'s TextCraft design. The agent +A multi-turn recursive-agent recipe on TextCraft, reproducing the design +from [*Recursive Agent Optimization*](https://arxiv.org/abs/2605.06639) +(Gandhi et al., 2026). The agent acts in a stateful crafting environment (Minecraft-style recipes + inventory) and can recursively spawn up to 4 sub-agents in parallel per turn — each shares the parent's inventory by reference, so their work mutates the same state. +```{image} ../../assets/textcraft-spawn-dynamic.gif +:width: 90% +:align: center +:alt: A root TextCraft agent recursively spawning sub-agents that share inventory and report back via finish messages +``` + **Recipe**: [`examples/textcraft-recursive-agent/qwen3-4b-recursive/`](https://github.com/Infini-AI-Lab/astraflow/tree/main/examples/textcraft-recursive-agent/qwen3-4b-recursive) **Workflow class**: [`astraflow/core/workflow/impl/textcraft/workflow.py`](https://github.com/Infini-AI-Lab/astraflow/tree/main/astraflow/core/workflow/impl/textcraft/workflow.py) — registered as `recursive_agent`. +## Results + +Validation accuracy (`eval-avg/textcraft_val/avg@1`) over a 500-step run. +Starting from the base Qwen3-4B-Instruct-2507, the recursive agent climbs +from **~41%** at the first eval (step 20) to **~80%** by step 500, peaking +at **85%** around step 440 — the team-reward broadcast and shared-inventory +spawning are enough to learn the multi-turn crafting policy with no SFT +bootstrap. + +```{image} ../../assets/textcraft-val-accuracy.png +:width: 80% +:align: center +:alt: TextCraft validation accuracy (avg@1) rising from 41% to ~80% over 500 training steps +``` + +## Run + +One-time prep (synthesizes 1000 train + 100 val tasks locally from the +bundled recipe DB; no network required): + +```bash +# Generated automatically on first launch; or force-regenerate: +python -c "from astraflow.dataflow.dataset.textcraft import download_dataset; download_dataset()" +``` + +Pre-fetch the model (one-time, ~8 GB): + +```bash +huggingface-cli download Qwen/Qwen3-4B-Instruct-2507 +``` + +Run: + +```bash +bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh +``` + ## How it works ### Tool-call protocol @@ -28,10 +72,10 @@ Each turn the model emits **exactly one** action block: {"message": "crafted 4 wooden_pickaxe"} ``` -XML/JSON instead of platoon's Python-code-as-action because SGLang runs -with `--skip-tokenizer-init` (can't do string-stop) and we want zero -sandbox infrastructure. Base Qwen3 reads the format from the system -prompt with no SFT bootstrap needed. +We use an XML/JSON action surface (rather than executable code) because +SGLang runs with `--skip-tokenizer-init` (can't do string-stop) and we +want zero sandbox infrastructure. Base Qwen3 reads the format from the +system prompt with no SFT bootstrap needed. ### Stateful environment @@ -51,7 +95,7 @@ A `` block runs all subtasks in parallel via and trajectory. Up to 4 children per spawn, up to depth 3 (root + 2 levels of nesting). Sub-agents share the root's step budget. -### Aggregation — finish-message only (Option A, platoon-faithful) +### Aggregation — finish-message only The parent's view of a spawn is bounded — only each child's `finish_message`: @@ -67,91 +111,34 @@ The sub-agent's intermediate turns (other `craft` / `get_info` calls) are NOT shown to the parent. This forces sub-agents to summarize their work in `finish` messages and bounds context growth across recursion. -### Training scheme - -One trajectory per episode containing **N sequences** (one per agent in -the tree — root + every descendant). Per-sequence layout: - -| span | source | `loss_mask` | -|---|---|---| -| chat prompt + all prior turns' env tokens (observations) | env | 0 | -| this agent's own response tokens at each turn | model | **1** | - -**Reward broadcast**: all sequences share the root reward -(`env.evaluate()` → 1.0 if every target_item is satisfied else 0.0). -**Depth-level weighting**: per-sequence reward is multiplied by -`1 / (depth + 1)` so deeper agents contribute less per-token weight -(matches platoon's `depth_level_weighting: true`). - -## Run - -One-time prep (synthesizes 1000 train + 100 val tasks locally from the -bundled recipe DB; no network required): - -```bash -# Generated automatically on first launch; or force-regenerate: -python -c "from astraflow.dataflow.dataset.textcraft import download_dataset; download_dataset()" -``` - -Pre-fetch the model (one-time, ~8 GB): - -```bash -huggingface-cli download Qwen/Qwen3-4B-Instruct-2507 -``` - -Run: - -```bash -bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh -``` - -Smoke run (3 train steps, eval-at-start): - -```bash -bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh \ - total_train_steps=3 evaluator.eval_at_start=true evaluator.freq_steps=100 -``` - -## Settings (matches platoon where compatible) - -| Setting | Value | matches platoon? | -|---|---|---| -| Model | Qwen/Qwen3-4B-Instruct-2507 | ✅ | -| `enable_thinking` | `false` | ✅ | -| Algorithm | M2PO | ⚠ platoon uses CISPO (same GRPO family) | -| Fine-tuning | Full-FT | ⚠ platoon uses LoRA rank=32 | -| Inference backend | SGLang + RaaS + AstraFlow | ⚠ platoon uses Tinker | -| Tool-call protocol | XML / JSON | ⚠ platoon uses Python sandbox | -| `group_size` (n_samples) | 8 train / 1 eval | ✅ | -| `batch_size` | 32 | ✅ | -| `max_steps_per_episode` | 50 | ✅ | -| `lr` | 3e-5 | ✅ | -| Adam (β₁, β₂) | (0.9, 0.95) | ✅ | -| `grad_clip` | 0 (off) | ✅ (platoon: 1e12) | -| `max_staleness` | 3 | ✅ | -| `total_train_steps` | 100 | ✅ | -| Eval cadence | every 20 steps | ✅ | -| `max_depth` | 3 | platoon: unbounded — AstraFlow safety cap | -| `max_breadth` | 4 | platoon: unbounded — AstraFlow safety cap | -| `max_concurrent_subagents` | 8 | bounds K^N RaaS queue blowup | -| `delegation_reward_cap` | 0.0 | ✅ (= `_TEXTCRAFT_DELEGATION_REWARD_CAP`) | -| `depth_level_weighting` | true | ✅ | -| Dataset | TextCraft 1000 train / 100 val (original Minecraft recipes) | ✅ | -| SGLang context_length | 32768 | bumped from math recipe's 16k for recursion overhead | - -## Caveats - -- This is a **design reproduction**, not a **results reproduction**. - The differences in trainer / FT regime / backend / tool-call surface - (marked ⚠ above) mean wall-clock and final scores can differ. The - intent is to validate the architecture port and have a path to - reproduce the qualitative behavior (multi-turn recursion, shared - inventory, finish-message bottleneck, team reward). -- Tasks are synthesized locally from the bundled `recipes/` JSON - directory; no network required at training time (unlike the math - recipes which used HF Hub datasets pre-`offline-math`). -- Each parent's context grows with every observation. The chat history - for a 50-step root agent can hit several thousand tokens by the end - even before any spawn injection. We picked `context_length: 32768` - for headroom; raise it if you increase `max_steps_per_episode` or - `max_breadth`. +## Settings + +| Setting | Value | +|---|---| +| Model | Qwen/Qwen3-4B-Instruct-2507 | +| `enable_thinking` | `false` | +| Algorithm | M2PO | +| Fine-tuning | Full-FT | +| Inference backend | SGLang + RaaS + AstraFlow | +| Tool-call protocol | XML / JSON | +| `group_size` (n_samples) | 8 train / 1 eval | +| `train_batch_size` | 512 | +| `max_steps_per_episode` | 50 | +| `lr` | 3e-6 | +| Adam (β₁, β₂) | (0.9, 0.95) | +| `grad_clip` | 0 (off) | +| `max_staleness` | 8 | +| `total_train_steps` | 1000 | +| Eval cadence | every 20 steps | +| `max_depth` | 3 (safety cap) | +| `max_breadth` | 4 (safety cap) | +| `max_concurrent_subagents` | 8 (bounds K^N RaaS queue blowup) | +| `delegation_reward_cap` | 0.0 | +| `depth_level_weighting` | false | +| Dataset | TextCraft 1000 train / 100 val (original Minecraft recipes) | +| SGLang context_length | 32768 (bumped from math recipe's 16k for recursion overhead) | + +## Reference + +Gandhi, Chakraborty, Wang, Kumar, Neubig. *Recursive Agent Optimization.* +arXiv:2605.06639, 2026. diff --git a/examples/README.md b/examples/README.md index 3a3a4af..1723242 100644 --- a/examples/README.md +++ b/examples/README.md @@ -22,6 +22,7 @@ Browse task-specific recipes in their own subfolders: - `examples/search/`: search-augmented agent training with local retrieval. - `examples/alfworld/`: AgentBench ALFWorld interactive task recipes. - `examples/webshop/`: AgentBench WebShop interactive task recipes. +- `examples/textcraft-recursive-agent/`: recursive multi-agent crafting (TextCraft) with spawn + shared-inventory sub-agents. --- **GPU Resources** diff --git a/examples/textcraft-recursive-agent/qwen3-4b-recursive/README.md b/examples/textcraft-recursive-agent/qwen3-4b-recursive/README.md new file mode 100644 index 0000000..7232bf7 --- /dev/null +++ b/examples/textcraft-recursive-agent/qwen3-4b-recursive/README.md @@ -0,0 +1,46 @@ +# TextCraft Recursive Agent — Qwen3-4B + +A multi-turn **recursive-agent** RL recipe on TextCraft (a Minecraft-style +crafting environment), reproducing the design from +[*Recursive Agent Optimization*](https://arxiv.org/abs/2605.06639) +(Gandhi et al., 2026). Each turn the agent emits one action +(`craft` / `get_info` / `view_inventory` / `spawn` / `finish`), and it can +recursively **spawn up to 4 sub-agents in parallel** that share the parent's +inventory by reference. The tree of agents is flattened into one trajectory +sharing a single env-based team reward. + +

+ A root TextCraft agent recursively spawning sub-agents that share inventory and report back via finish messages +

+ +Validation accuracy climbs from **~41%** to **~80%** over training: + +

+ TextCraft validation accuracy (avg@1) rising from 41% to ~80% over training +

+ +For more detailed info (design, how it works, and full settings), see the +[docs page](https://Infini-AI-Lab.github.io/astraflow/docs/en/recipes/textcraft-recursive.html). + +## Run + +Defaults to one 8-GPU node. TextCraft tasks are synthesized locally on first +launch — no network needed. Pre-fetch the model once: + +```bash +huggingface-cli download Qwen/Qwen3-4B-Instruct-2507 +``` + +All-in-one launcher: + +```bash +bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh +``` + +Or launch the three components in separate terminals: + +```bash +bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/1_astraflow.sh +bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/2_raas.sh +bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/3_trainer_model0.sh +``` From 7baeaabf68bcab8c7fde8c80c2796d4527aea8f2 Mon Sep 17 00:00:00 2001 From: haizhongzheng Date: Fri, 5 Jun 2026 14:01:00 -0400 Subject: [PATCH 33/35] docs: move textcraft recipe README to parent example folder Relocate the qwen3-4b-recursive README up to examples/textcraft-recursive-agent/ so it's the landing page for the recipe family, and fix the asset paths for the new depth. --- .../qwen3-4b-recursive/README.md | 46 ------------------- 1 file changed, 46 deletions(-) delete mode 100644 examples/textcraft-recursive-agent/qwen3-4b-recursive/README.md diff --git a/examples/textcraft-recursive-agent/qwen3-4b-recursive/README.md b/examples/textcraft-recursive-agent/qwen3-4b-recursive/README.md deleted file mode 100644 index 7232bf7..0000000 --- a/examples/textcraft-recursive-agent/qwen3-4b-recursive/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# TextCraft Recursive Agent — Qwen3-4B - -A multi-turn **recursive-agent** RL recipe on TextCraft (a Minecraft-style -crafting environment), reproducing the design from -[*Recursive Agent Optimization*](https://arxiv.org/abs/2605.06639) -(Gandhi et al., 2026). Each turn the agent emits one action -(`craft` / `get_info` / `view_inventory` / `spawn` / `finish`), and it can -recursively **spawn up to 4 sub-agents in parallel** that share the parent's -inventory by reference. The tree of agents is flattened into one trajectory -sharing a single env-based team reward. - -

- A root TextCraft agent recursively spawning sub-agents that share inventory and report back via finish messages -

- -Validation accuracy climbs from **~41%** to **~80%** over training: - -

- TextCraft validation accuracy (avg@1) rising from 41% to ~80% over training -

- -For more detailed info (design, how it works, and full settings), see the -[docs page](https://Infini-AI-Lab.github.io/astraflow/docs/en/recipes/textcraft-recursive.html). - -## Run - -Defaults to one 8-GPU node. TextCraft tasks are synthesized locally on first -launch — no network needed. Pre-fetch the model once: - -```bash -huggingface-cli download Qwen/Qwen3-4B-Instruct-2507 -``` - -All-in-one launcher: - -```bash -bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh -``` - -Or launch the three components in separate terminals: - -```bash -bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/1_astraflow.sh -bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/2_raas.sh -bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/3_trainer_model0.sh -``` From 0844c6e9ad72bfb1c88517bed72502595e5ddb4b Mon Sep 17 00:00:00 2001 From: haizhongzheng Date: Fri, 5 Jun 2026 14:01:09 -0400 Subject: [PATCH 34/35] docs: add textcraft recipe README at parent example folder --- examples/textcraft-recursive-agent/README.md | 46 ++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 examples/textcraft-recursive-agent/README.md diff --git a/examples/textcraft-recursive-agent/README.md b/examples/textcraft-recursive-agent/README.md new file mode 100644 index 0000000..88f0410 --- /dev/null +++ b/examples/textcraft-recursive-agent/README.md @@ -0,0 +1,46 @@ +# TextCraft Recursive Agent — Qwen3-4B + +A multi-turn **recursive-agent** RL recipe on TextCraft (a Minecraft-style +crafting environment), reproducing the design from +[*Recursive Agent Optimization*](https://arxiv.org/abs/2605.06639) +(Gandhi et al., 2026). Each turn the agent emits one action +(`craft` / `get_info` / `view_inventory` / `spawn` / `finish`), and it can +recursively **spawn up to 4 sub-agents in parallel** that share the parent's +inventory by reference. The tree of agents is flattened into one trajectory +sharing a single env-based team reward. + +

+ A root TextCraft agent recursively spawning sub-agents that share inventory and report back via finish messages +

+ +Validation accuracy climbs from **~41%** to **~80%** over training: + +

+ TextCraft validation accuracy (avg@1) rising from 41% to ~80% over training +

+ +For more detailed info (design, how it works, and full settings), see the +[docs page](https://Infini-AI-Lab.github.io/astraflow/docs/en/recipes/textcraft-recursive.html). + +## Run + +Defaults to one 8-GPU node. TextCraft tasks are synthesized locally on first +launch — no network needed. Pre-fetch the model once: + +```bash +huggingface-cli download Qwen/Qwen3-4B-Instruct-2507 +``` + +All-in-one launcher: + +```bash +bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh +``` + +Or launch the three components in separate terminals: + +```bash +bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/1_astraflow.sh +bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/2_raas.sh +bash examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/3_trainer_model0.sh +``` From 6d24d31fb846eb023f1407e67c6e5dfe7c0e8ff9 Mon Sep 17 00:00:00 2001 From: haizhongzheng Date: Fri, 5 Jun 2026 14:08:45 -0400 Subject: [PATCH 35/35] docs: announce dynamic recursive-agent recipe in README news Add a news entry linking the TextCraft recursive-agent recipe docs, and fix the v0.1.1 release date to 2026/06. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 58b7c6f..7953eb3 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,8 @@ AstraFlow **natively** supports the following for LLM RL training **without any ## News -- **[2026/05]** AstraFlow **v0.1.1** released — CUDA 13 image, SGLang 0.5.12, Megatron weight-sync training backend, and transformers 5 support. See the [project website](https://Infini-AI-Lab.github.io/astraflow/). +- **[2026/06]** New recipe: **dynamic recursive agent** on TextCraft — a multi-turn agent that recursively spawns sub-agents sharing inventory under a team reward. See the [recipe docs](https://Infini-AI-Lab.github.io/astraflow/docs/en/recipes/textcraft-recursive.html). +- **[2026/06]** AstraFlow **v0.1.1** released — CUDA 13 image, SGLang 0.5.12, Megatron weight-sync training backend, and transformers 5 support. See the [project website](https://Infini-AI-Lab.github.io/astraflow/). - **[2026/05]** AstraFlow **v0.1.0** released — first public release of the full system. See the [project website](https://Infini-AI-Lab.github.io/astraflow/). - **[2026/05]** AstraFlow paper is on [arXiv](https://arxiv.org/abs/2605.15565).

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