diff --git a/.gitignore b/.gitignore index 09b2da4..75074d6 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ data-data data-log tmp-yaml/ issue-draft/ +claude-doc/ .pip-tmp/ *.pid *.pdf @@ -230,3 +231,9 @@ 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 + +# DeepDive HF dataset cache (auto-downloaded) +astraflow/core/workflow/impl/deepdive/deepdive_*.jsonl diff --git a/README.md b/README.md index ba4511a..7953eb3 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,8 @@ AstraFlow **natively** supports the following for LLM RL training **without any ## News +- **[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). 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/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/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_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}" 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]}" + ) 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/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..27d600a 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,98 @@ 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: + # 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 + # (~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(): + 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/core/workflow/__init__.py b/astraflow/core/workflow/__init__.py index 0c7a5a8..3c95304 100644 --- a/astraflow/core/workflow/__init__.py +++ b/astraflow/core/workflow/__init__.py @@ -24,9 +24,14 @@ 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.textcraft.workflow # registers recursive_agent +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 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 +import astraflow.core.workflow.reward.deepdive_success # noqa: F401 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/__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..73995a7 --- /dev/null +++ b/astraflow/core/workflow/impl/deepdive/workflow.py @@ -0,0 +1,702 @@ +"""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: + 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 + 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" + 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" + 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}" + 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/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/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/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/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 new file mode 100644 index 0000000..4781f90 --- /dev/null +++ b/astraflow/core/workflow/impl/spawn.py @@ -0,0 +1,542 @@ +"""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): + 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.""" + 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/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..9d7d9eb --- /dev/null +++ b/astraflow/core/workflow/impl/textcraft/workflow.py @@ -0,0 +1,768 @@ +"""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, + # 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 " + "{...} 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: + out = self.tokenizer.apply_chat_template( + messages, + tokenize=True, + add_generation_prompt=add_generation_prompt, + enable_thinking=self.enable_thinking, + ) + except TypeError: + 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 + ) -> 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/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/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/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, 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"): 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/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/astraflow/raas/api/cli_args.py b/astraflow/raas/api/cli_args.py index b79af81..dceea58 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 @@ -356,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/engine/remote_inf_engine.py b/astraflow/raas/engine/remote_inf_engine.py index 3f3d6ea..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: @@ -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/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. 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/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 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/engine/megatron_engine.py b/astraflow/train_worker/engine/megatron_engine.py index 1fd5a87..20d401c 100644 --- a/astraflow/train_worker/engine/megatron_engine.py +++ b/astraflow/train_worker/engine/megatron_engine.py @@ -368,99 +368,40 @@ 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. - - 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. - - Currently requires PP=1 and EP=1. + def export_hf_named_params(self) -> Iterator[tuple[str, torch.Tensor]]: + """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. + + 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.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, to_cpu=False) - 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/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/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/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( 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/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/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/Dockerfile.sglang.megatron b/docker/Dockerfile.sglang.megatron new file mode 100644 index 0000000..24e70a7 --- /dev/null +++ b/docker/Dockerfile.sglang.megatron @@ -0,0 +1,45 @@ +# 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. 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. +# - 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 f04c6dd..1ff2709 100644 --- a/docker/README.md +++ b/docker/README.md @@ -9,23 +9,36 @@ ## 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: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/). +`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: +Pre-built images are published on Docker Hub — use them to skip the build entirely. +Pick the one that matches your **training backend**: ```bash -docker pull astraflowai/astraflow:v0.1.0 +# 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.0`) 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 @@ -35,16 +48,22 @@ 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 ```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 +# 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=16g -it astraflow:sglang +docker run --gpus all --net=host --shm-size=512g --ulimit nofile=65536:65536 -it astraflow:sglang ``` ## Notes @@ -56,3 +75,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/_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/assets/textcraft-spawn-dynamic.gif b/docs/assets/textcraft-spawn-dynamic.gif new file mode 100644 index 0000000..e5817dd Binary files /dev/null and b/docs/assets/textcraft-spawn-dynamic.gif differ diff --git a/docs/assets/textcraft-val-accuracy.png b/docs/assets/textcraft-val-accuracy.png new file mode 100644 index 0000000..ba782ec Binary files /dev/null and b/docs/assets/textcraft-val-accuracy.png differ 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/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 621bfda..0ce36ae 100644 --- a/docs/en/get-started/installation.md +++ b/docs/en/get-started/installation.md @@ -19,34 +19,126 @@ 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 #### 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 -e ".[sglang]" +``` + +### 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. + +> **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 +compiled from source against the installed PyTorch: + ```bash -uv pip install "sglang==0.5.5.post1" +# 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). +# 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 +# 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 ``` -### Step 5: Verify installation +> 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 " @@ -69,11 +161,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 -docker run --gpus all --net=host --shm-size=512g -it astraflowai/astraflow:v0.1.0 +# 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 @@ -86,6 +184,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. -The image bundles astraflow, SGLang, and flash-attn. Pin a version tag (`v0.1.0`) for +> **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.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 1f4fd9a..ad01e69 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 @@ -20,6 +20,7 @@ on distributed GPU clusters. architecture/raas architecture/trainer architecture/weight-manager + architecture/megatron-weight-sync .. toctree:: :maxdepth: 1 @@ -31,3 +32,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..2bf8996 --- /dev/null +++ b/docs/en/recipes/textcraft-recursive.md @@ -0,0 +1,144 @@ +# TextCraft (Recursive 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 + +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"} +``` + +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 + +[`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 + +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. + +## 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/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|> + 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/math/qwen3-8b-megatron-delta/README.md b/examples/math/qwen3-8b-megatron-delta/README.md new file mode 100644 index 0000000..2cc2593 --- /dev/null +++ b/examples/math/qwen3-8b-megatron-delta/README.md @@ -0,0 +1,67 @@ +# 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 | + +## 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 +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 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 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 +``` diff --git a/examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/1_astraflow.sh b/examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/1_astraflow.sh new file mode 100755 index 0000000..eba0511 --- /dev/null +++ b/examples/textcraft-recursive-agent/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-recursive-agent/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-recursive-agent/qwen3-4b-recursive/scripts/2_raas.sh b/examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/2_raas.sh new file mode 100755 index 0000000..5bb8c9d --- /dev/null +++ b/examples/textcraft-recursive-agent/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-recursive-agent/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-recursive-agent/qwen3-4b-recursive/scripts/3_trainer_model0.sh b/examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/3_trainer_model0.sh new file mode 100755 index 0000000..4342f89 --- /dev/null +++ b/examples/textcraft-recursive-agent/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-recursive-agent/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-recursive-agent/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh b/examples/textcraft-recursive-agent/qwen3-4b-recursive/scripts/run_qwen3-4b-recursive.sh new file mode 100755 index 0000000..a05379f --- /dev/null +++ b/examples/textcraft-recursive-agent/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-recursive-agent/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-recursive-agent/qwen3-4b-recursive/yaml/experiment.yaml b/examples/textcraft-recursive-agent/qwen3-4b-recursive/yaml/experiment.yaml new file mode 100644 index 0000000..59cf195 --- /dev/null +++ b/examples/textcraft-recursive-agent/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-recursive-agent/qwen3-4b-recursive/yaml/raas.yaml b/examples/textcraft-recursive-agent/qwen3-4b-recursive/yaml/raas.yaml new file mode 100644 index 0000000..c0128fe --- /dev/null +++ b/examples/textcraft-recursive-agent/qwen3-4b-recursive/yaml/raas.yaml @@ -0,0 +1,37 @@ +# ============================================================================ +# 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: + # 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 + 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/pyproject.toml b/pyproject.toml index 80108de..1f6b4b4 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 = [ @@ -192,13 +192,27 @@ 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", + # 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", + # 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] -flash-attn = ["torch==2.8.0"] +flash-attn = ["torch==2.11.0"] [tool.pytest.ini_options] pythonpath = ["."]