mettagrid


Namemettagrid JSON
Version 0.2.0.25 PyPI version JSON
download
home_pageNone
SummaryA fast grid-based open-ended MARL environment
upload_time2025-10-09 21:05:31
maintainerNone
docs_urlNone
authorNone
requires_python<3.13,>=3.11
licenseNone
keywords gridworld minigrid rl reinforcement-learning environment gym
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # MettaGrid Environment

MettaGrid is a multi-agent gridworld environment for studying the emergence of cooperation and social behaviors in
reinforcement learning agents. The environment features a variety of objects and actions that agents can interact with
to manage resources, engage in combat, share with others, and optimize their rewards.

## Overview

In MettaGrid, agents navigate a gridworld and interact with various objects to manage their energy, harvest resources,
engage in combat, and cooperate with other agents. The key dynamics include:

- **Energy Management**: Agents must efficiently manage their energy, which is required for all actions. They can
  harvest resources and convert them to energy at charger stations.
- **Resource Gathering**: Agents can gather resources from generator objects scattered throughout the environment.
- **Cooperation and Sharing**: Agents have the ability to share resources with other agents and use energy to power the
  heart altar, which provides rewards.
- **Combat**: Agents can attack other agents to temporarily freeze them and steal their resources. They can also use
  shields to defend against attacks.

The environment is highly configurable, allowing for experimentation with different world layouts, object placements,
and agent capabilities.

## Objects

### Agent

<img src="https://github.com/daveey/Griddly/blob/develop/resources/images/oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_astronaut_u1.png?raw=true" width="32"/>

The `Agent` object represents an individual agent in the environment. Agents can move, rotate, attack, and interact with
other objects. Each agent has energy, resources, and shield properties that govern its abilities and interactions.

### Altar

<img src="https://github.com/daveey/Griddly/blob/develop/resources/images/oryx/oryx_tiny_galaxy/tg_sliced/tg_items/tg_items_heart_full.png?raw=true" width="32"/>

The `Altar` object allows agents to spend energy to gain rewards. Agents can power the altar by using the `use` action
when near it. The altar has a cooldown period between uses.

- Using the heart altar costs `altar.use_cost energy`. So, no matter how much energy you have, you are always dumping
  the same amount of energy in it and getting the same amount of reward.
- After the heart altar is used, it is unable to be used for altar.cooldown timesteps.
- A single use of the heart altar gives you a single unit of reward: if
  `target._type_id == ObjectType.AltarT: self.env._rewards[actor_id] += 1`

### Converter

<img src="https://github.com/daveey/Griddly/blob/develop/resources/images/oryx/oryx_tiny_galaxy/tg_sliced/tg_items/tg_items_pda_A.png?raw=true" width="32"/>

The `Converter` object allows agents to convert their harvested resources into energy. Agents can use converters by
moving to them and taking the `use` action. Each use of a converter provides a specified amount of energy and has a
cooldown period.

- Using the converter does not cost any energy.
- Using the converter outputs `converter.energy_output.r1` energy
  - see `this.output_energy = cfg[b"energy_output.r1"]` in the Converter cppclass
- Using the converter increments resource 2 by one and decrements resource 1 by 1
- There is currently no use for `converter.energy_output.r2` and `converter.energy_output.r3`
- After the converter is used, it is unable to be used for `converter.cooldown` timesteps

### Generator

<img src="https://github.com/daveey/Griddly/blob/develop/resources/images/oryx/oryx_fantasy/ore-0.png?raw=true" width="32"/>

The `Generator` object produces resources that agents can harvest. Agents can gather resources from generators by moving
to them and taking the `use` action. Generators have a specified capacity and replenish resources over time.

- Using the generator once gives one resource 1
- After the generator is used, it is unable to be used for `generator.cooldown` timesteps

### Wall

<img src="https://github.com/daveey/Griddly/blob/develop/resources/images/oryx/oryx_fantasy/wall2-0.png?raw=true" width="32"/>

The `Wall` object acts as an impassable barrier in the environment, restricting agent movement.

### Cooldown

The `cooldown` property determines how long before objects can be used again.

## Actions

### Move / Rotate

The `move` action allows agents to move to an adjacent cell in the gridworld. The action has two modes: moving forward
and moving backward relative to the agent's current orientation.

