{"record":{"id":"d6e6c822660136d8","repo":"FoundationAgents/MetaGPT","slug":"environment-has-not-been-reset-yet","errorCode":null,"errorMessage":"Environment has not been reset yet","messagePattern":"Environment has not been reset yet","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"metagpt/environment/minecraft/minecraft_ext_env.py","lineNumber":165,"sourceCode":"            \"position\": options.get(\"position\", None),\n        }\n\n        self.unpause()\n        self.mineflayer.stop()\n        time.sleep(1)  # wait for mineflayer to exit\n\n        returned_data = self.check_process()\n        self.has_reset = True\n        self.connected = True\n        # All the reset in step will be soft\n        self.reset_options[\"reset\"] = \"soft\"\n        self.pause()\n        return json.loads(returned_data)\n\n    @mark_as_writeable\n    def _step(self, code: str, programs: str = \"\") -> dict:\n        if not self.has_reset:\n            raise RuntimeError(\"Environment has not been reset yet\")\n        self.check_process()\n        self.unpause()\n        data = {\n            \"code\": code,\n            \"programs\": programs,\n        }\n        res = requests.post(f\"{self.server}/step\", json=data, timeout=self.request_timeout)\n        if res.status_code != 200:\n            raise RuntimeError(\"Failed to step Minecraft server\")\n        returned_data = res.json()\n        self.pause()\n        return json.loads(returned_data)\n\n    @mark_as_writeable\n    def pause(self) -> bool:\n        if self.mineflayer.is_running and not self.server_paused:\n            res = requests.post(f\"{self.server}/pause\")\n            if res.status_code == 200:","sourceCodeStart":147,"sourceCodeEnd":183,"githubUrl":"https://github.com/FoundationAgents/MetaGPT/blob/11cdf466d042aece04fc6cfd13b28e1a70341b1f/metagpt/environment/minecraft/minecraft_ext_env.py#L147-L183","documentation":"MinecraftExtEnv._step raises RuntimeError('Environment has not been reset yet') when the has_reset flag is False. The Mineflayer bot and the bridge server are only brought up by reset(), so stepping before the first reset has no bot to execute code against; the flag makes this an explicit failure instead of a cryptic HTTP error.","triggerScenarios":"Creating MinecraftExtEnv(server=..., mc_port=...) and calling await env.step(...) / env.write_to_api('step', ...) before calling await env.reset(...); also in a fresh process resuming a session without re-resetting.","commonSituations":"Adapting gym-style examples that step immediately after construction; reset() failed earlier (server startup issues) and the exception was swallowed so the code continued to step; multiple episodes where reset happens in a try block that was skipped.","solutions":["Call await env.reset(...) once after construction and before the first step; reset sets has_reset=True and starts the bot.","If reset() itself failed, fix that first — check the mineflayer process is running (check_process) and the server URL/port are correct.","In multi-episode loops, call reset at the start of each episode since has_reset persists per instance state."],"exampleFix":"# before\nenv = MinecraftExtEnv(server=\"http://127.0.0.1\", mc_port=3000, replay_dir=\"...\")\nobs = await env.step(\"bot.chat('hi')\")  # RuntimeError: Environment has not been reset yet\n\n# after\nenv = MinecraftExtEnv(server=\"http://127.0.0.1\", mc_port=3000, replay_dir=\"...\")\nawait env.reset()\nobs = await env.step(\"bot.chat('hi')\")","handlingStrategy":"validation","validationCode":"if not getattr(env, \"has_reset\", False):\n    await env.reset()  # mandatory before the first step\nobs = await env.step(code)","typeGuard":null,"tryCatchPattern":"try:\n    obs = await env.step(code)\nexcept RuntimeError as e:\n    if \"not been reset\" in str(e):\n        await env.reset()\n        obs = await env.step(code)  # retry once after establishing the bot\n    else:\n        raise","preventionTips":["Treat reset() as part of construction: call it immediately after creating MinecraftExtEnv, every episode.","Wrap reset in a hard failure path — if it raises, stop; never continue to step on an unreset env.","Check env.has_reset (or your own flag) before stepping in loops that may skip their first iteration."],"tags":["python","minecraft","environment","lifecycle","ordering"],"backgroundTag":null,"analyzedSha":"11cdf466d042aece04fc6cfd13b28e1a70341b1f","analyzedAt":"2026-08-14T23:20:02.994Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}