From 7225b70e25039b3776f07e4bafeedf382d796c58 Mon Sep 17 00:00:00 2001 From: yuymf <1352948945@qq.com> Date: Mon, 25 Sep 2023 20:11:00 +0800 Subject: [PATCH 1/2] Communicate with mineflayer & update on_event() --- Temp.md | 33 + .../workspace/minecraft_tests/on_event.jpeg | Bin 0 -> 297867 bytes metagpt/minecraft_team.py | 192 +++++- metagpt/mineflayer_env/.gitignore | 294 +++++++++ .../mineflayer_env/mineflayer/.prettierignore | 3 + .../mineflayer/.prettierrc.json | 3 + metagpt/mineflayer_env/mineflayer/index.js | 425 +++++++++++++ .../mineflayer-collectblock/.gitignore | 107 ++++ .../mineflayer-collectblock/LICENSE | 21 + .../mineflayer-collectblock/README.md | 89 +++ .../mineflayer-collectblock/_config.yml | 1 + .../mineflayer-collectblock/docs/api.md | 52 ++ .../examples/collector.js | 70 +++ .../examples/oreMiner.js | 59 ++ .../examples/storageBot.js | 107 ++++ .../mineflayer-collectblock/package.json | 44 ++ .../mineflayer-collectblock/src/BlockVeins.ts | 35 ++ .../src/CollectBlock.ts | 451 ++++++++++++++ .../mineflayer-collectblock/src/Inventory.ts | 87 +++ .../mineflayer-collectblock/src/Targets.ts | 60 ++ .../mineflayer-collectblock/src/TaskQueue.ts | 77 +++ .../src/TemporarySubscriber.ts | 34 ++ .../mineflayer-collectblock/src/Util.ts | 13 + .../mineflayer-collectblock/src/index.ts | 25 + .../mineflayer-collectblock/tsconfig.json | 69 +++ .../mineflayer_env/mineflayer/package.json | 38 ++ metagpt/utils/minecraft/__init__.py | 3 + metagpt/utils/minecraft/file_utils.py | 569 ++++++++++++++++++ metagpt/utils/minecraft/json_utils.py | 231 +++++++ metagpt/utils/minecraft/load_prompts.py | 7 +- metagpt/utils/minecraft/process_monitor.py | 94 +++ minecraft_run.py | 1 + 32 files changed, 3274 insertions(+), 20 deletions(-) create mode 100644 Temp.md create mode 100644 docs/resources/workspace/minecraft_tests/on_event.jpeg create mode 100644 metagpt/mineflayer_env/.gitignore create mode 100644 metagpt/mineflayer_env/mineflayer/.prettierignore create mode 100644 metagpt/mineflayer_env/mineflayer/.prettierrc.json create mode 100644 metagpt/mineflayer_env/mineflayer/index.js create mode 100644 metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/.gitignore create mode 100644 metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/LICENSE create mode 100644 metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/README.md create mode 100644 metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/_config.yml create mode 100644 metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/docs/api.md create mode 100644 metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/examples/collector.js create mode 100644 metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/examples/oreMiner.js create mode 100644 metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/examples/storageBot.js create mode 100644 metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/package.json create mode 100644 metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/BlockVeins.ts create mode 100644 metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/CollectBlock.ts create mode 100644 metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/Inventory.ts create mode 100644 metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/Targets.ts create mode 100644 metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/TaskQueue.ts create mode 100644 metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/TemporarySubscriber.ts create mode 100644 metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/Util.ts create mode 100644 metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/index.ts create mode 100644 metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/tsconfig.json create mode 100644 metagpt/mineflayer_env/mineflayer/package.json create mode 100644 metagpt/utils/minecraft/file_utils.py create mode 100644 metagpt/utils/minecraft/json_utils.py create mode 100644 metagpt/utils/minecraft/process_monitor.py diff --git a/Temp.md b/Temp.md new file mode 100644 index 000000000..f120d2249 --- /dev/null +++ b/Temp.md @@ -0,0 +1,33 @@ +## MG-MC记录文档 + +### 0926: 环境信息获取和更新 on_event()实际内容 + +1. Nodejs + Mineflayer配置 + + A.自行安装[Node.js (nodejs.org)](https://nodejs.org/en) + + B.Mineflayer配置 + + ```bash + cd metagpt/mineflayer_env/mineflayer + npm install -g npx + npm install + cd mineflayer-collectblock + npm install + npx tsc + cd .. + npm install + ``` + + + +2.配置完游戏后,在 minecraft_run.py 下修改 + +```python + mc_player.set_port(2465) # Modify this to your LAN port +``` + +python minecraft_run.py + + + diff --git a/docs/resources/workspace/minecraft_tests/on_event.jpeg b/docs/resources/workspace/minecraft_tests/on_event.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..56d80bd16236ad9641076b5a4b6bc0a121fae199 GIT binary patch literal 297867 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 Lzv_SOMn#IK6Xl@LFaZk~sAUwDV2J!8`He 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 C661~l literal 0 HcmV?d00001 diff --git a/metagpt/minecraft_team.py b/metagpt/minecraft_team.py index cc0c64ee9..1c5a72a41 100644 --- a/metagpt/minecraft_team.py +++ b/metagpt/minecraft_team.py @@ -4,6 +4,10 @@ # @Desc : from typing import Iterable, Dict, Any from pydantic import BaseModel, Field +import requests +import json +import time +import os from metagpt.logs import logger from metagpt.roles import Role @@ -13,9 +17,125 @@ from metagpt.software_company import SoftwareCompany from metagpt.actions.minecraft.player_action import PlayerActions from metagpt.roles.minecraft.minecraft_base import Minecraft from metagpt.environment import Environment +import metagpt.utils.minecraft as U +from metagpt.utils.minecraft.process_monitor import SubprocessMonitor +class MineflayerEnv: + def __init__( + self, + mc_port=None, + server_host="http://127.0.0.1", + server_port=3000, + request_timeout=600, + ): + self.mc_port = mc_port + self.server = f"{server_host}:{server_port}" + self.server_port = server_port + self.request_timeout = request_timeout + self.mineflayer = self.get_mineflayer_process(server_port) + self.has_reset = False + self.reset_options = None + self.connected = False + self.server_paused = False -class GameEnvironment(BaseModel): + def set_mc_port(self, mc_port): + self.mc_port = mc_port + + def get_mineflayer_process(self, server_port): + U.f_mkdir("./logs", "mineflayer") + file_path = os.path.abspath(os.path.dirname(__file__)) + return SubprocessMonitor( + commands=[ + "node", + U.f_join(file_path, "mineflayer_env/mineflayer/index.js"), + str(server_port), + ], + name="mineflayer", + ready_match=r"Server started on port (\d+)", + log_path=U.f_join("./logs", "mineflayer"), + ) + + def check_process(self): + retry = 0 + while not self.mineflayer.is_running: + logger.info("Mineflayer process has exited, restarting") + self.mineflayer.run() + if not self.mineflayer.is_running: + if retry > 3: + logger.error("Mineflayer process failed to start") + raise {} + else: + retry += 1 + continue + logger.info(self.mineflayer.ready_line) + res = requests.post( + f"{self.server}/start", + json=self.reset_options, + timeout=self.request_timeout, + ) + if res.status_code != 200: + self.mineflayer.stop() + logger.error( + f"Minecraft server reply with code {res.status_code}" + ) + raise {} + return res.json() + + def reset(self, *, seed=None, options=None, ): + if options is None: + options = {} + if options.get("inventory", {}) and options.get("mode", "hard") != "hard": + logger.error("inventory can only be set when options is hard") + raise{} + + self.reset_options = { + "port": self.mc_port, + "reset": options.get("mode", "hard"), + "inventory": options.get("inventory", {}), + "equipment": options.get("equipment", []), + "spread": options.get("spread", False), + "waitTicks": options.get("wait_ticks", 5), + "position": options.get("position", None), + } + + self.unpause() + self.mineflayer.stop() + time.sleep(1) # wait for mineflayer to exit + + returned_data = self.check_process() + self.has_reset = True + self.connected = True + # All the reset in step will be soft + self.reset_options["reset"] = "soft" + self.pause() + return json.loads(returned_data) + + def close(self): + self.unpause() + if self.connected: + res = requests.post(f"{self.server}/stop") + if res.status_code == 200: + self.connected = False + self.mineflayer.stop() + return not self.connected + + def pause(self): + if self.mineflayer.is_running and not self.server_paused: + res = requests.post(f"{self.server}/pause") + if res.status_code == 200: + self.server_paused = True + return self.server_paused + + def unpause(self): + if self.mineflayer.is_running and self.server_paused: + res = requests.post(f"{self.server}/pause") + if res.status_code == 200: + self.server_paused = False + else: + print(res.json()) + return self.server_paused + +class GameEnvironment(BaseModel, arbitrary_types_allowed=True): """ 游戏环境的记忆,用于多个agent进行信息的共享和缓存,而不需要重复在自己的角色内维护缓存 """ @@ -23,6 +143,14 @@ class GameEnvironment(BaseModel): current_task: str = Field(default="Craft 4 wooden planks") task_execution_time: float = Field(default=float) context: str = Field(default="") + + code: str = Field(default="") + programs: str = Field(default="") + + mf_instance : MineflayerEnv = Field(default_factory=MineflayerEnv) + + def set_mc_port(self, mc_port): + self.mf_instance.set_mc_port(mc_port) def register_roles(self, roles: Iterable[Minecraft]): for role in roles: @@ -36,7 +164,13 @@ class GameEnvironment(BaseModel): def update_context(self, context: str): self.context = context - + + def update_code(self, code: str): + self.code = code + + def update_program(self, programs: str): + self.programs = programs + async def on_event(self, *args): """ Retrieve Minecraft events. @@ -52,26 +186,36 @@ class GameEnvironment(BaseModel): """ try: # Implement the logic to retrieve Minecraft events here. - events = { - "Biome": "river", - "Time": "night", - "Nearby blocks": "water, dirt, stone, coal_ore, sandstone, grass_block, sand, grass, oak_leaves, fern, seagrass, tall_seagrass", - "Nearby entities(nearest to farthest)": "turtle, salmon", - "Health": "20.0 / 20", - "Hunger": "20.0 / 20", - "Position": "x = -47.5, y = 63.0, z = -283.5", - "Equipment": [], - "Inventory(0 / 36)": "Empty", - "Chests": "" - } # Example: events = minecraft_api.get_events() - + if not self.mf_instance.has_reset: + # TODO Modify + logger.info("Environment has not been reset yet, is resetting") + self.mf_instance.reset(options={ + "mode": "soft", + "wait_ticks": 20, + }) + # raise {} + self.mf_instance.check_process() + self.mf_instance.unpause() + data = { + "code": self.code, + "programs": self.programs, + } + res = requests.post( + f"{self.mf_instance.server}/step", json=data, timeout=self.mf_instance.request_timeout + ) + if res.status_code != 200: + logger.error("Failed to step Minecraft server") + raise {} + returned_data = res.json() + self.mf_instance.pause() + events = json.loads(returned_data) + logger.info(f"Get Current Event: {events}") return events except Exception as e: logger.error(f"Failed to retrieve Minecraft events: {str(e)}") raise {} - class MinecraftPlayer(SoftwareCompany): """ Software Company: Possesses a team, SOP (Standard Operating Procedures), and a platform for instant messaging, @@ -83,6 +227,9 @@ class MinecraftPlayer(SoftwareCompany): task: str = Field(default="") game_info: dict = Field(default={}) + def set_port(self, mc_port): + self.game_memory.set_mc_port(mc_port) + def hire(self, roles: list[Role]): self.environment.add_roles(roles) self.game_memory.register_roles(roles) @@ -107,4 +254,15 @@ class MinecraftPlayer(SoftwareCompany): return self.environment.history - +if "__name__" == "__main__": + test_code = "bot.chat(`/time set ${getNextTime()}`);" + mc_port = 1960 + # env_wait_ticks = 20 + ge = GameEnvironment() + ge.set_mc_port(mc_port) + ge.update_code(test_code) + # ge.mf_instance.reset(options={ + # "mode": "soft", + # "wait_ticks": env_wait_ticks, + # }) + logger.info(ge.on_event()) \ No newline at end of file diff --git a/metagpt/mineflayer_env/.gitignore b/metagpt/mineflayer_env/.gitignore new file mode 100644 index 000000000..7d06e79c2 --- /dev/null +++ b/metagpt/mineflayer_env/.gitignore @@ -0,0 +1,294 @@ +# MCP-Reborn +MCP-Reborn/ +run/ +*.jar +config.json + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +.idea/ + +# Logs +logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +package-lock.json \ No newline at end of file diff --git a/metagpt/mineflayer_env/mineflayer/.prettierignore b/metagpt/mineflayer_env/mineflayer/.prettierignore new file mode 100644 index 000000000..1b07c39e9 --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/.prettierignore @@ -0,0 +1,3 @@ +# Ignore artifacts: +build +coverage \ No newline at end of file diff --git a/metagpt/mineflayer_env/mineflayer/.prettierrc.json b/metagpt/mineflayer_env/mineflayer/.prettierrc.json new file mode 100644 index 000000000..0a02bcefd --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/.prettierrc.json @@ -0,0 +1,3 @@ +{ + "tabWidth": 4 +} diff --git a/metagpt/mineflayer_env/mineflayer/index.js b/metagpt/mineflayer_env/mineflayer/index.js new file mode 100644 index 000000000..7fb0a8787 --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/index.js @@ -0,0 +1,425 @@ +const fs = require("fs"); +const express = require("express"); +const bodyParser = require("body-parser"); +const mineflayer = require("mineflayer"); + +const skills = require("./lib/skillLoader"); +const { initCounter, getNextTime } = require("./lib/utils"); +const obs = require("./lib/observation/base"); +const OnChat = require("./lib/observation/onChat"); +const OnError = require("./lib/observation/onError"); +const { Voxels, BlockRecords } = require("./lib/observation/voxels"); +const Status = require("./lib/observation/status"); +const Inventory = require("./lib/observation/inventory"); +const OnSave = require("./lib/observation/onSave"); +const Chests = require("./lib/observation/chests"); +const { plugin: tool } = require("mineflayer-tool"); + +let bot = null; + +const app = express(); + +app.use(bodyParser.json({ limit: "50mb" })); +app.use(bodyParser.urlencoded({ limit: "50mb", extended: false })); + +app.post("/start", (req, res) => { + if (bot) onDisconnect("Restarting bot"); + bot = null; + console.log(req.body); + bot = mineflayer.createBot({ + host: "localhost", // minecraft server ip + port: req.body.port, // minecraft server port + username: "bot", + disableChatSigning: true, + checkTimeoutInterval: 60 * 60 * 1000, + }); + bot.once("error", onConnectionFailed); + + // Event subscriptions + bot.waitTicks = req.body.waitTicks; + bot.globalTickCounter = 0; + bot.stuckTickCounter = 0; + bot.stuckPosList = []; + bot.iron_pickaxe = false; + + bot.on("kicked", onDisconnect); + + // mounting will cause physicsTick to stop + bot.on("mount", () => { + bot.dismount(); + }); + + bot.once("spawn", async () => { + bot.removeListener("error", onConnectionFailed); + let itemTicks = 1; + if (req.body.reset === "hard") { + bot.chat("/clear @s"); + bot.chat("/kill @s"); + const inventory = req.body.inventory ? req.body.inventory : {}; + const equipment = req.body.equipment + ? req.body.equipment + : [null, null, null, null, null, null]; + for (let key in inventory) { + bot.chat(`/give @s minecraft:${key} ${inventory[key]}`); + itemTicks += 1; + } + const equipmentNames = [ + "armor.head", + "armor.chest", + "armor.legs", + "armor.feet", + "weapon.mainhand", + "weapon.offhand", + ]; + for (let i = 0; i < 6; i++) { + if (i === 4) continue; + if (equipment[i]) { + bot.chat( + `/item replace entity @s ${equipmentNames[i]} with minecraft:${equipment[i]}` + ); + itemTicks += 1; + } + } + } + + if (req.body.position) { + bot.chat( + `/tp @s ${req.body.position.x} ${req.body.position.y} ${req.body.position.z}` + ); + } + + // if iron_pickaxe is in bot's inventory + if ( + bot.inventory.items().find((item) => item.name === "iron_pickaxe") + ) { + bot.iron_pickaxe = true; + } + + const { pathfinder } = require("mineflayer-pathfinder"); + const tool = require("mineflayer-tool").plugin; + const collectBlock = require("mineflayer-collectblock").plugin; + const pvp = require("mineflayer-pvp").plugin; + const minecraftHawkEye = require("minecrafthawkeye"); + bot.loadPlugin(pathfinder); + bot.loadPlugin(tool); + bot.loadPlugin(collectBlock); + bot.loadPlugin(pvp); + bot.loadPlugin(minecraftHawkEye); + + // bot.collectBlock.movements.digCost = 0; + // bot.collectBlock.movements.placeCost = 0; + + obs.inject(bot, [ + OnChat, + OnError, + Voxels, + Status, + Inventory, + OnSave, + Chests, + BlockRecords, + ]); + skills.inject(bot); + + if (req.body.spread) { + bot.chat(`/spreadplayers ~ ~ 0 300 under 80 false @s`); + await bot.waitForTicks(bot.waitTicks); + } + + await bot.waitForTicks(bot.waitTicks * itemTicks); + res.json(bot.observe()); + + initCounter(bot); + bot.chat("/gamerule keepInventory true"); + bot.chat("/gamerule doDaylightCycle false"); + }); + + function onConnectionFailed(e) { + console.log(e); + bot = null; + res.status(400).json({ error: e }); + } + function onDisconnect(message) { + if (bot.viewer) { + bot.viewer.close(); + } + bot.end(); + console.log(message); + bot = null; + } +}); + +app.post("/step", async (req, res) => { + // import useful package + let response_sent = false; + function otherError(err) { + console.log("Uncaught Error"); + bot.emit("error", handleError(err)); + bot.waitForTicks(bot.waitTicks).then(() => { + if (!response_sent) { + response_sent = true; + res.json(bot.observe()); + } + }); + } + + process.on("uncaughtException", otherError); + + const mcData = require("minecraft-data")(bot.version); + mcData.itemsByName["leather_cap"] = mcData.itemsByName["leather_helmet"]; + mcData.itemsByName["leather_tunic"] = + mcData.itemsByName["leather_chestplate"]; + mcData.itemsByName["leather_pants"] = + mcData.itemsByName["leather_leggings"]; + mcData.itemsByName["leather_boots"] = mcData.itemsByName["leather_boots"]; + mcData.itemsByName["lapis_lazuli_ore"] = mcData.itemsByName["lapis_ore"]; + mcData.blocksByName["lapis_lazuli_ore"] = mcData.blocksByName["lapis_ore"]; + const { + Movements, + goals: { + Goal, + GoalBlock, + GoalNear, + GoalXZ, + GoalNearXZ, + GoalY, + GoalGetToBlock, + GoalLookAtBlock, + GoalBreakBlock, + GoalCompositeAny, + GoalCompositeAll, + GoalInvert, + GoalFollow, + GoalPlaceBlock, + }, + pathfinder, + Move, + ComputedPath, + PartiallyComputedPath, + XZCoordinates, + XYZCoordinates, + SafeBlock, + GoalPlaceBlockOptions, + } = require("mineflayer-pathfinder"); + const { Vec3 } = require("vec3"); + + // Set up pathfinder + const movements = new Movements(bot, mcData); + bot.pathfinder.setMovements(movements); + + bot.globalTickCounter = 0; + bot.stuckTickCounter = 0; + bot.stuckPosList = []; + + function onTick() { + bot.globalTickCounter++; + if (bot.pathfinder.isMoving()) { + bot.stuckTickCounter++; + if (bot.stuckTickCounter >= 100) { + onStuck(1.5); + bot.stuckTickCounter = 0; + } + } + } + + bot.on("physicTick", onTick); + + // initialize fail count + let _craftItemFailCount = 0; + let _killMobFailCount = 0; + let _mineBlockFailCount = 0; + let _placeItemFailCount = 0; + let _smeltItemFailCount = 0; + + // Retrieve array form post bod + const code = req.body.code; + const programs = req.body.programs; + bot.cumulativeObs = []; + await bot.waitForTicks(bot.waitTicks); + const r = await evaluateCode(code, programs); + process.off("uncaughtException", otherError); + if (r !== "success") { + bot.emit("error", handleError(r)); + } + await returnItems(); + // wait for last message + await bot.waitForTicks(bot.waitTicks); + if (!response_sent) { + response_sent = true; + res.json(bot.observe()); + } + bot.removeListener("physicTick", onTick); + + async function evaluateCode(code, programs) { + // Echo the code produced for players to see it. Don't echo when the bot code is already producing dialog or it will double echo + try { + await eval("(async () => {" + programs + "\n" + code + "})()"); + return "success"; + } catch (err) { + return err; + } + } + + function onStuck(posThreshold) { + const currentPos = bot.entity.position; + bot.stuckPosList.push(currentPos); + + // Check if the list is full + if (bot.stuckPosList.length === 5) { + const oldestPos = bot.stuckPosList[0]; + const posDifference = currentPos.distanceTo(oldestPos); + + if (posDifference < posThreshold) { + teleportBot(); // execute the function + } + + // Remove the oldest time from the list + bot.stuckPosList.shift(); + } + } + + function teleportBot() { + const blocks = bot.findBlocks({ + matching: (block) => { + return block.type === 0; + }, + maxDistance: 1, + count: 27, + }); + + if (blocks) { + // console.log(blocks.length); + const randomIndex = Math.floor(Math.random() * blocks.length); + const block = blocks[randomIndex]; + bot.chat(`/tp @s ${block.x} ${block.y} ${block.z}`); + } else { + bot.chat("/tp @s ~ ~1.25 ~"); + } + } + + function returnItems() { + bot.chat("/gamerule doTileDrops false"); + const crafting_table = bot.findBlock({ + matching: mcData.blocksByName.crafting_table.id, + maxDistance: 128, + }); + if (crafting_table) { + bot.chat( + `/setblock ${crafting_table.position.x} ${crafting_table.position.y} ${crafting_table.position.z} air destroy` + ); + bot.chat("/give @s crafting_table"); + } + const furnace = bot.findBlock({ + matching: mcData.blocksByName.furnace.id, + maxDistance: 128, + }); + if (furnace) { + bot.chat( + `/setblock ${furnace.position.x} ${furnace.position.y} ${furnace.position.z} air destroy` + ); + bot.chat("/give @s furnace"); + } + if (bot.inventoryUsed() >= 32) { + // if chest is not in bot's inventory + if (!bot.inventory.items().find((item) => item.name === "chest")) { + bot.chat("/give @s chest"); + } + } + // if iron_pickaxe not in bot's inventory and bot.iron_pickaxe + if ( + bot.iron_pickaxe && + !bot.inventory.items().find((item) => item.name === "iron_pickaxe") + ) { + bot.chat("/give @s iron_pickaxe"); + } + bot.chat("/gamerule doTileDrops true"); + } + + function handleError(err) { + let stack = err.stack; + if (!stack) { + return err; + } + console.log(stack); + const final_line = stack.split("\n")[1]; + const regex = /:(\d+):\d+\)/; + + const programs_length = programs.split("\n").length; + let match_line = null; + for (const line of stack.split("\n")) { + const match = regex.exec(line); + if (match) { + const line_num = parseInt(match[1]); + if (line_num >= programs_length) { + match_line = line_num - programs_length; + break; + } + } + } + if (!match_line) { + return err.message; + } + let f_line = final_line.match( + /\((?.*):(?\d+):(?\d+)\)/ + ); + if (f_line && f_line.groups && fs.existsSync(f_line.groups.file)) { + const { file, line, pos } = f_line.groups; + const f = fs.readFileSync(file, "utf8").split("\n"); + // let filename = file.match(/(?<=node_modules\\)(.*)/)[1]; + let source = file + `:${line}\n${f[line - 1].trim()}\n `; + + const code_source = + "at " + + code.split("\n")[match_line - 1].trim() + + " in your code"; + return source + err.message + "\n" + code_source; + } else if ( + f_line && + f_line.groups && + f_line.groups.file.includes("") + ) { + const { file, line, pos } = f_line.groups; + let source = + "Your code" + + `:${match_line}\n${code.split("\n")[match_line - 1].trim()}\n `; + let code_source = ""; + if (line < programs_length) { + source = + "In your program code: " + + programs.split("\n")[line - 1].trim() + + "\n"; + code_source = `at line ${match_line}:${code + .split("\n") + [match_line - 1].trim()} in your code`; + } + return source + err.message + "\n" + code_source; + } + return err.message; + } +}); + +app.post("/stop", (req, res) => { + bot.end(); + res.json({ + message: "Bot stopped", + }); +}); + +app.post("/pause", (req, res) => { + if (!bot) { + res.status(400).json({ error: "Bot not spawned" }); + return; + } + bot.chat("/pause"); + bot.waitForTicks(bot.waitTicks).then(() => { + res.json({ message: "Success" }); + }); +}); + +// Server listening to PORT 3000 + +const DEFAULT_PORT = 3000; +const PORT = process.argv[2] || DEFAULT_PORT; +app.listen(PORT, () => { + console.log(`Server started on port ${PORT}`); +}); diff --git a/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/.gitignore b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/.gitignore new file mode 100644 index 000000000..0578fdca3 --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/.gitignore @@ -0,0 +1,107 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +lib/ +package-lock.json diff --git a/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/LICENSE b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/LICENSE new file mode 100644 index 000000000..f2896b56e --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 TheDudeFromCI + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/README.md b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/README.md new file mode 100644 index 000000000..555acb761 --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/README.md @@ -0,0 +1,89 @@ +