The `rotate` action enables agents to change their orientation within the gridworld. Agents can rotate to face in four
directions: down, left, right, and up.

### Attack

The `attack` action allows agents to attack other agents or objects within their attack range. Successful attacks freeze
the target for `freeze_duration` timesteps and allow the attacker to steal resources. Further, the attacked agent's
energy is set to `0`. Attacks have a cost and inflict a damage value. The agent selects from one of nine coordinates
within its attack range.

### Shield (Toggle)

The `shield` action turns on a shield. When the shield is active, the agent is protected from attacks by other agents.
The shield consumes energy defined by `upkeep.shield` while active. Attack damage is subtracted from the agent's energy,
rather than freezing the agent.

### Transfer

The `transfer` action enables agents to share resources with other agents. Agents can choose to transfer specific
resources to another agent in an adjacent cell. It is currently not implemented.

### Use

The `use` action allows agents to interact with objects such as altars, converters, and generators. The specific effects
of the `use` action depend on the target object and can include converting resources to energy, powering the altar for
rewards, or harvesting resources from generators.

### Swap

The `swap` action allows agents to swap positions with other agents. It is currently not implemented.

## Configuration

The MettaGrid environment is highly configurable through the use of YAML configuration files. These files specify the
layout of the gridworld, the placement of objects, and various properties of the objects and agents.

**Current settings:**

1. Ore   - Base resource obtained from mines. Mines produce one ore when used. No resource requirements for use.   -
   Reward value: 0.005 per unit (max 2)   - Used to create batteries and lasers
2. Battery   - Intermediate resource created from ore at a generator. Generator turns one ore into one battery.   -
   Reward value: 0.01 per unit (max 2)   - Used to create hearts and lasers
3. Heart / heart altar   - High value reward, requires 3 batteries to be converted into a heart at a heart altar.
4. Laser   - Weapon resource created from ore and batteries. Requires 1 ore and 2 batteries. Created at the lasery.

- Consumed on use. When hitting an unarmored agent: freezes them and steals their whole inventory. When hitting an
  armoured agent, destroys their armor. **Inventory System**
- Agents have limited inventory space (default max: 50 items)
- Resources provide rewards just by being in inventory (up to their max reward value)
- Resources can be stolen through attacks Objects Various buildings: Mine, Generator, Armory, Lasery, Altar, Lab,
  Factory, Temple.
- HP — hitpoints, the number of times something can be hit before destruction.
- Cooldown between uses (varies by building)
- Can be damaged and destroyed by attacks

## Environment Architecture

MettaGrid uses a modular architecture designed primarily for the Softmax Studio ML project, with lightweight adapters to
maintain compatibility with external RL frameworks:

### Primary Training Environment

**`MettaGridEnv`** - The main environment actively developed for Softmax Studio training systems

- Full-featured environment with comprehensive stats collection, replay recording, and curriculum support
- Inherits from `MettaGridCore` for C++ environment implementation
- **Exclusively used** by `metta.rl.trainer` and `metta.sim.simulation`
- Continuously developed and optimized for Softmax Studio use cases
- Backward compatible with existing training code

### Core Infrastructure

**`MettaGridCore`** - Low-level C++ environment wrapper

- Foundation that provides the core game mechanics and performance
- **Not used directly** for training - serves as implementation detail for `MettaGridEnv`
- Provides the base functionality that external adapters wrap

### External Framework Compatibility Adapters

Lightweight wrappers around `MettaGridCore` to maintain compatibility with other training systems:

- **`MettaGridGymEnv`** - Gymnasium compatibility for research workflows
- **`MettaGridPettingZooEnv`** - PettingZoo compatibility for multi-agent research
- **`MettaGridPufferEnv`** - PufferLib compatibility for high-performance external training

**Important**: These adapters are **only used with their respective training systems**, not with the Metta trainer.

### Design Philosophy

- **Primary Focus**: `MettaGridEnv` receives active development and new features for Softmax Studio
- **Compatibility Maintenance**: External adapters ensure other frameworks continue working as the core evolves
- **Testing for Compatibility**: Demos verify external frameworks remain functional during core development
- **Clear Separation**: Each environment type serves its specific training system - no mixing between systems

### Compatibility Testing Demos

These demos ensure external framework adapters remain functional as the core environment evolves:

```bash
# Verify PettingZoo compatibility
python -m mettagrid.demos.demo_train_pettingzoo

# Verify PufferLib compatibility
python -m mettagrid.demos.demo_train_puffer

# Verify Gymnasium compatibility
python -m mettagrid.demos.demo_train_gym
```

The demos serve as regression tests to catch compatibility issues during core development, ensuring external users can
continue using their preferred frameworks.

## Building and testing

For local development, refer to the top-level [README.md](../README.md) in this repository.

### Bazel

By default, `uv sync` will run the Bazel build automatically via the custom build backend. If you need to run C++ tests
and benchmarks directly, you'll need to invoke `bazel` directly.

Build C++ tests and benchmarks in debug mode:

```sh
# Build with debug flags
bazel build --config=dbg //:mettagrid_c
# Run all tests
bazel test //...
```

For benchmarks you might prefer to use the optimized build:

```sh
# Build with optimizations
bazel build --config=opt //:mettagrid_c

# Run benchmarks
./build-release/benchmarks/grid_object_benchmark
```

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "mettagrid",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<3.13,>=3.11",
    "maintainer_email": null,
    "keywords": "gridworld, minigrid, rl, reinforcement-learning, environment, gym",
    "author": null,
    "author_email": "David Bloomin <daveey@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/d7/d3/b89eb76caa57c7f6ac8c6675a104c9e4f3070ff690fa4b91bbd061d033fa/mettagrid-0.2.0.25.tar.gz",
    "platform": null,
    "description": "# MettaGrid Environment\n\nMettaGrid is a multi-agent gridworld environment for studying the emergence of cooperation and social behaviors in\nreinforcement learning agents. The environment features a variety of objects and actions that agents can interact with\nto manage resources, engage in combat, share with others, and optimize their rewards.\n\n## Overview\n\nIn MettaGrid, agents navigate a gridworld and interact with various objects to manage their energy, harvest resources,\nengage in combat, and cooperate with other agents. The key dynamics include:\n\n- **Energy Management**: Agents must efficiently manage their energy, which is required for all actions. They can\n  harvest resources and convert them to energy at charger stations.\n- **Resource Gathering**: Agents can gather resources from generator objects scattered throughout the environment.\n- **Cooperation and Sharing**: Agents have the ability to share resources with other agents and use energy to power the\n  heart altar, which provides rewards.\n- **Combat**: Agents can attack other agents to temporarily freeze them and steal their resources. They can also use\n  shields to defend against attacks.\n\nThe environment is highly configurable, allowing for experimentation with different world layouts, object placements,\nand agent capabilities.\n\n## Objects\n\n### Agent\n\n<img src=\"https://github.com/daveey/Griddly/blob/develop/resources/images/oryx/oryx_tiny_galaxy/tg_sliced/tg_monsters/tg_monsters_astronaut_u1.png?raw=true\" width=\"32\"/>\n\nThe `Agent` object represents an individual agent in the environment. Agents can move, rotate, attack, and interact with\nother objects. Each agent has energy, resources, and shield properties that govern its abilities and interactions.\n\n### Altar\n\n<img src=\"https://github.com/daveey/Griddly/blob/develop/resources/images/oryx/oryx_tiny_galaxy/tg_sliced/tg_items/tg_items_heart_full.png?raw=true\" width=\"32\"/>\n\nThe `Altar` object allows agents to spend energy to gain rewards. Agents can power the altar by using the `use` action\nwhen near it. The altar has a cooldown period between uses.\n\n- Using the heart altar costs `altar.use_cost energy`. So, no matter how much energy you have, you are always dumping\n  the same amount of energy in it and getting the same amount of reward.\n- After the heart altar is used, it is unable to be used for altar.cooldown timesteps.\n- A single use of the heart altar gives you a single unit of reward: if\n  `target._type_id == ObjectType.AltarT: self.env._rewards[actor_id] += 1`\n\n### Converter\n\n<img src=\"https://github.com/daveey/Griddly/blob/develop/resources/images/oryx/oryx_tiny_galaxy/tg_sliced/tg_items/tg_items_pda_A.png?raw=true\" width=\"32\"/>\n\nThe `Converter` object allows agents to convert their harvested resources into energy. Agents can use converters by\nmoving to them and taking the `use` action. Each use of a converter provides a specified amount of energy and has a\ncooldown period.\n\n- Using the converter does not cost any energy.\n- Using the converter outputs `converter.energy_output.r1` energy\n  - see `this.output_energy = cfg[b\"energy_output.r1\"]` in the Converter cppclass\n- Using the converter increments resource 2 by one and decrements resource 1 by 1\n- There is currently no use for `converter.energy_output.r2` and `converter.energy_output.r3`\n- After the converter is used, it is unable to be used for `converter.cooldown` timesteps\n\n### Generator\n\n<img src=\"https://github.com/daveey/Griddly/blob/develop/resources/images/oryx/oryx_fantasy/ore-0.png?raw=true\" width=\"32\"/>\n\nThe `Generator` object produces resources that agents can harvest. Agents can gather resources from generators by moving\nto them and taking the `use` action. Generators have a specified capacity and replenish resources over time.\n\n- Using the generator once gives one resource 1\n- After the generator is used, it is unable to be used for `generator.cooldown` timesteps\n\n### Wall\n\n<img src=\"https://github.com/daveey/Griddly/blob/develop/resources/images/oryx/oryx_fantasy/wall2-0.png?raw=true\" width=\"32\"/>\n\nThe `Wall` object acts as an impassable barrier in the environment, restricting agent movement.\n\n### Cooldown\n\nThe `cooldown` property determines how long before objects can be used again.\n\n## Actions\n\n### Move / Rotate\n\nThe `move` action allows agents to move to an adjacent cell in the gridworld. The action has two modes: moving forward\nand moving backward relative to the agent's current orientation.\n\nThe `rotate` action enables agents to change their orientation within the gridworld. Agents can rotate to face in four\ndirections: down, left, right, and up.\n\n### Attack\n\nThe `attack` action allows agents to attack other agents or objects within their attack range. Successful attacks freeze\nthe target for `freeze_duration` timesteps and allow the attacker to steal resources. Further, the attacked agent's\nenergy is set to `0`. Attacks have a cost and inflict a damage value. The agent selects from one of nine coordinates\nwithin its attack range.\n\n### Shield (Toggle)\n\nThe `shield` action turns on a shield. When the shield is active, the agent is protected from attacks by other agents.\nThe shield consumes energy defined by `upkeep.shield` while active. Attack damage is subtracted from the agent's energy,\nrather than freezing the agent.\n\n### Transfer\n\nThe `transfer` action enables agents to share resources with other agents. Agents can choose to transfer specific\nresources to another agent in an adjacent cell. It is currently not implemented.\n\n### Use\n\nThe `use` action allows agents to interact with objects such as altars, converters, and generators. The specific effects\nof the `use` action depend on the target object and can include converting resources to energy, powering the altar for\nrewards, or harvesting resources from generators.\n\n### Swap\n\nThe `swap` action allows agents to swap positions with other agents. It is currently not implemented.\n\n## Configuration\n\nThe MettaGrid environment is highly configurable through the use of YAML configuration files. These files specify the\nlayout of the gridworld, the placement of objects, and various properties of the objects and agents.\n\n**Current settings:**\n\n1. Ore \u00a0 - Base resource obtained from mines. Mines produce one ore when used. No resource requirements for use. \u00a0 -\n   Reward value: 0.005 per unit (max 2) \u00a0 - Used to create batteries and lasers\n2. Battery \u00a0 - Intermediate resource created from ore at a generator. Generator turns one ore into one battery. \u00a0 -\n   Reward value: 0.01 per unit (max 2) \u00a0 - Used to create hearts and lasers\n3. Heart / heart altar \u00a0 - High value reward, requires 3 batteries to be converted into a heart at a heart altar.\n4. Laser \u00a0 - Weapon resource created from ore and batteries. Requires 1 ore and 2 batteries. Created at the lasery.\n\n- Consumed on use. When hitting an unarmored agent: freezes them and steals their whole inventory. When hitting an\n  armoured agent, destroys their armor. **Inventory System**\n- Agents have limited inventory space (default max: 50 items)\n- Resources provide rewards just by being in inventory (up to their max reward value)\n- Resources can be stolen through attacks Objects Various buildings: Mine, Generator, Armory, Lasery, Altar, Lab,\n  Factory, Temple.\n- HP \u2014 hitpoints, the number of times something can be hit before destruction.\n- Cooldown between uses (varies by building)\n- Can be damaged and destroyed by attacks\n\n## Environment Architecture\n\nMettaGrid uses a modular architecture designed primarily for the Softmax Studio ML project, with lightweight adapters to\nmaintain compatibility with external RL frameworks:\n\n### Primary Training Environment\n\n**`MettaGridEnv`** - The main environment actively developed for Softmax Studio training systems\n\n- Full-featured environment with comprehensive stats collection, replay recording, and curriculum support\n- Inherits from `MettaGridCore` for C++ environment implementation\n- **Exclusively used** by `metta.rl.trainer` and `metta.sim.simulation`\n- Continuously developed and optimized for Softmax Studio use cases\n- Backward compatible with existing training code\n\n### Core Infrastructure\n\n**`MettaGridCore`** - Low-level C++ environment wrapper\n\n- Foundation that provides the core game mechanics and performance\n- **Not used directly** for training - serves as implementation detail for `MettaGridEnv`\n- Provides the base functionality that external adapters wrap\n\n### External Framework Compatibility Adapters\n\nLightweight wrappers around `MettaGridCore` to maintain compatibility with other training systems:\n\n- **`MettaGridGymEnv`** - Gymnasium compatibility for research workflows\n- **`MettaGridPettingZooEnv`** - PettingZoo compatibility for multi-agent research\n- **`MettaGridPufferEnv`** - PufferLib compatibility for high-performance external training\n\n**Important**: These adapters are **only used with their respective training systems**, not with the Metta trainer.\n\n### Design Philosophy\n\n- **Primary Focus**: `MettaGridEnv` receives active development and new features for Softmax Studio\n- **Compatibility Maintenance**: External adapters ensure other frameworks continue working as the core evolves\n- **Testing for Compatibility**: Demos verify external frameworks remain functional during core development\n- **Clear Separation**: Each environment type serves its specific training system - no mixing between systems\n\n### Compatibility Testing Demos\n\nThese demos ensure external framework adapters remain functional as the core environment evolves:\n\n```bash\n# Verify PettingZoo compatibility\npython -m mettagrid.demos.demo_train_pettingzoo\n\n# Verify PufferLib compatibility\npython -m mettagrid.demos.demo_train_puffer\n\n# Verify Gymnasium compatibility\npython -m mettagrid.demos.demo_train_gym\n```\n\nThe demos serve as regression tests to catch compatibility issues during core development, ensuring external users can\ncontinue using their preferred frameworks.\n\n## Building and testing\n\nFor local development, refer to the top-level [README.md](../README.md) in this repository.\n\n### Bazel\n\nBy default, `uv sync` will run the Bazel build automatically via the custom build backend. If you need to run C++ tests\nand benchmarks directly, you'll need to invoke `bazel` directly.\n\nBuild C++ tests and benchmarks in debug mode:\n\n```sh\n# Build with debug flags\nbazel build --config=dbg //:mettagrid_c\n# Run all tests\nbazel test //...\n```\n\nFor benchmarks you might prefer to use the optimized build:\n\n```sh\n# Build with optimizations\nbazel build --config=opt //:mettagrid_c\n\n# Run benchmarks\n./build-release/benchmarks/grid_object_benchmark\n```\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "A fast grid-based open-ended MARL environment",
    "version": "0.2.0.25",
    "project_urls": {
        "Homepage": "https://daveey.github.io",
        "Repository": "https://github.com/Metta-AI/mettagrid"
    },
    "split_keywords": [
        "gridworld",
        " minigrid",
        " rl",
        " reinforcement-learning",
        " environment",
        " gym"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "09dcf368a0342db9a8d74af2d18d0ec641c593ab72e20efb922521169aca4269",
                "md5": "1868ce81700d0c4e331d75b4211370ec",
                "sha256": "8f3e0b0b3cb94646058c4d0ecb41360549fd81af3c27538246da5a88a2aeb149"
            },
            "downloads": -1,
            "filename": "mettagrid-0.2.0.25-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "1868ce81700d0c4e331d75b4211370ec",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": "<3.13,>=3.11",
            "size": 23704175,
            "upload_time": "2025-10-09T21:05:20",
            "upload_time_iso_8601": "2025-10-09T21:05:20.596995Z",
            "url": "https://files.pythonhosted.org/packages/09/dc/f368a0342db9a8d74af2d18d0ec641c593ab72e20efb922521169aca4269/mettagrid-0.2.0.25-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5258ba9a188b675731ab6cf3eaf0edc3f27d99f8e15d42245d7a9729ec924e7a",
                "md5": "d8091236ba71670b36da6b64a2459487",
                "sha256": "4fd0a34919258fcdbe337328c89f52bbc2abcba487678cd06a5a41e0f0d11b5c"
            },
            "downloads": -1,
            "filename": "mettagrid-0.2.0.25-cp311-cp311-manylinux_2_34_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d8091236ba71670b36da6b64a2459487",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": "<3.13,>=3.11",
            "size": 24109563,
            "upload_time": "2025-10-09T21:05:23",
            "upload_time_iso_8601": "2025-10-09T21:05:23.622677Z",
            "url": "https://files.pythonhosted.org/packages/52/58/ba9a188b675731ab6cf3eaf0edc3f27d99f8e15d42245d7a9729ec924e7a/mettagrid-0.2.0.25-cp311-cp311-manylinux_2_34_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "157d370f18adcdddb461142badf4338996bc1f08e660c03e71e78f7567446c1c",
                "md5": "320ba26c5cd13402fc2b0c8c3ab5d463",
                "sha256": "e00fde6b400161123e2ed4b49a6bce20bd515bb0a9a06d3863de5548a8b777f1"
            },
            "downloads": -1,
            "filename": "mettagrid-0.2.0.25-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "320ba26c5cd13402fc2b0c8c3ab5d463",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": "<3.13,>=3.11",
            "size": 23707860,
            "upload_time": "2025-10-09T21:05:26",
            "upload_time_iso_8601": "2025-10-09T21:05:26.320490Z",
            "url": "https://files.pythonhosted.org/packages/15/7d/370f18adcdddb461142badf4338996bc1f08e660c03e71e78f7567446c1c/mettagrid-0.2.0.25-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "cfafd2945b66f1a2e6518fb09d21c6ac882dad0cb5c1a31ee38b719271d77e3b",
                "md5": "84d93df4df661d55c64c19887e251016",
                "sha256": "3c719eb4034aba98cdd67632ed35c23ca6049613a68372edf55fdacd977b9707"
            },
            "downloads": -1,
            "filename": "mettagrid-0.2.0.25-cp312-cp312-manylinux_2_34_x86_64.whl",
            "has_sig": false,
            "md5_digest": "84d93df4df661d55c64c19887e251016",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": "<3.13,>=3.11",
            "size": 24111789,
            "upload_time": "2025-10-09T21:05:28",
            "upload_time_iso_8601": "2025-10-09T21:05:28.792504Z",
            "url": "https://files.pythonhosted.org/packages/cf/af/d2945b66f1a2e6518fb09d21c6ac882dad0cb5c1a31ee38b719271d77e3b/mettagrid-0.2.0.25-cp312-cp312-manylinux_2_34_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d7d3b89eb76caa57c7f6ac8c6675a104c9e4f3070ff690fa4b91bbd061d033fa",
                "md5": "d1440cbcf3ef737b328432d3d10ef3fe",
                "sha256": "198982fcc9faa8b69177c65f48aeb2a1dd0c42d67ff8a0dea89b605394e17bea"
            },
            "downloads": -1,
            "filename": "mettagrid-0.2.0.25.tar.gz",
            "has_sig": false,
            "md5_digest": "d1440cbcf3ef737b328432d3d10ef3fe",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<3.13,>=3.11",
            "size": 22621054,
            "upload_time": "2025-10-09T21:05:31",
            "upload_time_iso_8601": "2025-10-09T21:05:31.467583Z",
            "url": "https://files.pythonhosted.org/packages/d7/d3/b89eb76caa57c7f6ac8c6675a104c9e4f3070ff690fa4b91bbd061d033fa/mettagrid-0.2.0.25.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-09 21:05:31",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Metta-AI",
    "github_project": "mettagrid",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "mettagrid"
}
        
Elapsed time: 2.79852s