mineflayer-collectblock

+

A small utility plugin for allowing users to collect blocks using a higher level API.

+ +
+ +--- +## This is a modified version to better support Voyager + +## Showcase + +You can see a video of the plugin in action, [here.](https://youtu.be/5T_rcCnNnf4) +The source code of the bot in the video can be seen in the examples folder, [here.](https://github.com/TheDudeFromCI/mineflayer-collectblock/blob/master/examples/collector.js) + +### Description + +This plugin is a wrapper for mineflayer that allows for easier API usage when collecting blocks or item drops. This plugin is designed to reduce some of the boilerplate code based around the act of pathfinding to a block _(handled by_ ***mineflayer-pathfinder***_)_, selecting the best tool to mine that block _(handled by_ ***mineflayer-tool***_)_, actually mining it, then moving to collect the item drops from that block. This plugin allows for all of that basic concept to be wrapped up into a single API function. + +In addition to the usage above, some additional quality of life features are available in this plugin. These include the ability to automatically deposit items into a chest when the bot's inventory is full, collecting new tools from a chest if the bot doesn't currently have a required tool _(also handled by_ ***mineflayer-tool***_)_, and allowing for queueing of multiple blocks or item drops to the collection task, so they can be processed later. + +### Getting Started + +This plugin is built using Node and can be installed using: +```bash +npm install --save mineflayer-collectblock +``` + +### Simple Bot + +The brief description goes here. + +```js +// Create your bot +const mineflayer = require("mineflayer") +const bot = mineflayer.createBot({ + host: 'localhost', + username: 'Player', +}) +let mcData + +// Load collect block +bot.loadPlugin(require('mineflayer-collectblock').plugin) + +async function collectGrass() { + // Find a nearby grass block + const grass = bot.findBlock({ + matching: mcData.blocksByName.grass_block.id, + maxDistance: 64 + }) + + if (grass) { + // If we found one, collect it. + try { + await bot.collectBlock.collect(grass) + collectGrass() // Collect another grass block + } catch (err) { + console.log(err) // Handle errors, if any + } + } +} + +// On spawn, start collecting all nearby grass +bot.once('spawn', () => { + mcData = require('minecraft-data')(bot.version) + collectGrass() +}) +``` + +### Documentation + +[API](https://github.com/TheDudeFromCI/mineflayer-collectblock/blob/master/docs/api.md) + +[Examples](https://github.com/TheDudeFromCI/mineflayer-collectblock/tree/master/examples) + +### License + +This project uses the [MIT](https://github.com/TheDudeFromCI/mineflayer-collectblock/blob/master/LICENSE) license. + +### Contributions + +This project is accepting PRs and Issues. See something you think can be improved? Go for it! Any and all help is highly appreciated! + +For larger changes, it is recommended to discuss these changes in the issues tab before writing any code. It's also preferred to make many smaller PRs than one large one, where applicable. diff --git a/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/_config.yml b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/_config.yml new file mode 100644 index 000000000..c4192631f --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-cayman \ No newline at end of file diff --git a/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/docs/api.md b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/docs/api.md new file mode 100644 index 000000000..66d8a3ecc --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/docs/api.md @@ -0,0 +1,52 @@ +# API + +Welcome to the *mineflayer-collectblock* API documentation page. + +## Table of Contents + +- [1. Summary](#1-summary) +- [Properties](#properties) + - [`bot.collectblock.movements: Movements`](#botcollectblockmovements-movements) +- [Functions](#functions) + - [collect](#collect) + - [Options:](#options) + +## 1. Summary + +The collect block plugin is a utility plugin that can be used to help make collecting blocks and item drops very easy, using only a single API call. No need to worry about pathfinding to the block, selecting the right tool, or moving to pick up the item drop after mining. + +## Properties + +### `bot.collectblock.movements: Movements` + +The movements object used by the pathfinder plugin to define the movement configuration. This object is passed to the pathfinder plugin when any API from this plugin is called in order to control how pathfinding should work when collecting the given blocks or item. + +If set to null, the pathfinder plugin movements is not updated. + +Defaults to a new movements object instance. + +## Functions + +### collect + +Usage: `bot.collectblock.collect(target: Collectable | Collectable[], options?: CollectOptions, cb: (err?: Error) => void): void` + +Causes the bot to collect the given block, item drop, or list of those. If the target is a block, the bot will move to the block, mine it, and pick up the item drop. If the target is an item drop, the bot will move to the item drop and pick it up. If the target is a list of collectables, the bot will move from target to target in order of closest to furthest and collect each target in turn. + +#### Options: + + * `append: boolean` + + If true, the target(s) will be appended to the existing target list instead of starting a new task. Defaults to false. + + * `ignoreNoPath: boolean` + + If true, errors will not be thrown when a path to the target block cannot be found. The bot will attempt to choose the best available position it can find, instead. Errors are still thrown if the bot cannot interact with the block from it's final location. Defaults to false. + + * `chestLocations: Vec3[]` + + Gets the list of chest locations to use when storing items after the bot's inventory becomes full. If undefined, it defaults to the chest location list on the bot.collectBlock plugin. + + * `itemFilter: ItemFilter` + + When transferring items to a chest, this filter is used to determine what items are allowed to be moved, and what items aren't allowed to be moved. Defaults to the item filter specified on the bot.collectBlock plugin. \ No newline at end of file diff --git a/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/examples/collector.js b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/examples/collector.js new file mode 100644 index 000000000..b9bb8faf9 --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/examples/collector.js @@ -0,0 +1,70 @@ +/** + * This bot example show how to direct a bot to collect a specific block type + * or a group of nearby blocks of that type. + */ + +const mineflayer = require('mineflayer') +const collectBlock = require('mineflayer-collectblock').plugin + +if (process.argv.length < 4 || process.argv.length > 6) { + console.log('Usage : node collector.js [] []') + process.exit(1) +} + +const bot = mineflayer.createBot({ + host: process.argv[2], + port: process.argv[3], + username: process.argv[4] || 'collector', + password: process.argv[5] +}) + +bot.loadPlugin(collectBlock) + +let mcData +bot.once('spawn', () => { + mcData = require('minecraft-data')(bot.version) +}) + +bot.on('chat', async (username, message) => { + const args = message.split(' ') + if (args[0] !== 'collect') return + + let count = 1 + if (args.length === 3) count = parseInt(args[1]) + + let type = args[1] + if (args.length === 3) type = args[2] + + const blockType = mcData.blocksByName[type] + if (!blockType) { + return + } + + const blocks = bot.findBlocks({ + matching: blockType.id, + maxDistance: 64, + count: count + }) + + if (blocks.length === 0) { + bot.chat("I don't see that block nearby.") + return + } + + const targets = [] + for (let i = 0; i < Math.min(blocks.length, count); i++) { + targets.push(bot.blockAt(blocks[i])) + } + + bot.chat(`Found ${targets.length} ${type}(s)`) + + try { + await bot.collectBlock.collect(targets) + // All blocks have been collected. + bot.chat('Done') + } catch (err) { + // An error occurred, report it. + bot.chat(err.message) + console.log(err) + } +}) diff --git a/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/examples/oreMiner.js b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/examples/oreMiner.js new file mode 100644 index 000000000..6accac88f --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/examples/oreMiner.js @@ -0,0 +1,59 @@ +/** + * This bot example shows how to collect a vein of ores quickly after only finding a single block. + * This makes it easy to collect a vein of ores or mine a tree without looking for every block in the + * area. + */ + +const mineflayer = require('mineflayer') +const collectBlock = require('mineflayer-collectblock').plugin + +if (process.argv.length < 4 || process.argv.length > 6) { + console.log('Usage : node oreMiner.js [] []') + process.exit(1) +} + +const bot = mineflayer.createBot({ + host: process.argv[2], + port: process.argv[3], + username: process.argv[4] || 'oreMiner', + password: process.argv[5] +}) + +bot.loadPlugin(collectBlock) + +let mcData +bot.once('spawn', () => { + mcData = require('minecraft-data')(bot.version) +}) + +bot.on('chat', async (username, message) => { + const args = message.split(' ') + if (args[0] !== 'collect') return + + const blockType = mcData.blocksByName[args[1]] + if (!blockType) { + bot.chat(`I don't know any blocks named ${args[1]}.`) + return + } + + const block = bot.findBlock({ + matching: blockType.id, + maxDistance: 64 + }) + + if (!block) { + bot.chat("I don't see that block nearby.") + return + } + + const targets = bot.collectBlock.findFromVein(block) + try { + await bot.collectBlock.collect(targets) + // All blocks have been collected. + bot.chat('Done') + } catch (err) { + // An error occurred, report it. + bot.chat(err.message) + console.log(err) + } +}) diff --git a/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/examples/storageBot.js b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/examples/storageBot.js new file mode 100644 index 000000000..b6f9971f2 --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/examples/storageBot.js @@ -0,0 +1,107 @@ +/** + * This bot example shows how to use the chest filling mechanic of the plugin. + * Simply provide a given storage chest, and the bot will automatically try and + * store it's inventory in that chest when the bot's inventory becomes full. + */ + +if (process.argv.length < 4 || process.argv.length > 6) { + console.log('Usage : node storageBot.js [] []') + process.exit(1) +} + +// Load your libraries +const mineflayer = require('mineflayer') +const collectBlock = require('mineflayer-collectblock').plugin + +// Create your bot +const bot = mineflayer.createBot({ + host: process.argv[2], + port: parseInt(process.argv[3]), + username: process.argv[4] ? process.argv[4] : 'storageBot', + password: process.argv[5] +}) + +// Load the collect block plugin +bot.loadPlugin(collectBlock) + +// Load mcData on login +let mcData +bot.once('login', () => { + mcData = require('minecraft-data')(bot.version) +}) + +// On spawn, try to find any nearby chests and save those as storage locations. +// When the bot's inventory becomes too full, it will empty it's inventory into +// these chests before collecting more resources. If a chest gets full, it moves +// to the next one in order until it's inventory is empty or it runs out of chests. +bot.once('spawn', () => { + bot.collectBlock.chestLocations = bot.findBlocks({ + matching: mcData.blocksByName.chest.id, + maxDistance: 16, + count: 999999 // Get as many chests as we can + }) + + if (bot.collectBlock.chestLocations.length === 0) { + bot.chat("I don't see any chests nearby.") + } else { + for (const chestPos of bot.collectBlock.chestLocations) { + bot.chat(`I found a chest at ${chestPos}`) + } + } +}) + +// Wait for someone to say something +bot.on('chat', async (username, message) => { + // If the player says something start starts with "collect" + // Otherwise, do nothing + const args = message.split(' ') + if (args[0] !== 'collect') return + + // If the player specifies a number, collect that many. Otherwise, default to 1. + let count = 1 + if (args.length === 3) count = parseInt(args[1]) + + // If a number was given the item number is the 3rd arg, not the 2nd. + let type = args[1] + if (args.length === 3) type = args[2] + + // Get the id of that block type for this version of Minecraft. + const blockType = mcData.blocksByName[type] + if (!blockType) { + bot.chat(`I don't know any blocks named ${type}.`) + return + } + + // Find all nearby blocks of that type, up to the given count, within 64 blocks. + const blocks = bot.findBlocks({ + matching: blockType.id, + maxDistance: 64, + count: count + }) + + // Complain if we can't find any nearby blocks of that type. + if (blocks.length === 0) { + bot.chat("I don't see that block nearby.") + return + } + + // Convert the block position array into a block array to pass to collect block. + const targets = [] + for (let i = 0; i < Math.min(blocks.length, count); i++) { + targets.push(bot.blockAt(blocks[i])) + } + + // Announce what we found. + bot.chat(`Found ${targets.length} ${type}(s)`) + + // Tell the bot to collect all of the given blocks in the block list. + try { + await bot.collectBlock.collect(targets) + // All blocks have been collected. + bot.chat('Done') + } catch (err) { + // An error occurred, report it. + bot.chat(err.message) + console.log(err) + } +}) diff --git a/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/package.json b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/package.json new file mode 100644 index 000000000..0f59e7aa6 --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/package.json @@ -0,0 +1,44 @@ +{ + "name": "mineflayer-collectblock", + "version": "1.4.1", + "description": "A simple utility plugin for Mineflayer that add a higher level API for collecting blocks.", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "scripts": { + "build": "ts-standard && tsc && require-self", + "clean": "rm -rf lib", + "test": "test" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/TheDudeFromCI/mineflayer-collectblock.git" + }, + "keywords": [ + "mineflayer", + "plugin", + "api", + "utility", + "helper", + "collect" + ], + "author": "TheDudeFromCI", + "license": "MIT", + "bugs": { + "url": "https://github.com/TheDudeFromCI/mineflayer-collectblock/issues" + }, + "homepage": "https://github.com/TheDudeFromCI/mineflayer-collectblock#readme", + "dependencies": { + "mineflayer": "^4.0.0", + "mineflayer-pathfinder": "^2.1.1", + "mineflayer-tool": "^1.1.0" + }, + "devDependencies": { + "@types/node": "^18.6.4", + "require-self": "^0.2.3", + "ts-standard": "^11.0.0", + "typescript": "^4.1.3" + }, + "files": [ + "lib/**/*" + ] +} diff --git a/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/BlockVeins.ts b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/BlockVeins.ts new file mode 100644 index 000000000..ae5542ce3 --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/BlockVeins.ts @@ -0,0 +1,35 @@ +import { Bot } from 'mineflayer' +import { Block } from 'prismarine-block' + +export function findFromVein (bot: Bot, block: Block, maxBlocks: number, maxDistance: number, floodRadius: number): Block[] { + const targets: Block[] = [] + const open: Block[] = [block] + const type = block.type + const center = block.position + + for (let i = 0; i < maxBlocks; i++) { + const next = open.pop() + if (next == null) break + + targets.push(next) + + for (let x = -floodRadius; x <= floodRadius; x++) { + for (let y = -floodRadius; y <= floodRadius; y++) { + for (let z = -floodRadius; z <= floodRadius; z++) { + const neighborPos = next.position.offset(x, y, z) + if (neighborPos.manhattanDistanceTo(center) > maxDistance) continue + + const neighbor = bot.blockAt(neighborPos) + if (neighbor == null || neighbor.type !== type) continue + + if (targets.includes(neighbor)) continue + if (open.includes(neighbor)) continue + + open.push(neighbor) + } + } + } + } + + return targets +} diff --git a/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/CollectBlock.ts b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/CollectBlock.ts new file mode 100644 index 000000000..d2be87822 --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/CollectBlock.ts @@ -0,0 +1,451 @@ +import { Bot } from "mineflayer"; +import { Block } from "prismarine-block"; +import { Movements, goals } from "mineflayer-pathfinder"; +import { TemporarySubscriber } from "./TemporarySubscriber"; +import { Entity } from "prismarine-entity"; +import { error } from "./Util"; +import { Vec3 } from "vec3"; +import { emptyInventoryIfFull, ItemFilter } from "./Inventory"; +import { findFromVein } from "./BlockVeins"; +import { Collectable, Targets } from "./Targets"; +import { Item } from "prismarine-item"; +import mcDataLoader from "minecraft-data"; +import { once } from "events"; +import { callbackify } from "util"; + +export type Callback = (err?: Error) => void; + +async function collectAll( + bot: Bot, + options: CollectOptionsFull +): Promise { + let success_count = 0; + while (!options.targets.empty) { + await emptyInventoryIfFull( + bot, + options.chestLocations, + options.itemFilter + ); + const closest = options.targets.getClosest(); + if (closest == null) break; + switch (closest.constructor.name) { + case "Block": { + try { + if (success_count >= options.count) { + break; + } + await bot.tool.equipForBlock( + closest as Block, + equipToolOptions + ); + const goal = new goals.GoalLookAtBlock( + closest.position, + bot.world + ); + await bot.pathfinder.goto(goal); + await mineBlock(bot, closest as Block, options); + success_count++; + // TODO: options.ignoreNoPath + } catch (err) { + // @ts-ignore + // console.log(err.stack) + // bot.pathfinder.stop() + // bot.waitForTicks(10) + try { + bot.pathfinder.setGoal(null); + } catch (err) {} + if (options.ignoreNoPath) { + // @ts-ignore + if (err.name === "Invalid block") { + console.log( + `Block ${closest.name} at ${closest.position} is not valid! Skip it!` + ); + } // @ts-ignore + else if (err.name === "Unsafe block") { + console.log( + `${closest.name} at ${closest.position} is not safe to break! Skip it!` + ); + // @ts-ignore + } else if (err.name === "NoItem") { + const properties = + bot.registry.blocksByName[closest.name]; + const leastTool = Object.keys( + properties.harvestTools + )[0]; + const item = bot.registry.items[leastTool]; + bot.chat( + `I need at least a ${item.name} to mine ${closest.name}! Skip it!` + ); + return; + } else if ( + // @ts-ignore + err.name === "NoPath" || + // @ts-ignore + err.name === "Timeout" + ) { + if ( + bot.entity.position.distanceTo( + closest.position + ) < 0.5 + ) { + await mineBlock(bot, closest as Block, options); + break; + } + console.log( + `No path to ${closest.name} at ${closest.position}! Skip it!` + ); + // @ts-ignore + } else if (err.message === "Digging aborted") { + console.log(`Digging aborted! Skip it!`); + } else { + // @ts-ignore + bot.chat(`Error: ${err.message}`); + } + break; + } + throw err; + } + break; + } + case "Entity": { + // Don't collect any entities that are marked as 'invalid' + if (!(closest as Entity).isValid) break; + try { + const tempEvents = new TemporarySubscriber(bot); + const waitForPickup = new Promise( + (resolve, reject) => { + const timeout = setTimeout(() => { + // After 10 seconds, reject the promise + clearTimeout(timeout); + tempEvents.cleanup(); + reject(new Error("Failed to pickup item")); + }, 10000); + tempEvents.subscribeTo( + "entityGone", + (entity: Entity) => { + if (entity === closest) { + clearTimeout(timeout); + tempEvents.cleanup(); + resolve(); + } + } + ); + } + ); + bot.pathfinder.setGoal( + new goals.GoalFollow(closest as Entity, 0) + ); + // await bot.pathfinder.goto(new goals.GoalBlock(closest.position.x, closest.position.y, closest.position.z)) + await waitForPickup; + } catch (err) { + // @ts-ignore + console.log(err.stack); + try { + bot.pathfinder.setGoal(null); + } catch (err) {} + if (options.ignoreNoPath) { + // @ts-ignore + if (err.message === "Failed to pickup item") { + bot.chat(`Failed to pickup item! Skip it!`); + } + break; + } + throw err; + } + break; + } + default: { + throw error( + "UnknownType", + `Target ${closest.constructor.name} is not a Block or Entity!` + ); + } + } + options.targets.removeTarget(closest); + } + bot.chat(`Collect finish!`); +} + +const equipToolOptions = { + requireHarvest: true, + getFromChest: false, + maxTools: 2, +}; + +async function mineBlock( + bot: Bot, + block: Block, + options: CollectOptionsFull +): Promise { + if ( + bot.blockAt(block.position)?.type !== block.type || + bot.blockAt(block.position)?.type === 0 + ) { + options.targets.removeTarget(block); + throw error("Invalid block", "Block is not valid!"); + // @ts-expect-error + } else if (!bot.pathfinder.movements.safeToBreak(block)) { + options.targets.removeTarget(block); + throw error("Unsafe block", "Block is not safe to break!"); + } + + await bot.tool.equipForBlock(block, equipToolOptions); + + if (!block.canHarvest(bot.heldItem ? bot.heldItem.type : bot.heldItem)) { + options.targets.removeTarget(block); + throw error("NoItem", "Bot does not have a harvestable tool!"); + } + + const tempEvents = new TemporarySubscriber(bot); + tempEvents.subscribeTo("itemDrop", (entity: Entity) => { + if ( + entity.position.distanceTo(block.position.offset(0.5, 0.5, 0.5)) <= + 0.5 + ) { + options.targets.appendTarget(entity); + } + }); + try { + await bot.dig(block); + // Waiting for items to drop + await new Promise((resolve) => { + let remainingTicks = 10; + tempEvents.subscribeTo("physicTick", () => { + remainingTicks--; + if (remainingTicks <= 0) { + tempEvents.cleanup(); + resolve(); + } + }); + }); + } finally { + tempEvents.cleanup(); + } +} + +/** + * A set of options to apply when collecting the given targets. + */ +export interface CollectOptions { + /** + * If true, the target(s) will be appended to the existing target list instead of + * starting a new task. Defaults to false. + */ + append?: boolean; + + /** + * If true, errors will not be thrown when a path to the target block cannot + * be found. The bot will attempt to choose the best available position it + * can find, instead. Errors are still thrown if the bot cannot interact with + * the block from it's final location. Defaults to false. + */ + ignoreNoPath?: boolean; + + /** + * Gets the list of chest locations to use when storing items after the bot's + * inventory becomes full. If undefined, it defaults to the chest location + * list on the bot.collectBlock plugin. + */ + chestLocations?: Vec3[]; + + /** + * When transferring items to a chest, this filter is used to determine what + * items are allowed to be moved, and what items aren't allowed to be moved. + * Defaults to the item filter specified on the bot.collectBlock plugin. + */ + itemFilter?: ItemFilter; + + /** + * The total number of items to collect + */ + count?: number; +} + +/** + * A version of collect options where all values are assigned. + */ +interface CollectOptionsFull { + append: boolean; + ignoreNoPath: boolean; + chestLocations: Vec3[]; + itemFilter: ItemFilter; + targets: Targets; + count: number; +} + +/** + * The collect block plugin. + */ +export class CollectBlock { + /** + * The bot. + */ + private readonly bot: Bot; + + /** + * The list of active targets being collected. + */ + private readonly targets: Targets; + + /** + * The movements configuration to be sent to the pathfinder plugin. + */ + movements?: Movements; + + /** + * A list of chest locations which the bot is allowed to empty their inventory into + * if it becomes full while the bot is collecting resources. + */ + chestLocations: Vec3[] = []; + + /** + * When collecting items, this filter is used to determine what items should be placed + * into a chest if the bot's inventory becomes full. By default, returns true for all + * items except for tools, weapons, and armor. + * + * @param item - The item stack in the bot's inventory to check. + * + * @returns True if the item should be moved into the chest. False otherwise. + */ + itemFilter: ItemFilter = (item: Item) => { + if (item.name.includes("helmet")) return false; + if (item.name.includes("chestplate")) return false; + if (item.name.includes("leggings")) return false; + if (item.name.includes("boots")) return false; + if (item.name.includes("shield")) return false; + if (item.name.includes("sword")) return false; + if (item.name.includes("pickaxe")) return false; + if (item.name.includes("axe")) return false; + if (item.name.includes("shovel")) return false; + if (item.name.includes("hoe")) return false; + return true; + }; + + /** + * Creates a new instance of the create block plugin. + * + * @param bot - The bot this plugin is acting on. + */ + constructor(bot: Bot) { + this.bot = bot; + this.targets = new Targets(bot); + // @ts-ignore + this.movements = new Movements(bot, mcDataLoader(bot.version)); + } + + /** + * If target is a block: + * Causes the bot to break and collect the target block. + * + * If target is an item drop: + * Causes the bot to collect the item drop. + * + * If target is an array containing items or blocks, preforms the correct action for + * all targets in that array sorting dynamically by distance. + * + * @param target - The block(s) or item(s) to collect. + * @param options - The set of options to use when handling these targets + * @param cb - The callback that is called finished. + */ + async collect( + target: Collectable | Collectable[], + options: CollectOptions | Callback = {}, + cb?: Callback + ): Promise { + if (typeof options === "function") { + cb = options; + options = {}; + } + // @ts-expect-error + if (cb != null) return callbackify(this.collect)(target, options, cb); + + const optionsFull: CollectOptionsFull = { + append: options.append ?? false, + ignoreNoPath: options.ignoreNoPath ?? false, + chestLocations: options.chestLocations ?? this.chestLocations, + itemFilter: options.itemFilter ?? this.itemFilter, + targets: this.targets, + count: options.count ?? Infinity, + }; + + if (this.bot.pathfinder == null) { + throw error( + "UnresolvedDependency", + "The mineflayer-collectblock plugin relies on the mineflayer-pathfinder plugin to run!" + ); + } + + if (this.bot.tool == null) { + throw error( + "UnresolvedDependency", + "The mineflayer-collectblock plugin relies on the mineflayer-tool plugin to run!" + ); + } + + if (this.movements != null) { + this.bot.pathfinder.setMovements(this.movements); + } + + if (!optionsFull.append) await this.cancelTask(); + if (Array.isArray(target)) { + this.targets.appendTargets(target); + } else { + this.targets.appendTarget(target); + } + + try { + await collectAll(this.bot, optionsFull); + this.targets.clear(); + } catch (err) { + this.targets.clear(); + // Ignore path stopped error for cancelTask to work properly (imo we shouldn't throw any pathing errors) + // @ts-expect-error + if (err.name !== "PathStopped") throw err; + } finally { + // @ts-expect-error + this.bot.emit("collectBlock_finished"); + } + } + + /** + * Loads all touching blocks of the same type to the given block and returns them as an array. + * This effectively acts as a flood fill algorithm to retrieve blocks in the same ore vein and similar. + * + * @param block - The starting block. + * @param maxBlocks - The maximum number of blocks to look for before stopping. + * @param maxDistance - The max distance from the starting block to look. + * @param floodRadius - The max distance distance from block A to block B to be considered "touching" + */ + findFromVein( + block: Block, + maxBlocks = 100, + maxDistance = 16, + floodRadius = 1 + ): Block[] { + return findFromVein( + this.bot, + block, + maxBlocks, + maxDistance, + floodRadius + ); + } + + /** + * Cancels the current collection task, if still active. + * + * @param cb - The callback to use when the task is stopped. + */ + async cancelTask(cb?: Callback): Promise { + if (this.targets.empty) { + if (cb != null) cb(); + return await Promise.resolve(); + } + this.bot.pathfinder.stop(); + if (cb != null) { + // @ts-expect-error + this.bot.once("collectBlock_finished", cb); + } + await once(this.bot, "collectBlock_finished"); + } +} diff --git a/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/Inventory.ts b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/Inventory.ts new file mode 100644 index 000000000..6a17d0cc5 --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/Inventory.ts @@ -0,0 +1,87 @@ +import { Bot } from 'mineflayer' +import { Callback } from './CollectBlock' +import { Vec3 } from 'vec3' +import { error } from './Util' +import { Item } from 'prismarine-item' +import { goals } from 'mineflayer-pathfinder' +import { callbackify } from 'util' + +export type ItemFilter = (item: Item) => boolean + +function getClosestChest (bot: Bot, chestLocations: Vec3[]): Vec3 | null { + let chest = null + let distance = 0 + + for (const c of chestLocations) { + const dist = c.distanceTo(bot.entity.position) + if (chest == null || dist < distance) { + chest = c + distance = dist + } + } + + if (chest != null) { + chestLocations.splice(chestLocations.indexOf(chest), 1) + } + + return chest +} + +export async function emptyInventoryIfFull (bot: Bot, chestLocations: Vec3[], itemFilter: ItemFilter, cb?: Callback): Promise { + // @ts-expect-error + if (cb != null) return callbackify(emptyInventoryIfFull)(bot, chestLocations, cb) + if (bot.inventory.emptySlotCount() > 0) return + return await emptyInventory(bot, chestLocations, itemFilter) +} + +export async function emptyInventory (bot: Bot, chestLocations: Vec3[], itemFilter: ItemFilter, cb?: Callback): Promise { + // @ts-expect-error + if (cb != null) return callbackify(emptyInventory)(bot, chestLocations, cb) + if (chestLocations.length === 0) { + throw error('NoChests', 'There are no defined chest locations!') + } + + // Shallow clone so we can safely remove chests from the list that are full. + chestLocations = [...chestLocations] + + while (true) { + const chest = getClosestChest(bot, chestLocations) + if (chest == null) { + throw error('NoChests', 'All chests are full.') + } + const hasRemaining = await tryEmptyInventory(bot, chest, itemFilter) + if (!hasRemaining) return + } +} + +async function tryEmptyInventory (bot: Bot, chestLocation: Vec3, itemFilter: ItemFilter, cb?: (err: Error | undefined, hasRemaining: boolean) => void): Promise { + // @ts-expect-error + if (cb != null) return callbackify(tryEmptyInventory)(bot, chestLocation, itemFilter, cb) + await gotoChest(bot, chestLocation) + return await placeItems(bot, chestLocation, itemFilter) +} + +async function gotoChest (bot: Bot, location: Vec3, cb?: Callback): Promise { + // @ts-expect-error + if (cb != null) return callbackify(gotoChest)(bot, location) + await bot.pathfinder.goto(new goals.GoalGetToBlock(location.x, location.y, location.z)) +} + +async function placeItems (bot: Bot, chestPos: Vec3, itemFilter: ItemFilter, cb?: (err: Error | undefined, hasRemaining: boolean) => void): Promise { + // @ts-expect-error + if (cb != null) return callbackify(placeItems)(bot, chestPos, itemFilter, cb) + const chestBlock = bot.blockAt(chestPos) + if (chestBlock == null) { + throw error('UnloadedChunk', 'Chest is in an unloaded chunk!') + } + const chest = await bot.openChest(chestBlock) + for (const item of bot.inventory.items()) { + if (!itemFilter(item)) continue + if (chest.firstEmptyContainerSlot() === null) { + // We have items that didn't fit. + return true + } + await chest.deposit(item.type, item.metadata, item.count) + } + return false +} diff --git a/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/Targets.ts b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/Targets.ts new file mode 100644 index 000000000..568d07ad9 --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/Targets.ts @@ -0,0 +1,60 @@ +import { Bot } from 'mineflayer' +import { Block } from 'prismarine-block' +import { Entity } from 'prismarine-entity' + +export type Collectable = Block | Entity + +export class Targets { + private readonly bot: Bot + private targets: Collectable[] = [] + + constructor (bot: Bot) { + this.bot = bot + } + + appendTargets (targets: Collectable[]): void { + for (const target of targets) { + this.appendTarget(target) + } + } + + appendTarget (target: Collectable): void { + if (this.targets.includes(target)) return + this.targets.push(target) + } + + /** + * Gets the closest target to the bot in this list. + * + * @returns The closest target, or null if there are no targets. + */ + getClosest (): Collectable | null { + let closest: Collectable | null = null + let distance: number = 0 + + for (const target of this.targets) { + const dist = target.position.distanceTo(this.bot.entity.position) + + if (closest == null || dist < distance) { + closest = target + distance = dist + } + } + + return closest + } + + get empty (): boolean { + return this.targets.length === 0 + } + + clear (): void { + this.targets.length = 0 + } + + removeTarget (target: Collectable): void { + const index = this.targets.indexOf(target) + if (index < 0) return + this.targets.splice(index, 1) + } +} diff --git a/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/TaskQueue.ts b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/TaskQueue.ts new file mode 100644 index 000000000..81fe3bc5a --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/TaskQueue.ts @@ -0,0 +1,77 @@ +import type { Callback } from './index' +export type Task = (cb: Callback) => void +export type SyncTask = () => void + +/** + * A simple utility class for queuing up a series of async tasks to execute. + */ +export class TaskQueue { + private tasks: Task[] = [] + + /** + * If true, the task list will stop executing if one of the tasks throws an error. + */ + readonly stopOnError: boolean = true + + /** + * Adds a new async task to this queue. The provided callback should be executed when + * the async task is complete. + * + * @param task - The async task to add. + */ + add (task: Task): void { + this.tasks.push(task) + } + + /** + * Adds a synchronous task toi this queue. + * + * @param task - The sync task to add. + */ + addSync (task: SyncTask): void { + this.add((cb) => { + try { + task() + cb() + } catch (err: any) { + cb(err) + } + }) + } + + /** + * Runs all tasks currently in this queue and empties the queue. + * + * @param cb - The optional callback to be executed when all tasks in this queue have + * finished executing. + */ + runAll (cb?: Callback): void { + const taskList = this.tasks + this.tasks = [] + + let index = -1 + const runNext: () => void = () => { + index++ + if (index >= taskList.length) { + if (cb !== undefined) cb() + return + } + + try { + taskList[index]((err) => { + if (err !== undefined) { + if (cb !== undefined) cb(err) + + if (this.stopOnError) return + } + + runNext() + }) + } catch (err: any) { + if (cb !== undefined) cb(err) + } + } + + runNext() + } +} diff --git a/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/TemporarySubscriber.ts b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/TemporarySubscriber.ts new file mode 100644 index 000000000..3f14a607d --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/TemporarySubscriber.ts @@ -0,0 +1,34 @@ +import { Bot } from 'mineflayer' + +class Subscription { + constructor (readonly eventName: string, readonly callback: Function) {} +} + +export class TemporarySubscriber { + private readonly subscriptions: Subscription[] = [] + + constructor (readonly bot: Bot) {} + + /** + * Adds a new temporary event listener to the bot. + * + * @param event - The event to subscribe to. + * @param callback - The function to execute. + */ + subscribeTo (event: string, callback: Function): void { + this.subscriptions.push(new Subscription(event, callback)) + + // @ts-expect-error + this.bot.on(event, callback) + } + + /** + * Removes all attached event listeners from the bot. + */ + cleanup (): void { + for (const sub of this.subscriptions) { + // @ts-expect-error + this.bot.removeListener(sub.eventName, sub.callback) + } + } +} diff --git a/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/Util.ts b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/Util.ts new file mode 100644 index 000000000..ee0f29e0c --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/Util.ts @@ -0,0 +1,13 @@ +/** + * Creates a new error object with the given type and message. + * + * @param type - The error type. + * @param message - The error message. + * + * @returns The error object. + */ +export function error (type: string, message: string): Error { + const e = new Error(message) + e.name = type + return e +} diff --git a/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/index.ts b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/index.ts new file mode 100644 index 000000000..45c9a8508 --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/src/index.ts @@ -0,0 +1,25 @@ +import { Bot } from 'mineflayer' +import { CollectBlock } from './CollectBlock' +import { pathfinder as pathfinderPlugin } from 'mineflayer-pathfinder' +import { plugin as toolPlugin } from 'mineflayer-tool' + +export function plugin (bot: Bot): void { + // @ts-expect-error + bot.collectBlock = new CollectBlock(bot) + + // Load plugins if not loaded manually. + setTimeout(() => loadPathfinderPlugin(bot), 0) + setTimeout(() => loadToolPlugin(bot), 0) +} + +function loadPathfinderPlugin (bot: Bot): void { + if (bot.pathfinder != null) return + bot.loadPlugin(pathfinderPlugin) +} + +function loadToolPlugin (bot: Bot): void { + if (bot.tool != null) return + bot.loadPlugin(toolPlugin) +} + +export { CollectBlock, Callback, CollectOptions } from './CollectBlock' diff --git a/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/tsconfig.json b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/tsconfig.json new file mode 100644 index 000000000..a6076bc0c --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/mineflayer-collectblock/tsconfig.json @@ -0,0 +1,69 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "ES2015", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + // "lib": [], /* Specify library files to be included in the compilation. */ + "allowJs": true, /* Allow javascript files to be compiled. */ + "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + "declaration": true, + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "./lib", + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + /* Additional Checks */ + "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + /* Advanced Options */ + "skipLibCheck": true, /* Skip type checking of declaration files. */ + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + }, + "include": [ + "src" + ], + "exclude": [ + "node_modules", + "**/__tests__/*" + ] +} \ No newline at end of file diff --git a/metagpt/mineflayer_env/mineflayer/package.json b/metagpt/mineflayer_env/mineflayer/package.json new file mode 100644 index 000000000..9e389d268 --- /dev/null +++ b/metagpt/mineflayer_env/mineflayer/package.json @@ -0,0 +1,38 @@ +{ + "name": "voyager", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "body-parser": "^1.20.2", + "express": "^4.18.2", + "magic-string": "^0.30.0", + "minecraft-data": "^3.31.0", + "minecrafthawkeye": "^1.3.6", + "mineflayer": "^4.8.1", + "mineflayer-collectblock": "file:mineflayer-collectblock", + "mineflayer-pathfinder": "^2.4.2", + "mineflayer-pvp": "^1.3.2", + "mineflayer-tool": "^1.2.0", + "mocha": "^10.2.0", + "prismarine-biome": "^1.3.0", + "prismarine-block": "=1.16.3", + "prismarine-entity": "^2.2.0", + "prismarine-item": "^1.12.1", + "prismarine-nbt": "^2.2.1", + "prismarine-recipe": "^1.3.1", + "prismarine-viewer": "^1.24.0", + "typescript": "^4.9.5", + "vec3": "^0.1.8", + "graceful-fs": "^4.2.11" + }, + "devDependencies": { + "prettier": "2.8.5" + } +} diff --git a/metagpt/utils/minecraft/__init__.py b/metagpt/utils/minecraft/__init__.py index b6d3ec8fd..4c7624d55 100644 --- a/metagpt/utils/minecraft/__init__.py +++ b/metagpt/utils/minecraft/__init__.py @@ -2,3 +2,6 @@ # @Date : 2023/9/24 0:32 # @Author : stellahong (stellahong@fuzhi.ai) # @Desc : +from .load_prompts import load_prompt +from .json_utils import * +from .file_utils import * \ No newline at end of file diff --git a/metagpt/utils/minecraft/file_utils.py b/metagpt/utils/minecraft/file_utils.py new file mode 100644 index 000000000..c92f08f55 --- /dev/null +++ b/metagpt/utils/minecraft/file_utils.py @@ -0,0 +1,569 @@ +# -*- coding: utf-8 -*- +# @Date : 2023/09/25 16:13 +# @Author : yuymf +# @Desc : Temp Using :File system utils.@ https://github.com/MineDojo/Voyager/blob/main/voyager/utils/file_utils.py +import collections +import os +import pickle +import sys +import errno +import shutil +import glob + +# import pwd +import codecs +import hashlib +import tarfile +import fnmatch +import tempfile +from datetime import datetime +from socket import gethostname +import logging + + +f_ext = os.path.splitext + +f_size = os.path.getsize + +is_file = os.path.isfile + +is_dir = os.path.isdir + +get_dir = os.path.dirname + + +def host_name(): + "Get host name, alias with ``socket.gethostname()``" + return gethostname() + + +def host_id(): + """ + Returns: first part of hostname up to '.' + """ + return host_name().split(".")[0] + + +def utf_open(fname, mode): + """ + Wrapper for codecs.open + """ + return codecs.open(fname, mode=mode, encoding="utf-8") + + +def is_sequence(obj): + """ + Returns: + True if the sequence is a collections.Sequence and not a string. + """ + return isinstance(obj, collections.abc.Sequence) and not isinstance(obj, str) + + +def pack_varargs(args): + """ + Pack *args or a single list arg as list + + def f(*args): + arg_list = pack_varargs(args) + # arg_list is now packed as a list + """ + assert isinstance(args, tuple), "please input the tuple `args` as in *args" + if len(args) == 1 and is_sequence(args[0]): + return args[0] + else: + return args + + +def f_not_empty(*fpaths): + """ + Returns: + True if and only if the file exists and file size > 0 + if fpath is a dir, if and only if dir exists and has at least 1 file + """ + fpath = f_join(*fpaths) + if not os.path.exists(fpath): + return False + + if os.path.isdir(fpath): + return len(os.listdir(fpath)) > 0 + else: + return os.path.getsize(fpath) > 0 + + +def f_expand(fpath): + return os.path.expandvars(os.path.expanduser(fpath)) + + +def f_exists(*fpaths): + return os.path.exists(f_join(*fpaths)) + + +def f_join(*fpaths): + """ + join file paths and expand special symbols like `~` for home dir + """ + fpaths = pack_varargs(fpaths) + fpath = f_expand(os.path.join(*fpaths)) + if isinstance(fpath, str): + fpath = fpath.strip() + return fpath + + +def f_listdir( + *fpaths, + filter_ext=None, + filter=None, + sort=True, + full_path=False, + nonexist_ok=True, + recursive=False, +): + """ + Args: + full_path: True to return full paths to the dir contents + filter: function that takes in file name and returns True to include + nonexist_ok: True to return [] if the dir is non-existent, False to raise + sort: sort the file names by alphabetical + recursive: True to use os.walk to recursively list files. Note that `filter` + will be applied to the relative path string to the root dir. + e.g. filter will take "a/data1.txt" and "a/b/data3.txt" as input, instead of + just the base file names "data1.txt" and "data3.txt". + if False, will simply call os.listdir() + """ + assert not (filter_ext and filter), "filter_ext and filter are mutually exclusive" + dir_path = f_join(*fpaths) + if not os.path.exists(dir_path) and nonexist_ok: + return [] + if recursive: + files = [ + os.path.join(os.path.relpath(root, dir_path), file) + for root, _, files in os.walk(dir_path) + for file in files + ] + else: + files = os.listdir(dir_path) + if filter is not None: + files = [f for f in files if filter(f)] + elif filter_ext is not None: + files = [f for f in files if f.endswith(filter_ext)] + if sort: + files.sort() + if full_path: + return [os.path.join(dir_path, f) for f in files] + else: + return files + + +def f_mkdir(*fpaths): + """ + Recursively creates all the subdirs + If exist, do nothing. + """ + fpath = f_join(*fpaths) + os.makedirs(fpath, exist_ok=True) + return fpath + + +def f_mkdir_in_path(*fpaths): + """ + fpath is a file, + recursively creates all the parent dirs that lead to the file + If exist, do nothing. + """ + os.makedirs(get_dir(f_join(*fpaths)), exist_ok=True) + + +def last_part_in_path(fpath): + """ + https://stackoverflow.com/questions/3925096/how-to-get-only-the-last-part-of-a-path-in-python + """ + return os.path.basename(os.path.normpath(f_expand(fpath))) + + +def is_abs_path(*fpath): + return os.path.isabs(f_join(*fpath)) + + +def is_relative_path(*fpath): + return not is_abs_path(f_join(*fpath)) + + +def f_time(*fpath): + "File modification time" + return str(os.path.getctime(f_join(*fpath))) + + +def f_append_before_ext(fpath, suffix): + """ + Append a suffix to file name and retain its extension + """ + name, ext = f_ext(fpath) + return name + suffix + ext + + +def f_add_ext(fpath, ext): + """ + Append an extension if not already there + Args: + ext: will add a preceding `.` if doesn't exist + """ + if not ext.startswith("."): + ext = "." + ext + if fpath.endswith(ext): + return fpath + else: + return fpath + ext + + +def f_has_ext(fpath, ext): + "Test if file path is a text file" + _, actual_ext = f_ext(fpath) + return actual_ext == "." + ext.lstrip(".") + + +def f_glob(*fpath): + return glob.glob(f_join(*fpath), recursive=True) + + +def f_remove(*fpath, verbose=False, dry_run=False): + """ + If exist, remove. Supports both dir and file. Supports glob wildcard. + """ + assert isinstance(verbose, bool) + fpath = f_join(fpath) + if dry_run: + print("Dry run, delete:", fpath) + return + for f in glob.glob(fpath): + try: + shutil.rmtree(f) + except OSError as e: + if e.errno == errno.ENOTDIR: + try: + os.remove(f) + except: # final resort safeguard + pass + if verbose: + print(f'Deleted "{fpath}"') + + +def f_copy(fsrc, fdst, ignore=None, include=None, exists_ok=True, verbose=False): + """ + Supports both dir and file. Supports glob wildcard. + """ + fsrc, fdst = f_expand(fsrc), f_expand(fdst) + for f in glob.glob(fsrc): + try: + f_copytree(f, fdst, ignore=ignore, include=include, exist_ok=exists_ok) + except OSError as e: + if e.errno == errno.ENOTDIR: + shutil.copy(f, fdst) + else: + raise + if verbose: + print(f'Copied "{fsrc}" to "{fdst}"') + + +def _f_copytree( + src, + dst, + symlinks=False, + ignore=None, + exist_ok=True, + copy_function=shutil.copy2, + ignore_dangling_symlinks=False, +): + """Copied from python standard lib shutil.copytree + except that we allow exist_ok + Use f_copytree as entry + """ + names = os.listdir(src) + if ignore is not None: + ignored_names = ignore(src, names) + else: + ignored_names = set() + + os.makedirs(dst, exist_ok=exist_ok) + errors = [] + for name in names: + if name in ignored_names: + continue + srcname = os.path.join(src, name) + dstname = os.path.join(dst, name) + try: + if os.path.islink(srcname): + linkto = os.readlink(srcname) + if symlinks: + # We can't just leave it to `copy_function` because legacy + # code with a custom `copy_function` may rely on copytree + # doing the right thing. + os.symlink(linkto, dstname) + shutil.copystat(srcname, dstname, follow_symlinks=not symlinks) + else: + # ignore dangling symlink if the flag is on + if not os.path.exists(linkto) and ignore_dangling_symlinks: + continue + # otherwise let the copy occurs. copy2 will raise an error + if os.path.isdir(srcname): + _f_copytree( + srcname, dstname, symlinks, ignore, exist_ok, copy_function + ) + else: + copy_function(srcname, dstname) + elif os.path.isdir(srcname): + _f_copytree(srcname, dstname, symlinks, ignore, exist_ok, copy_function) + else: + # Will raise a SpecialFileError for unsupported file types + copy_function(srcname, dstname) + # catch the Error from the recursive copytree so that we can + # continue with other files + except shutil.Error as err: + errors.extend(err.args[0]) + except OSError as why: + errors.append((srcname, dstname, str(why))) + try: + shutil.copystat(src, dst) + except OSError as why: + # Copying file access times may fail on Windows + if getattr(why, "winerror", None) is None: + errors.append((src, dst, str(why))) + if errors: + raise shutil.Error(errors) + return dst + + +def _include_patterns(*patterns): + """Factory function that can be used with copytree() ignore parameter. + + Arguments define a sequence of glob-style patterns + that are used to specify what files to NOT ignore. + Creates and returns a function that determines this for each directory + in the file hierarchy rooted at the source directory when used with + shutil.copytree(). + """ + + def _ignore_patterns(path, names): + keep = set( + name for pattern in patterns for name in fnmatch.filter(names, pattern) + ) + ignore = set( + name + for name in names + if name not in keep and not os.path.isdir(os.path.join(path, name)) + ) + return ignore + + return _ignore_patterns + + +def f_copytree(fsrc, fdst, symlinks=False, ignore=None, include=None, exist_ok=True): + fsrc, fdst = f_expand(fsrc), f_expand(fdst) + assert (ignore is None) or ( + include is None + ), "ignore= and include= are mutually exclusive" + if ignore: + ignore = shutil.ignore_patterns(*ignore) + elif include: + ignore = _include_patterns(*include) + _f_copytree(fsrc, fdst, ignore=ignore, symlinks=symlinks, exist_ok=exist_ok) + + +def f_move(fsrc, fdst): + fsrc, fdst = f_expand(fsrc), f_expand(fdst) + for f in glob.glob(fsrc): + shutil.move(f, fdst) + + +def f_split_path(fpath, normpath=True): + """ + Splits path into a list of its component folders + + Args: + normpath: call os.path.normpath to remove redundant '/' and + up-level references like ".." + """ + if normpath: + fpath = os.path.normpath(fpath) + allparts = [] + while 1: + parts = os.path.split(fpath) + if parts[0] == fpath: # sentinel for absolute paths + allparts.insert(0, parts[0]) + break + elif parts[1] == fpath: # sentinel for relative paths + allparts.insert(0, parts[1]) + break + else: + fpath = parts[0] + allparts.insert(0, parts[1]) + return allparts + + +def get_script_dir(): + """ + Returns: the dir of current script + """ + return os.path.dirname(os.path.realpath(sys.argv[0])) + + +def get_script_file_name(): + """ + Returns: the dir of current script + """ + return os.path.basename(sys.argv[0]) + + +def get_script_self_path(): + """ + Returns: the dir of current script + """ + return os.path.realpath(sys.argv[0]) + + +def get_parent_dir(location, abspath=False): + """ + Args: + location: current directory or file + + Returns: + parent directory absolute or relative path + """ + _path = os.path.abspath if abspath else os.path.relpath + return _path(f_join(location, os.pardir)) + + +def md5_checksum(*fpath): + """ + File md5 signature + """ + hash_md5 = hashlib.md5() + with open(f_join(*fpath), "rb") as f: + for chunk in iter(lambda: f.read(65536), b""): + hash_md5.update(chunk) + return hash_md5.hexdigest() + + +def create_tar(fsrc, output_tarball, include=None, ignore=None, compress_mode="gz"): + """ + Args: + fsrc: source file or folder + output_tarball: output tar file name + compress_mode: "gz", "bz2", "xz" or "" (empty for uncompressed write) + include: include pattern, will trigger copy to temp directory + ignore: ignore pattern, will trigger copy to temp directory + """ + fsrc, output_tarball = f_expand(fsrc), f_expand(output_tarball) + assert compress_mode in ["gz", "bz2", "xz", ""] + src_base = os.path.basename(fsrc) + + tempdir = None + if include or ignore: + tempdir = tempfile.mkdtemp() + tempdest = f_join(tempdir, src_base) + f_copy(fsrc, tempdest, include=include, ignore=ignore) + fsrc = tempdest + + with tarfile.open(output_tarball, "w:" + compress_mode) as tar: + tar.add(fsrc, arcname=src_base) + + if tempdir: + f_remove(tempdir) + + +def extract_tar(source_tarball, output_dir=".", members=None): + """ + Args: + source_tarball: extract members from archive + output_dir: default to current working dir + members: must be a subset of the list returned by getmembers() + """ + source_tarball, output_dir = f_expand(source_tarball), f_expand(output_dir) + with tarfile.open(source_tarball, "r:*") as tar: + tar.extractall(output_dir, members=members) + + +def move_with_backup(*fpath, suffix=".bak"): + """ + Ensures that a path is not occupied. If there is a file, rename it by + adding @suffix. Resursively backs up everything. + + Args: + fpath: file path to clear + suffix: Add to backed up files (default: {'.bak'}) + """ + fpath = str(f_join(*fpath)) + if os.path.exists(fpath): + move_with_backup(fpath + suffix) + shutil.move(fpath, fpath + suffix) + + +def insert_before_ext(name, insert): + """ + log.txt -> log.ep50.txt + """ + name, ext = os.path.splitext(name) + return name + insert + ext + + +def timestamp_file_name(fname): + timestr = datetime.now().strftime("_%H-%M-%S_%m-%d-%y") + return insert_before_ext(fname, timestr) + + +def get_file_lock(*fpath, timeout: int = 15, logging_level="critical"): + """ + NFS-safe filesystem-backed lock. `pip install flufl.lock` + https://flufllock.readthedocs.io/en/stable/apiref.html + + Args: + fpath: should be a path on NFS so that every process can see it + timeout: seconds + """ + from flufl.lock import Lock + + logging.getLogger("flufl.lock").setLevel(logging_level.upper()) + return Lock(f_join(*fpath), lifetime=timeout) + + +def load_pickle(*fpaths): + with open(f_join(*fpaths), "rb") as fp: + return pickle.load(fp) + + +def dump_pickle(data, *fpaths): + with open(f_join(*fpaths), "wb") as fp: + pickle.dump(data, fp) + + +def load_text(*fpaths, by_lines=False): + with open(f_join(*fpaths), "r") as fp: + if by_lines: + return fp.readlines() + else: + return fp.read() + + +def load_text_lines(*fpaths): + return load_text(*fpaths, by_lines=True) + + +def dump_text(s, *fpaths): + with open(f_join(*fpaths), "w") as fp: + fp.write(s) + + +def dump_text_lines(lines: list[str], *fpaths, add_newline=True): + with open(f_join(*fpaths), "w") as fp: + for line in lines: + print(line, file=fp, end="\n" if add_newline else "") + + +# aliases to be consistent with other load_* and dump_* +pickle_load = load_pickle +pickle_dump = dump_pickle +text_load = load_text +read_text = load_text +read_text_lines = load_text_lines +write_text = dump_text +write_text_lines = dump_text_lines +text_dump = dump_text diff --git a/metagpt/utils/minecraft/json_utils.py b/metagpt/utils/minecraft/json_utils.py new file mode 100644 index 000000000..55d310bae --- /dev/null +++ b/metagpt/utils/minecraft/json_utils.py @@ -0,0 +1,231 @@ +# -*- coding: utf-8 -*- +# @Date : 2023/09/25 19:27 +# @Author : yuymf +# @Desc : Temp using @https://github.com/MineDojo/Voyager/blob/main/voyager/utils/json_utils.py + +import json +import re +from typing import Any, Dict, Union +from .file_utils import f_join + +def json_load(*file_path, **kwargs): + file_path = f_join(file_path) + with open(file_path, "r") as fp: + return json.load(fp, **kwargs) + + +def json_loads(string, **kwargs): + return json.loads(string, **kwargs) + + +def json_dump(data, *file_path, **kwargs): + file_path = f_join(file_path) + with open(file_path, "w") as fp: + json.dump(data, fp, **kwargs) + + +def json_dumps(data, **kwargs): + """ + Returns: string + """ + return json.dumps(data, **kwargs) + + +# ---------------- Aliases ----------------- +# add aliases where verb goes first, json_load -> load_json +load_json = json_load +loads_json = json_loads +dump_json = json_dump +dumps_json = json_dumps + + +def extract_char_position(error_message: str) -> int: + """Extract the character position from the JSONDecodeError message. + Args: + error_message (str): The error message from the JSONDecodeError + exception. + Returns: + int: The character position. + """ + import re + + char_pattern = re.compile(r"\(char (\d+)\)") + if match := char_pattern.search(error_message): + return int(match[1]) + else: + raise ValueError("Character position not found in the error message.") + + +def add_quotes_to_property_names(json_string: str) -> str: + """ + Add quotes to property names in a JSON string. + Args: + json_string (str): The JSON string. + Returns: + str: The JSON string with quotes added to property names. + """ + + def replace_func(match): + return f'"{match.group(1)}":' + + property_name_pattern = re.compile(r"(\w+):") + corrected_json_string = property_name_pattern.sub(replace_func, json_string) + + try: + json.loads(corrected_json_string) + return corrected_json_string + except json.JSONDecodeError as e: + raise e + + +def balance_braces(json_string: str) -> str: + """ + Balance the braces in a JSON string. + Args: + json_string (str): The JSON string. + Returns: + str: The JSON string with braces balanced. + """ + + open_braces_count = json_string.count("{") + close_braces_count = json_string.count("}") + + while open_braces_count > close_braces_count: + json_string += "}" + close_braces_count += 1 + + while close_braces_count > open_braces_count: + json_string = json_string.rstrip("}") + close_braces_count -= 1 + + try: + json.loads(json_string) + return json_string + except json.JSONDecodeError as e: + raise e + + +def fix_invalid_escape(json_str: str, error_message: str) -> str: + while error_message.startswith("Invalid \\escape"): + bad_escape_location = extract_char_position(error_message) + json_str = json_str[:bad_escape_location] + json_str[bad_escape_location + 1 :] + try: + json.loads(json_str) + return json_str + except json.JSONDecodeError as e: + error_message = str(e) + return json_str + + +def correct_json(json_str: str) -> str: + """ + Correct common JSON errors. + Args: + json_str (str): The JSON string. + """ + + try: + json.loads(json_str) + return json_str + except json.JSONDecodeError as e: + error_message = str(e) + if error_message.startswith("Invalid \\escape"): + json_str = fix_invalid_escape(json_str, error_message) + if error_message.startswith( + "Expecting property name enclosed in double quotes" + ): + json_str = add_quotes_to_property_names(json_str) + try: + json.loads(json_str) + return json_str + except json.JSONDecodeError as e: + error_message = str(e) + if balanced_str := balance_braces(json_str): + return balanced_str + return json_str + + +def fix_and_parse_json( + json_str: str, try_to_fix_with_gpt: bool = True +) -> Union[str, Dict[Any, Any]]: + """Fix and parse JSON string""" + try: + json_str = json_str.replace("\t", "") + return json.loads(json_str) + except json.JSONDecodeError as _: # noqa: F841 + json_str = correct_json(json_str) + try: + return json.loads(json_str) + except json.JSONDecodeError as _: # noqa: F841 + pass + # Let's do something manually: + # sometimes GPT responds with something BEFORE the braces: + # "I'm sorry, I don't understand. Please try again." + # {"text": "I'm sorry, I don't understand. Please try again.", + # "confidence": 0.0} + # So let's try to find the first brace and then parse the rest + # of the string + try: + brace_index = json_str.index("{") + json_str = json_str[brace_index:] + last_brace_index = json_str.rindex("}") + json_str = json_str[: last_brace_index + 1] + return json.loads(json_str) + except json.JSONDecodeError as e: # noqa: F841 + # if try_to_fix_with_gpt: + # print( + # "Warning: Failed to parse AI output, attempting to fix." + # "\n If you see this warning frequently, it's likely that" + # " your prompt is confusing the AI. Try changing it up" + # " slightly." + # ) + # # Now try to fix this up using the ai_functions + # ai_fixed_json = fix_json(json_str, JSON_SCHEMA) + # + # if ai_fixed_json != "failed": + # return json.loads(ai_fixed_json) + # else: + # # This allows the AI to react to the error message, + # # which usually results in it correcting its ways. + # print("Failed to fix ai output, telling the AI.") + # return json_str + # else: + raise e + + +# def fix_json(json_str: str, schema: str) -> str: +# """Fix the given JSON string to make it parseable and fully complient with the provided schema.""" +# +# # Try to fix the JSON using gpt: +# function_string = "def fix_json(json_str: str, schema:str=None) -> str:" +# args = [f"'''{json_str}'''", f"'''{schema}'''"] +# description_string = ( +# "Fixes the provided JSON string to make it parseable" +# " and fully complient with the provided schema.\n If an object or" +# " field specified in the schema isn't contained within the correct" +# " JSON, it is ommited.\n This function is brilliant at guessing" +# " when the format is incorrect." +# ) +# +# # If it doesn't already start with a "`", add one: +# if not json_str.startswith("`"): +# json_str = "```json\n" + json_str + "\n```" +# result_string = call_ai_function( +# function_string, args, description_string, model=cfg.fast_llm_model +# ) +# if cfg.debug: +# print("------------ JSON FIX ATTEMPT ---------------") +# print(f"Original JSON: {json_str}") +# print("-----------") +# print(f"Fixed JSON: {result_string}") +# print("----------- END OF FIX ATTEMPT ----------------") +# +# try: +# json.loads(result_string) # just check the validity +# return result_string +# except: # noqa: E722 +# # Get the call stack: +# # import traceback +# # call_stack = traceback.format_exc() +# # print(f"Failed to fix JSON: '{json_str}' "+call_stack) +# return "failed" diff --git a/metagpt/utils/minecraft/load_prompts.py b/metagpt/utils/minecraft/load_prompts.py index 3af9c6c57..fe7c282b3 100644 --- a/metagpt/utils/minecraft/load_prompts.py +++ b/metagpt/utils/minecraft/load_prompts.py @@ -3,7 +3,8 @@ # @Author : stellahong (stellahong@fuzhi.ai) # @Desc : import pkg_resources - - +from .file_utils import load_text + def load_prompt(prompt): - pass \ No newline at end of file + package_path = pkg_resources.resource_filename("metagpt", "") + return load_text(f"{package_path}/prompts/minecraft/{prompt}.txt") \ No newline at end of file diff --git a/metagpt/utils/minecraft/process_monitor.py b/metagpt/utils/minecraft/process_monitor.py new file mode 100644 index 000000000..d38b20b65 --- /dev/null +++ b/metagpt/utils/minecraft/process_monitor.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- +# @Date : 2023/09/25 16:12 +# @Author : yuymf +# @Desc : Temp using:@https://github.com/MineDojo/Voyager/blob/main/voyager/env/process_monitor.py +import time +import re +import warnings +from typing import List + +import psutil +import subprocess +import logging +import threading + +import metagpt.utils.minecraft as U + + +class SubprocessMonitor: + def __init__( + self, + commands: List[str], + name: str, + ready_match: str = r".*", + log_path: str = "logs", + callback_match: str = r"^(?!x)x$", # regex that will never match + callback: callable = None, + finished_callback: callable = None, + ): + self.commands = commands + start_time = time.strftime("%Y%m%d_%H%M%S") + self.name = name + self.logger = logging.getLogger(name) + handler = logging.FileHandler(U.f_join(log_path, f"{start_time}.log")) + formatter = logging.Formatter( + "%(asctime)s - %(name)s - %(levelname)s - %(message)s" + ) + handler.setFormatter(formatter) + self.logger.addHandler(handler) + self.logger.setLevel(logging.INFO) + self.process = None + self.ready_match = ready_match + self.ready_event = None + self.ready_line = None + self.callback_match = callback_match + self.callback = callback + self.finished_callback = finished_callback + self.thread = None + + def _start(self): + self.logger.info(f"Starting subprocess with commands: {self.commands}") + + self.process = psutil.Popen( + self.commands, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + universal_newlines=True, + ) + print(f"Subprocess {self.name} started with PID {self.process.pid}.") + for line in iter(self.process.stdout.readline, ""): + self.logger.info(line.strip()) + if re.search(self.ready_match, line): + self.ready_line = line + self.logger.info("Subprocess is ready.") + self.ready_event.set() + if re.search(self.callback_match, line): + self.callback() + if not self.ready_event.is_set(): + self.ready_event.set() + warnings.warn(f"Subprocess {self.name} failed to start.") + if self.finished_callback: + self.finished_callback() + + def run(self): + self.ready_event = threading.Event() + self.ready_line = None + self.thread = threading.Thread(target=self._start) + self.thread.start() + self.ready_event.wait() + + def stop(self): + self.logger.info("Stopping subprocess.") + if self.process and self.process.is_running(): + self.process.terminate() + self.process.wait() + + # def __del__(self): + # if self.process.is_running(): + # self.stop() + + @property + def is_running(self): + if self.process is None: + return False + return self.process.is_running() diff --git a/minecraft_run.py b/minecraft_run.py index 65db2b98d..50eada1fc 100644 --- a/minecraft_run.py +++ b/minecraft_run.py @@ -13,6 +13,7 @@ from metagpt.minecraft_team import MinecraftPlayer async def learn(task="Start", investment: float = 50.0, n_round: int = 3): mc_player = MinecraftPlayer() + mc_player.set_port(2253) # Modify this to your LAN port mc_player.hire( [ CurriculumDesigner(), From 4ca8f9b9e5727d1ed4543e145dc15676638be64c Mon Sep 17 00:00:00 2001 From: yuymf <1352948945@qq.com> Date: Mon, 25 Sep 2023 22:23:26 +0800 Subject: [PATCH 2/2] Remove some redundancy & add Quote to bridge --- metagpt/minecraft_team.py | 129 +----- metagpt/mineflayer_environment.py | 127 ++++++ metagpt/utils/minecraft/file_utils.py | 487 +-------------------- metagpt/utils/minecraft/json_utils.py | 66 +-- metagpt/utils/minecraft/process_monitor.py | 4 - 5 files changed, 131 insertions(+), 682 deletions(-) create mode 100644 metagpt/mineflayer_environment.py diff --git a/metagpt/minecraft_team.py b/metagpt/minecraft_team.py index 1c5a72a41..9e99b0cd5 100644 --- a/metagpt/minecraft_team.py +++ b/metagpt/minecraft_team.py @@ -6,8 +6,6 @@ from typing import Iterable, Dict, Any from pydantic import BaseModel, Field import requests import json -import time -import os from metagpt.logs import logger from metagpt.roles import Role @@ -17,123 +15,7 @@ from metagpt.software_company import SoftwareCompany from metagpt.actions.minecraft.player_action import PlayerActions from metagpt.roles.minecraft.minecraft_base import Minecraft from metagpt.environment import Environment -import metagpt.utils.minecraft as U -from metagpt.utils.minecraft.process_monitor import SubprocessMonitor - -class MineflayerEnv: - def __init__( - self, - mc_port=None, - server_host="http://127.0.0.1", - server_port=3000, - request_timeout=600, - ): - self.mc_port = mc_port - self.server = f"{server_host}:{server_port}" - self.server_port = server_port - self.request_timeout = request_timeout - self.mineflayer = self.get_mineflayer_process(server_port) - self.has_reset = False - self.reset_options = None - self.connected = False - self.server_paused = False - - def set_mc_port(self, mc_port): - self.mc_port = mc_port - - def get_mineflayer_process(self, server_port): - U.f_mkdir("./logs", "mineflayer") - file_path = os.path.abspath(os.path.dirname(__file__)) - return SubprocessMonitor( - commands=[ - "node", - U.f_join(file_path, "mineflayer_env/mineflayer/index.js"), - str(server_port), - ], - name="mineflayer", - ready_match=r"Server started on port (\d+)", - log_path=U.f_join("./logs", "mineflayer"), - ) - - def check_process(self): - retry = 0 - while not self.mineflayer.is_running: - logger.info("Mineflayer process has exited, restarting") - self.mineflayer.run() - if not self.mineflayer.is_running: - if retry > 3: - logger.error("Mineflayer process failed to start") - raise {} - else: - retry += 1 - continue - logger.info(self.mineflayer.ready_line) - res = requests.post( - f"{self.server}/start", - json=self.reset_options, - timeout=self.request_timeout, - ) - if res.status_code != 200: - self.mineflayer.stop() - logger.error( - f"Minecraft server reply with code {res.status_code}" - ) - raise {} - return res.json() - - def reset(self, *, seed=None, options=None, ): - if options is None: - options = {} - if options.get("inventory", {}) and options.get("mode", "hard") != "hard": - logger.error("inventory can only be set when options is hard") - raise{} - - self.reset_options = { - "port": self.mc_port, - "reset": options.get("mode", "hard"), - "inventory": options.get("inventory", {}), - "equipment": options.get("equipment", []), - "spread": options.get("spread", False), - "waitTicks": options.get("wait_ticks", 5), - "position": options.get("position", None), - } - - self.unpause() - self.mineflayer.stop() - time.sleep(1) # wait for mineflayer to exit - - returned_data = self.check_process() - self.has_reset = True - self.connected = True - # All the reset in step will be soft - self.reset_options["reset"] = "soft" - self.pause() - return json.loads(returned_data) - - def close(self): - self.unpause() - if self.connected: - res = requests.post(f"{self.server}/stop") - if res.status_code == 200: - self.connected = False - self.mineflayer.stop() - return not self.connected - - def pause(self): - if self.mineflayer.is_running and not self.server_paused: - res = requests.post(f"{self.server}/pause") - if res.status_code == 200: - self.server_paused = True - return self.server_paused - - def unpause(self): - if self.mineflayer.is_running and self.server_paused: - res = requests.post(f"{self.server}/pause") - if res.status_code == 200: - self.server_paused = False - else: - print(res.json()) - return self.server_paused +from .mineflayer_environment import MineflayerEnv class GameEnvironment(BaseModel, arbitrary_types_allowed=True): """ @@ -168,7 +50,7 @@ class GameEnvironment(BaseModel, arbitrary_types_allowed=True): def update_code(self, code: str): self.code = code - def update_program(self, programs: str): + def update_programs(self, programs: str): self.programs = programs async def on_event(self, *args): @@ -185,8 +67,6 @@ class GameEnvironment(BaseModel, arbitrary_types_allowed=True): Exception: If there is an issue retrieving events. """ try: - # Implement the logic to retrieve Minecraft events here. - # Example: events = minecraft_api.get_events() if not self.mf_instance.has_reset: # TODO Modify logger.info("Environment has not been reset yet, is resetting") @@ -257,12 +137,7 @@ class MinecraftPlayer(SoftwareCompany): if "__name__" == "__main__": test_code = "bot.chat(`/time set ${getNextTime()}`);" mc_port = 1960 - # env_wait_ticks = 20 ge = GameEnvironment() ge.set_mc_port(mc_port) ge.update_code(test_code) - # ge.mf_instance.reset(options={ - # "mode": "soft", - # "wait_ticks": env_wait_ticks, - # }) logger.info(ge.on_event()) \ No newline at end of file diff --git a/metagpt/mineflayer_environment.py b/metagpt/mineflayer_environment.py new file mode 100644 index 000000000..1b208c8d5 --- /dev/null +++ b/metagpt/mineflayer_environment.py @@ -0,0 +1,127 @@ +# -*- coding: utf-8 -*- +# @Date : 2023/09/25 22:13 +# @Author : yuymf +# @Desc : @https://github.com/MineDojo/Voyager/blob/main/voyager/env/bridge.py +import os +import time +import json +import requests + +from metagpt.logs import logger +import metagpt.utils.minecraft as U +from metagpt.utils.minecraft.process_monitor import SubprocessMonitor + +class MineflayerEnv: + def __init__( + self, + mc_port=None, + server_host="http://127.0.0.1", + server_port=3000, + request_timeout=600, + ): + self.mc_port = mc_port + self.server = f"{server_host}:{server_port}" + self.server_port = server_port + self.request_timeout = request_timeout + self.mineflayer = self.get_mineflayer_process(server_port) + self.has_reset = False + self.reset_options = None + self.connected = False + self.server_paused = False + + def set_mc_port(self, mc_port): + self.mc_port = mc_port + + def get_mineflayer_process(self, server_port): + U.f_mkdir("./logs", "mineflayer") + file_path = os.path.abspath(os.path.dirname(__file__)) + return SubprocessMonitor( + commands=[ + "node", + U.f_join(file_path, "mineflayer_env/mineflayer/index.js"), + str(server_port), + ], + name="mineflayer", + ready_match=r"Server started on port (\d+)", + log_path=U.f_join("./logs", "mineflayer"), + ) + + def check_process(self): + retry = 0 + while not self.mineflayer.is_running: + logger.info("Mineflayer process has exited, restarting") + self.mineflayer.run() + if not self.mineflayer.is_running: + if retry > 3: + logger.error("Mineflayer process failed to start") + raise {} + else: + retry += 1 + continue + logger.info(self.mineflayer.ready_line) + res = requests.post( + f"{self.server}/start", + json=self.reset_options, + timeout=self.request_timeout, + ) + if res.status_code != 200: + self.mineflayer.stop() + logger.error( + f"Minecraft server reply with code {res.status_code}" + ) + raise {} + return res.json() + + def reset(self, *, seed=None, options=None, ): + if options is None: + options = {} + if options.get("inventory", {}) and options.get("mode", "hard") != "hard": + logger.error("inventory can only be set when options is hard") + raise{} + + self.reset_options = { + "port": self.mc_port, + "reset": options.get("mode", "hard"), + "inventory": options.get("inventory", {}), + "equipment": options.get("equipment", []), + "spread": options.get("spread", False), + "waitTicks": options.get("wait_ticks", 5), + "position": options.get("position", None), + } + + self.unpause() + self.mineflayer.stop() + time.sleep(1) # wait for mineflayer to exit + + returned_data = self.check_process() + self.has_reset = True + self.connected = True + # All the reset in step will be soft + self.reset_options["reset"] = "soft" + self.pause() + return json.loads(returned_data) + + def close(self): + self.unpause() + if self.connected: + res = requests.post(f"{self.server}/stop") + if res.status_code == 200: + self.connected = False + self.mineflayer.stop() + return not self.connected + + def pause(self): + if self.mineflayer.is_running and not self.server_paused: + res = requests.post(f"{self.server}/pause") + if res.status_code == 200: + self.server_paused = True + return self.server_paused + + def unpause(self): + if self.mineflayer.is_running and self.server_paused: + res = requests.post(f"{self.server}/pause") + if res.status_code == 200: + self.server_paused = False + else: + print(res.json()) + return self.server_paused diff --git a/metagpt/utils/minecraft/file_utils.py b/metagpt/utils/minecraft/file_utils.py index c92f08f55..8f199329b 100644 --- a/metagpt/utils/minecraft/file_utils.py +++ b/metagpt/utils/minecraft/file_utils.py @@ -4,22 +4,6 @@ # @Desc : Temp Using :File system utils.@ https://github.com/MineDojo/Voyager/blob/main/voyager/utils/file_utils.py import collections import os -import pickle -import sys -import errno -import shutil -import glob - -# import pwd -import codecs -import hashlib -import tarfile -import fnmatch -import tempfile -from datetime import datetime -from socket import gethostname -import logging - f_ext = os.path.splitext @@ -31,26 +15,6 @@ is_dir = os.path.isdir get_dir = os.path.dirname - -def host_name(): - "Get host name, alias with ``socket.gethostname()``" - return gethostname() - - -def host_id(): - """ - Returns: first part of hostname up to '.' - """ - return host_name().split(".")[0] - - -def utf_open(fname, mode): - """ - Wrapper for codecs.open - """ - return codecs.open(fname, mode=mode, encoding="utf-8") - - def is_sequence(obj): """ Returns: @@ -74,22 +38,6 @@ def pack_varargs(args): return args -def f_not_empty(*fpaths): - """ - Returns: - True if and only if the file exists and file size > 0 - if fpath is a dir, if and only if dir exists and has at least 1 file - """ - fpath = f_join(*fpaths) - if not os.path.exists(fpath): - return False - - if os.path.isdir(fpath): - return len(os.listdir(fpath)) > 0 - else: - return os.path.getsize(fpath) > 0 - - def f_expand(fpath): return os.path.expandvars(os.path.expanduser(fpath)) @@ -109,51 +57,6 @@ def f_join(*fpaths): return fpath -def f_listdir( - *fpaths, - filter_ext=None, - filter=None, - sort=True, - full_path=False, - nonexist_ok=True, - recursive=False, -): - """ - Args: - full_path: True to return full paths to the dir contents - filter: function that takes in file name and returns True to include - nonexist_ok: True to return [] if the dir is non-existent, False to raise - sort: sort the file names by alphabetical - recursive: True to use os.walk to recursively list files. Note that `filter` - will be applied to the relative path string to the root dir. - e.g. filter will take "a/data1.txt" and "a/b/data3.txt" as input, instead of - just the base file names "data1.txt" and "data3.txt". - if False, will simply call os.listdir() - """ - assert not (filter_ext and filter), "filter_ext and filter are mutually exclusive" - dir_path = f_join(*fpaths) - if not os.path.exists(dir_path) and nonexist_ok: - return [] - if recursive: - files = [ - os.path.join(os.path.relpath(root, dir_path), file) - for root, _, files in os.walk(dir_path) - for file in files - ] - else: - files = os.listdir(dir_path) - if filter is not None: - files = [f for f in files if filter(f)] - elif filter_ext is not None: - files = [f for f in files if f.endswith(filter_ext)] - if sort: - files.sort() - if full_path: - return [os.path.join(dir_path, f) for f in files] - else: - return files - - def f_mkdir(*fpaths): """ Recursively creates all the subdirs @@ -164,377 +67,6 @@ def f_mkdir(*fpaths): return fpath -def f_mkdir_in_path(*fpaths): - """ - fpath is a file, - recursively creates all the parent dirs that lead to the file - If exist, do nothing. - """ - os.makedirs(get_dir(f_join(*fpaths)), exist_ok=True) - - -def last_part_in_path(fpath): - """ - https://stackoverflow.com/questions/3925096/how-to-get-only-the-last-part-of-a-path-in-python - """ - return os.path.basename(os.path.normpath(f_expand(fpath))) - - -def is_abs_path(*fpath): - return os.path.isabs(f_join(*fpath)) - - -def is_relative_path(*fpath): - return not is_abs_path(f_join(*fpath)) - - -def f_time(*fpath): - "File modification time" - return str(os.path.getctime(f_join(*fpath))) - - -def f_append_before_ext(fpath, suffix): - """ - Append a suffix to file name and retain its extension - """ - name, ext = f_ext(fpath) - return name + suffix + ext - - -def f_add_ext(fpath, ext): - """ - Append an extension if not already there - Args: - ext: will add a preceding `.` if doesn't exist - """ - if not ext.startswith("."): - ext = "." + ext - if fpath.endswith(ext): - return fpath - else: - return fpath + ext - - -def f_has_ext(fpath, ext): - "Test if file path is a text file" - _, actual_ext = f_ext(fpath) - return actual_ext == "." + ext.lstrip(".") - - -def f_glob(*fpath): - return glob.glob(f_join(*fpath), recursive=True) - - -def f_remove(*fpath, verbose=False, dry_run=False): - """ - If exist, remove. Supports both dir and file. Supports glob wildcard. - """ - assert isinstance(verbose, bool) - fpath = f_join(fpath) - if dry_run: - print("Dry run, delete:", fpath) - return - for f in glob.glob(fpath): - try: - shutil.rmtree(f) - except OSError as e: - if e.errno == errno.ENOTDIR: - try: - os.remove(f) - except: # final resort safeguard - pass - if verbose: - print(f'Deleted "{fpath}"') - - -def f_copy(fsrc, fdst, ignore=None, include=None, exists_ok=True, verbose=False): - """ - Supports both dir and file. Supports glob wildcard. - """ - fsrc, fdst = f_expand(fsrc), f_expand(fdst) - for f in glob.glob(fsrc): - try: - f_copytree(f, fdst, ignore=ignore, include=include, exist_ok=exists_ok) - except OSError as e: - if e.errno == errno.ENOTDIR: - shutil.copy(f, fdst) - else: - raise - if verbose: - print(f'Copied "{fsrc}" to "{fdst}"') - - -def _f_copytree( - src, - dst, - symlinks=False, - ignore=None, - exist_ok=True, - copy_function=shutil.copy2, - ignore_dangling_symlinks=False, -): - """Copied from python standard lib shutil.copytree - except that we allow exist_ok - Use f_copytree as entry - """ - names = os.listdir(src) - if ignore is not None: - ignored_names = ignore(src, names) - else: - ignored_names = set() - - os.makedirs(dst, exist_ok=exist_ok) - errors = [] - for name in names: - if name in ignored_names: - continue - srcname = os.path.join(src, name) - dstname = os.path.join(dst, name) - try: - if os.path.islink(srcname): - linkto = os.readlink(srcname) - if symlinks: - # We can't just leave it to `copy_function` because legacy - # code with a custom `copy_function` may rely on copytree - # doing the right thing. - os.symlink(linkto, dstname) - shutil.copystat(srcname, dstname, follow_symlinks=not symlinks) - else: - # ignore dangling symlink if the flag is on - if not os.path.exists(linkto) and ignore_dangling_symlinks: - continue - # otherwise let the copy occurs. copy2 will raise an error - if os.path.isdir(srcname): - _f_copytree( - srcname, dstname, symlinks, ignore, exist_ok, copy_function - ) - else: - copy_function(srcname, dstname) - elif os.path.isdir(srcname): - _f_copytree(srcname, dstname, symlinks, ignore, exist_ok, copy_function) - else: - # Will raise a SpecialFileError for unsupported file types - copy_function(srcname, dstname) - # catch the Error from the recursive copytree so that we can - # continue with other files - except shutil.Error as err: - errors.extend(err.args[0]) - except OSError as why: - errors.append((srcname, dstname, str(why))) - try: - shutil.copystat(src, dst) - except OSError as why: - # Copying file access times may fail on Windows - if getattr(why, "winerror", None) is None: - errors.append((src, dst, str(why))) - if errors: - raise shutil.Error(errors) - return dst - - -def _include_patterns(*patterns): - """Factory function that can be used with copytree() ignore parameter. - - Arguments define a sequence of glob-style patterns - that are used to specify what files to NOT ignore. - Creates and returns a function that determines this for each directory - in the file hierarchy rooted at the source directory when used with - shutil.copytree(). - """ - - def _ignore_patterns(path, names): - keep = set( - name for pattern in patterns for name in fnmatch.filter(names, pattern) - ) - ignore = set( - name - for name in names - if name not in keep and not os.path.isdir(os.path.join(path, name)) - ) - return ignore - - return _ignore_patterns - - -def f_copytree(fsrc, fdst, symlinks=False, ignore=None, include=None, exist_ok=True): - fsrc, fdst = f_expand(fsrc), f_expand(fdst) - assert (ignore is None) or ( - include is None - ), "ignore= and include= are mutually exclusive" - if ignore: - ignore = shutil.ignore_patterns(*ignore) - elif include: - ignore = _include_patterns(*include) - _f_copytree(fsrc, fdst, ignore=ignore, symlinks=symlinks, exist_ok=exist_ok) - - -def f_move(fsrc, fdst): - fsrc, fdst = f_expand(fsrc), f_expand(fdst) - for f in glob.glob(fsrc): - shutil.move(f, fdst) - - -def f_split_path(fpath, normpath=True): - """ - Splits path into a list of its component folders - - Args: - normpath: call os.path.normpath to remove redundant '/' and - up-level references like ".." - """ - if normpath: - fpath = os.path.normpath(fpath) - allparts = [] - while 1: - parts = os.path.split(fpath) - if parts[0] == fpath: # sentinel for absolute paths - allparts.insert(0, parts[0]) - break - elif parts[1] == fpath: # sentinel for relative paths - allparts.insert(0, parts[1]) - break - else: - fpath = parts[0] - allparts.insert(0, parts[1]) - return allparts - - -def get_script_dir(): - """ - Returns: the dir of current script - """ - return os.path.dirname(os.path.realpath(sys.argv[0])) - - -def get_script_file_name(): - """ - Returns: the dir of current script - """ - return os.path.basename(sys.argv[0]) - - -def get_script_self_path(): - """ - Returns: the dir of current script - """ - return os.path.realpath(sys.argv[0]) - - -def get_parent_dir(location, abspath=False): - """ - Args: - location: current directory or file - - Returns: - parent directory absolute or relative path - """ - _path = os.path.abspath if abspath else os.path.relpath - return _path(f_join(location, os.pardir)) - - -def md5_checksum(*fpath): - """ - File md5 signature - """ - hash_md5 = hashlib.md5() - with open(f_join(*fpath), "rb") as f: - for chunk in iter(lambda: f.read(65536), b""): - hash_md5.update(chunk) - return hash_md5.hexdigest() - - -def create_tar(fsrc, output_tarball, include=None, ignore=None, compress_mode="gz"): - """ - Args: - fsrc: source file or folder - output_tarball: output tar file name - compress_mode: "gz", "bz2", "xz" or "" (empty for uncompressed write) - include: include pattern, will trigger copy to temp directory - ignore: ignore pattern, will trigger copy to temp directory - """ - fsrc, output_tarball = f_expand(fsrc), f_expand(output_tarball) - assert compress_mode in ["gz", "bz2", "xz", ""] - src_base = os.path.basename(fsrc) - - tempdir = None - if include or ignore: - tempdir = tempfile.mkdtemp() - tempdest = f_join(tempdir, src_base) - f_copy(fsrc, tempdest, include=include, ignore=ignore) - fsrc = tempdest - - with tarfile.open(output_tarball, "w:" + compress_mode) as tar: - tar.add(fsrc, arcname=src_base) - - if tempdir: - f_remove(tempdir) - - -def extract_tar(source_tarball, output_dir=".", members=None): - """ - Args: - source_tarball: extract members from archive - output_dir: default to current working dir - members: must be a subset of the list returned by getmembers() - """ - source_tarball, output_dir = f_expand(source_tarball), f_expand(output_dir) - with tarfile.open(source_tarball, "r:*") as tar: - tar.extractall(output_dir, members=members) - - -def move_with_backup(*fpath, suffix=".bak"): - """ - Ensures that a path is not occupied. If there is a file, rename it by - adding @suffix. Resursively backs up everything. - - Args: - fpath: file path to clear - suffix: Add to backed up files (default: {'.bak'}) - """ - fpath = str(f_join(*fpath)) - if os.path.exists(fpath): - move_with_backup(fpath + suffix) - shutil.move(fpath, fpath + suffix) - - -def insert_before_ext(name, insert): - """ - log.txt -> log.ep50.txt - """ - name, ext = os.path.splitext(name) - return name + insert + ext - - -def timestamp_file_name(fname): - timestr = datetime.now().strftime("_%H-%M-%S_%m-%d-%y") - return insert_before_ext(fname, timestr) - - -def get_file_lock(*fpath, timeout: int = 15, logging_level="critical"): - """ - NFS-safe filesystem-backed lock. `pip install flufl.lock` - https://flufllock.readthedocs.io/en/stable/apiref.html - - Args: - fpath: should be a path on NFS so that every process can see it - timeout: seconds - """ - from flufl.lock import Lock - - logging.getLogger("flufl.lock").setLevel(logging_level.upper()) - return Lock(f_join(*fpath), lifetime=timeout) - - -def load_pickle(*fpaths): - with open(f_join(*fpaths), "rb") as fp: - return pickle.load(fp) - - -def dump_pickle(data, *fpaths): - with open(f_join(*fpaths), "wb") as fp: - pickle.dump(data, fp) - - def load_text(*fpaths, by_lines=False): with open(f_join(*fpaths), "r") as fp: if by_lines: @@ -546,24 +78,7 @@ def load_text(*fpaths, by_lines=False): def load_text_lines(*fpaths): return load_text(*fpaths, by_lines=True) - -def dump_text(s, *fpaths): - with open(f_join(*fpaths), "w") as fp: - fp.write(s) - - -def dump_text_lines(lines: list[str], *fpaths, add_newline=True): - with open(f_join(*fpaths), "w") as fp: - for line in lines: - print(line, file=fp, end="\n" if add_newline else "") - - # aliases to be consistent with other load_* and dump_* -pickle_load = load_pickle -pickle_dump = dump_pickle text_load = load_text read_text = load_text -read_text_lines = load_text_lines -write_text = dump_text -write_text_lines = dump_text_lines -text_dump = dump_text +read_text_lines = load_text_lines \ No newline at end of file diff --git a/metagpt/utils/minecraft/json_utils.py b/metagpt/utils/minecraft/json_utils.py index 55d310bae..2814a5887 100644 --- a/metagpt/utils/minecraft/json_utils.py +++ b/metagpt/utils/minecraft/json_utils.py @@ -144,7 +144,6 @@ def correct_json(json_str: str) -> str: return balanced_str return json_str - def fix_and_parse_json( json_str: str, try_to_fix_with_gpt: bool = True ) -> Union[str, Dict[Any, Any]]: @@ -158,13 +157,6 @@ def fix_and_parse_json( return json.loads(json_str) except json.JSONDecodeError as _: # noqa: F841 pass - # Let's do something manually: - # sometimes GPT responds with something BEFORE the braces: - # "I'm sorry, I don't understand. Please try again." - # {"text": "I'm sorry, I don't understand. Please try again.", - # "confidence": 0.0} - # So let's try to find the first brace and then parse the rest - # of the string try: brace_index = json_str.index("{") json_str = json_str[brace_index:] @@ -172,60 +164,4 @@ def fix_and_parse_json( json_str = json_str[: last_brace_index + 1] return json.loads(json_str) except json.JSONDecodeError as e: # noqa: F841 - # if try_to_fix_with_gpt: - # print( - # "Warning: Failed to parse AI output, attempting to fix." - # "\n If you see this warning frequently, it's likely that" - # " your prompt is confusing the AI. Try changing it up" - # " slightly." - # ) - # # Now try to fix this up using the ai_functions - # ai_fixed_json = fix_json(json_str, JSON_SCHEMA) - # - # if ai_fixed_json != "failed": - # return json.loads(ai_fixed_json) - # else: - # # This allows the AI to react to the error message, - # # which usually results in it correcting its ways. - # print("Failed to fix ai output, telling the AI.") - # return json_str - # else: - raise e - - -# def fix_json(json_str: str, schema: str) -> str: -# """Fix the given JSON string to make it parseable and fully complient with the provided schema.""" -# -# # Try to fix the JSON using gpt: -# function_string = "def fix_json(json_str: str, schema:str=None) -> str:" -# args = [f"'''{json_str}'''", f"'''{schema}'''"] -# description_string = ( -# "Fixes the provided JSON string to make it parseable" -# " and fully complient with the provided schema.\n If an object or" -# " field specified in the schema isn't contained within the correct" -# " JSON, it is ommited.\n This function is brilliant at guessing" -# " when the format is incorrect." -# ) -# -# # If it doesn't already start with a "`", add one: -# if not json_str.startswith("`"): -# json_str = "```json\n" + json_str + "\n```" -# result_string = call_ai_function( -# function_string, args, description_string, model=cfg.fast_llm_model -# ) -# if cfg.debug: -# print("------------ JSON FIX ATTEMPT ---------------") -# print(f"Original JSON: {json_str}") -# print("-----------") -# print(f"Fixed JSON: {result_string}") -# print("----------- END OF FIX ATTEMPT ----------------") -# -# try: -# json.loads(result_string) # just check the validity -# return result_string -# except: # noqa: E722 -# # Get the call stack: -# # import traceback -# # call_stack = traceback.format_exc() -# # print(f"Failed to fix JSON: '{json_str}' "+call_stack) -# return "failed" + raise e \ No newline at end of file diff --git a/metagpt/utils/minecraft/process_monitor.py b/metagpt/utils/minecraft/process_monitor.py index d38b20b65..53ec1c132 100644 --- a/metagpt/utils/minecraft/process_monitor.py +++ b/metagpt/utils/minecraft/process_monitor.py @@ -83,10 +83,6 @@ class SubprocessMonitor: self.process.terminate() self.process.wait() - # def __del__(self): - # if self.process.is_running(): - # self.stop() - @property def is_running(self): if self.process is None:

+ + + + + + +