alem-env 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- alem_env-0.1.0/LICENSE +19 -0
- alem_env-0.1.0/PKG-INFO +580 -0
- alem_env-0.1.0/README.md +520 -0
- alem_env-0.1.0/alem/__init__.py +7 -0
- alem_env-0.1.0/alem/alem_coop/__init__.py +0 -0
- alem_env-0.1.0/alem/alem_coop/action_masking.py +384 -0
- alem_env-0.1.0/alem/alem_coop/alem_state.py +649 -0
- alem_env-0.1.0/alem/alem_coop/assets/0.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/1.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/2.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/3.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/4.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/5.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/6.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/7.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/8.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/9.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/arrow-down.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/arrow-left.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/arrow-right.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/arrow-up.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/arrow_fire_enchantment.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/arrow_ice_enchantment.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/bat.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/book.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/boots_fire_enchantment.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/boots_ice_enchantment.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/bow.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/buffalo.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/chest.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/chestplate_fire_enchantment.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/chestplate_ice_enchantment.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/clock.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/coal.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/construction_in_progress.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/construction_site.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/cow.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/dagger.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/debug-2.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/debug-3.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/debug.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/debug_tile.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/deep_thing.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/dexterity.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/diamond.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/diamond_boots.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/diamond_chestplate.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/diamond_helmet.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/diamond_pants.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/diamond_pickaxe.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/diamond_sword.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/drink.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/enchantment_table_fire.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/enchantment_table_ice.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/energy.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/epic_beacon.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/epic_forge.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/epic_shelter.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/fence.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/fire_elemental.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/fire_grass.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/fire_stone.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/fire_tree.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/fireball.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/food.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/forager.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/fountain.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/frost_troll.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/furnace.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/gnome_archer.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/gnome_warrior.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/grass.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/grave.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/grave2.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/grave3.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/gravel.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/heal_cross.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/health.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/helmet_fire_enchantment.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/helmet_ice_enchantment.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/ice_elemental.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/ice_grass.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/ice_shrub.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/iceball.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/intelligence.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/iron.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/iron_boots.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/iron_chestplate.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/iron_helmet.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/iron_pants.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/iron_pickaxe.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/iron_sword.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/knight.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/knight_archer.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/kobold.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/ladder_down.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/ladder_down_blocked.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/ladder_up.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/large_cow.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/lava.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/leaves.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/lizard.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/log.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/mana.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/message_bubble.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/miner.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/necromancer.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/necromancer_vulnerable.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/orc_mage.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/orc_soldier.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/pants_fire_enchantment.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/pants_ice_enchantment.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/path.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/path_moss.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/pigman.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/plant-ripe.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/plant-young.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/plant.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/plant_on_grass.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/player-dead.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/player-down.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/player-exchange.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/player-left.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/player-right.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/player-sleep.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/player-up.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/player.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/pointer-right-dead.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/pointer-right.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/pointer-top-right-dead.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/pointer-top-right.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/potion_blue.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/potion_cyan.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/potion_green.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/potion_pink.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/potion_red.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/potion_yellow.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/ripe_plant_on_grass.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/ruby.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/sand.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/sapling.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/sapphire.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/skeleton.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/slimeball.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/snail.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/spider.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/stalagmite.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/stone.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/stone_pickaxe.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/stone_sword.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/strength.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/sword_fire_enchantment.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/sword_ice_enchantment.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/table.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/torch_in_inventory.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/torch_on_path.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/tree.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/troll.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/unknown.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/wall.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/wall2.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/wall_moss.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/warrior.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/water.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/wood.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/wood_pickaxe.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/wood_sword.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/xp.png +0 -0
- alem_env-0.1.0/alem/alem_coop/assets/zombie.png +0 -0
- alem_env-0.1.0/alem/alem_coop/constants.py +1679 -0
- alem_env-0.1.0/alem/alem_coop/envs/__init__.py +0 -0
- alem_env-0.1.0/alem/alem_coop/envs/alem_pixels_env.py +231 -0
- alem_env-0.1.0/alem/alem_coop/envs/alem_symbolic_env.py +302 -0
- alem_env-0.1.0/alem/alem_coop/envs/alem_symbolic_env_debug.py +411 -0
- alem_env-0.1.0/alem/alem_coop/envs/alem_symbolic_single_agent_env.py +165 -0
- alem_env-0.1.0/alem/alem_coop/envs/common.py +1030 -0
- alem_env-0.1.0/alem/alem_coop/game_logic.py +4928 -0
- alem_env-0.1.0/alem/alem_coop/renderer/renderer_llm.py +833 -0
- alem_env-0.1.0/alem/alem_coop/renderer/renderer_pixels.py +1795 -0
- alem_env-0.1.0/alem/alem_coop/renderer/renderer_symbolic.py +459 -0
- alem_env-0.1.0/alem/alem_coop/util/__init__.py +0 -0
- alem_env-0.1.0/alem/alem_coop/util/game_logic_utils.py +1107 -0
- alem_env-0.1.0/alem/alem_coop/util/maths_utils.py +74 -0
- alem_env-0.1.0/alem/alem_coop/util/noise.py +130 -0
- alem_env-0.1.0/alem/alem_coop/world_gen/__init__.py +0 -0
- alem_env-0.1.0/alem/alem_coop/world_gen/world_gen.py +1196 -0
- alem_env-0.1.0/alem/alem_coop/world_gen/world_gen_configs.py +306 -0
- alem_env-0.1.0/alem/alem_env.py +44 -0
- alem_env-0.1.0/alem/environment_base/__init__.py +0 -0
- alem_env-0.1.0/alem/environment_base/environment_bases.py +169 -0
- alem_env-0.1.0/alem/environment_base/jaxmarl_compat.py +182 -0
- alem_env-0.1.0/alem/environment_base/util.py +40 -0
- alem_env-0.1.0/alem/llm/__init__.py +1 -0
- alem_env-0.1.0/alem/llm/action_parser.py +170 -0
- alem_env-0.1.0/alem/llm/alem_env.py +294 -0
- alem_env-0.1.0/alem/llm/alem_language_wrapper.py +2710 -0
- alem_env-0.1.0/alem/llm/alem_language_wrapper_single.py +515 -0
- alem_env-0.1.0/alem/llm/ascii_map.py +339 -0
- alem_env-0.1.0/alem_env.egg-info/PKG-INFO +580 -0
- alem_env-0.1.0/alem_env.egg-info/SOURCES.txt +203 -0
- alem_env-0.1.0/alem_env.egg-info/dependency_links.txt +1 -0
- alem_env-0.1.0/alem_env.egg-info/requires.txt +48 -0
- alem_env-0.1.0/alem_env.egg-info/top_level.txt +1 -0
- alem_env-0.1.0/pyproject.toml +115 -0
- alem_env-0.1.0/setup.cfg +4 -0
alem_env-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
Copyright (c) 2025
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
5
|
+
in the Software without restriction, including without limitation the rights
|
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
furnished to do so, subject to the following conditions:
|
|
9
|
+
|
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
|
11
|
+
copies or substantial portions of the Software.
|
|
12
|
+
|
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
19
|
+
SOFTWARE.
|
alem_env-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: alem-env
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A JAX environment for open-ended multi-agent coordination.
|
|
5
|
+
License: MIT
|
|
6
|
+
Project-URL: Homepage, https://github.com/alem-world/alem-env
|
|
7
|
+
Project-URL: Repository, https://github.com/alem-world/alem-env
|
|
8
|
+
Project-URL: Paper, https://arxiv.org/abs/2606.08340
|
|
9
|
+
Keywords: reinforcement-learning,multi-agent,jax,llm-agents,benchmark
|
|
10
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
13
|
+
Classifier: Intended Audience :: Science/Research
|
|
14
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
15
|
+
Requires-Python: <3.13,>=3.11
|
|
16
|
+
Description-Content-Type: text/markdown
|
|
17
|
+
License-File: LICENSE
|
|
18
|
+
Requires-Dist: chex>=0.1.90
|
|
19
|
+
Requires-Dist: flax==0.10.3
|
|
20
|
+
Requires-Dist: imageio>=2.37.0
|
|
21
|
+
Requires-Dist: jax==0.4.38
|
|
22
|
+
Requires-Dist: jaxlib==0.4.38
|
|
23
|
+
Requires-Dist: matplotlib>=3.8.0
|
|
24
|
+
Requires-Dist: numpy>=1.26.0
|
|
25
|
+
Requires-Dist: pillow>=10.0.0
|
|
26
|
+
Requires-Dist: scipy>=1.12.0
|
|
27
|
+
Requires-Dist: seaborn>=0.13.0
|
|
28
|
+
Provides-Extra: gpu
|
|
29
|
+
Requires-Dist: jax[cuda12]==0.4.38; extra == "gpu"
|
|
30
|
+
Provides-Extra: cuda12
|
|
31
|
+
Requires-Dist: jax[cuda12]==0.4.38; extra == "cuda12"
|
|
32
|
+
Provides-Extra: llm
|
|
33
|
+
Requires-Dist: openai>=1.0.0; extra == "llm"
|
|
34
|
+
Provides-Extra: play
|
|
35
|
+
Requires-Dist: pygame>=2.6.0; extra == "play"
|
|
36
|
+
Provides-Extra: baselines-rl
|
|
37
|
+
Requires-Dist: jaxmarl>=0.0.3; extra == "baselines-rl"
|
|
38
|
+
Requires-Dist: distrax>=0.1.5; extra == "baselines-rl"
|
|
39
|
+
Requires-Dist: optax>=0.2.0; extra == "baselines-rl"
|
|
40
|
+
Requires-Dist: orbax-checkpoint>=0.5.0; extra == "baselines-rl"
|
|
41
|
+
Requires-Dist: hydra-core>=1.3.0; extra == "baselines-rl"
|
|
42
|
+
Requires-Dist: omegaconf>=2.3.0; extra == "baselines-rl"
|
|
43
|
+
Requires-Dist: wandb>=0.16.0; extra == "baselines-rl"
|
|
44
|
+
Requires-Dist: pyyaml>=6.0; extra == "baselines-rl"
|
|
45
|
+
Provides-Extra: baselines-llm
|
|
46
|
+
Requires-Dist: hydra-core>=1.3.0; extra == "baselines-llm"
|
|
47
|
+
Requires-Dist: omegaconf>=2.3.0; extra == "baselines-llm"
|
|
48
|
+
Requires-Dist: wandb>=0.16.0; extra == "baselines-llm"
|
|
49
|
+
Requires-Dist: tqdm>=4.66.0; extra == "baselines-llm"
|
|
50
|
+
Requires-Dist: openai>=1.0.0; extra == "baselines-llm"
|
|
51
|
+
Requires-Dist: anthropic>=0.40.0; extra == "baselines-llm"
|
|
52
|
+
Requires-Dist: google-genai>=0.3.0; extra == "baselines-llm"
|
|
53
|
+
Provides-Extra: dev
|
|
54
|
+
Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
55
|
+
Requires-Dist: pytest-cov>=5.0.0; extra == "dev"
|
|
56
|
+
Requires-Dist: jaxtyping>=0.2.34; extra == "dev"
|
|
57
|
+
Requires-Dist: beartype>=0.18.0; extra == "dev"
|
|
58
|
+
Requires-Dist: ruff>=0.4.0; extra == "dev"
|
|
59
|
+
Dynamic: license-file
|
|
60
|
+
|
|
61
|
+
<h1 align="center">
|
|
62
|
+
<a href="https://arxiv.org/abs/2606.08340">
|
|
63
|
+
<img src="images/alem-logo-animated.gif" alt="Alem logo showing synchronous coordination" width="360" />
|
|
64
|
+
</a>
|
|
65
|
+
</h1>
|
|
66
|
+
|
|
67
|
+
<p align="center">
|
|
68
|
+
<a href="https://pypi.org/project/alem-env/"><img alt="PyPI" src="https://img.shields.io/pypi/v/alem-env.svg" /></a>
|
|
69
|
+
<a href="https://pypi.org/project/alem-env/"><img alt="Python versions" src="https://img.shields.io/pypi/pyversions/alem-env.svg" /></a>
|
|
70
|
+
<a href="https://github.com/alem-world/alem-env/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/alem-world/alem-env/actions/workflows/ci.yml/badge.svg" /></a>
|
|
71
|
+
<a href="LICENSE"><img alt="License: MIT" src="https://img.shields.io/badge/License-MIT-yellow.svg" /></a>
|
|
72
|
+
<a href="https://arxiv.org/abs/2606.08340"><img alt="arXiv:2606.08340" src="https://img.shields.io/badge/arXiv-2606.08340-b31b1b.svg" /></a>
|
|
73
|
+
<a href="https://huggingface.co/alem-world/alem-rl-baselines"><img alt="Hugging Face Models" src="https://img.shields.io/badge/%F0%9F%A4%97%20Hugging%20Face-Models-ffce1c.svg" /></a>
|
|
74
|
+
</p>
|
|
75
|
+
|
|
76
|
+
<p align="center">
|
|
77
|
+
<b><a href="https://alem-world.github.io/leaderboard">🏆 Leaderboard</a></b> · <a href="https://arxiv.org/abs/2606.08340">📄 Paper</a> · <a href="https://huggingface.co/alem-world/alem-rl-baselines">🤗 Models</a>
|
|
78
|
+
<!-- TODO: replace the leaderboard URL with the real reference-website link once it is live. -->
|
|
79
|
+
</p>
|
|
80
|
+
|
|
81
|
+
*Alem* is a JAX benchmark for open-ended multi-agent coordination. Building on [Craftax](https://github.com/MichaelTMatthews/Craftax) and [Multi-Agent Craftax / Craftax-Coop](https://github.com/BaselOmari/MA-Craftax), *Alem* introduces procedurally generated coordination tasks, soft specialisation, communication, and controllable coordination difficulty into a long-horizon survival world with exploration, crafting, trading, and combat. The same world is exposed through symbolic, pixel, and text interfaces, making it usable by MARL agents, language agents, and humans.
|
|
82
|
+
|
|
83
|
+
*Alem* means *world* in Amharic.
|
|
84
|
+
|
|
85
|
+
## Contents
|
|
86
|
+
|
|
87
|
+
[RL Playing](#rl-agents-playing) · [LLM Playing](#llm-agents-playing) · [Install](#install) · [Quick Start](#quick-start) · [Configure](#configure) · [RL Agents](#rl-agents) · [LLM Agents](#llm-agents) · [Baselines](#baselines) · [Human Play](#human-play) · [Docker](#docker) · [Package Layout](#package-layout) · [Development](#development) · [RL vs LLM Interfaces](#rl-vs-llm-interfaces) · [Reproduce the Paper](#reproduce-the-paper) · [Contributing](#contributing) · [Citation](#citation) · [License](#license)
|
|
88
|
+
|
|
89
|
+
## RL Agents Playing
|
|
90
|
+
|
|
91
|
+
A team of MARL agents controlling the three players from symbolic observations, each acting from its own egocentric view.
|
|
92
|
+
|
|
93
|
+
<p align="center">
|
|
94
|
+
<img src="images/sample_agents_playing.gif" alt="RL agents playing Alem" width="760" />
|
|
95
|
+
</p>
|
|
96
|
+
|
|
97
|
+
Fast to train end-to-end in JAX. Full MARL training code and reference baselines live in [`baselines/`](baselines) — see [Baselines](#baselines).
|
|
98
|
+
|
|
99
|
+
## LLM Agents Playing
|
|
100
|
+
|
|
101
|
+
The same world through the text interface. Each agent gets its own observation, broadcasts a free-form message to teammates every step and stores important information in scratchpad memory.
|
|
102
|
+
|
|
103
|
+
<p align="center">
|
|
104
|
+
<img src="images/llm_communication.gif" alt="LLM agents coordinating in Alem" width="820" />
|
|
105
|
+
</p>
|
|
106
|
+
|
|
107
|
+
<p align="center"><sub>Gemini 3.1 Pro (medium). <b>THINKING</b> = the agent's private plan; <b>MESSAGE</b> = what it broadcasts to the team.<br/><b>Each panel is held for several seconds so the reasoning is readable — this is not the agents' real decision speed.</b></sub></p>
|
|
108
|
+
|
|
109
|
+
The warrior plans turns ahead **and predicts how a teammate will react** — then it happens:
|
|
110
|
+
|
|
111
|
+
- **Plans ahead.** A turn-indexed plan `T87→T95`, with a fallback for the warrior's crafting-penalty.
|
|
112
|
+
- **Theory of mind.** *"A2 will get my message at T88, so they'll cancel their T90 action and wait for T95"* — and at T88, A2 does exactly that.
|
|
113
|
+
- **Coordinates out loud.** Lines all three up for a synchronous mine to earn the *Coord Mine Stone Hard* bonus.
|
|
114
|
+
|
|
115
|
+
See [LLM Agents](#llm-agents) to run it yourself.
|
|
116
|
+
|
|
117
|
+
<details>
|
|
118
|
+
<summary><b>👁️ Click to see what the agents actually see</b></summary>
|
|
119
|
+
|
|
120
|
+
<br>
|
|
121
|
+
|
|
122
|
+
Every step a language agent gets a **system prompt** (the rules, sent once) and a **text observation** (its current view), and must reply with an `<action>`, an optional `<communication>` broadcast, and an optional private `<scratchpad>`. We use **progressive disclosure**, where we only give relevant information for the current level in the prompt, and add information as agents get to more levels.
|
|
123
|
+
|
|
124
|
+
**System prompt template** — placeholders in `{…}` are filled per agent/run (abridged; the full rules are sent verbatim):
|
|
125
|
+
|
|
126
|
+
```text
|
|
127
|
+
You are Agent {id} ({role}) in a {num_agents}-agent cooperative survival game. Your goal is to gather resources, craft gear, fight monsters, and descend through {num_levels} dungeon levels, while coordinating with teammates. You must survive — if your health reaches zero, you die, and if all agents die the game ends. Maximize achievements while alive.
|
|
128
|
+
|
|
129
|
+
[ … full game rules: movement & facing, Do/interaction, crafting recipes, roles & specialist penalties, coordination (sync / handover / construction), the resource chain, and the {num_achievements} achievements …]
|
|
130
|
+
|
|
131
|
+
<output_format>
|
|
132
|
+
1. (Required) Exactly one action from the available list:
|
|
133
|
+
<action>YOUR_CHOSEN_ACTION</action>
|
|
134
|
+
2. (Optional) Broadcast to teammates, up to {comm_char_limit} chars:
|
|
135
|
+
<communication>YOUR_MESSAGE</communication>
|
|
136
|
+
3. (Optional) Private notes, up to {scratchpad_char_limit} chars — not shared; your only memory:
|
|
137
|
+
<scratchpad>YOUR_NOTES</scratchpad>
|
|
138
|
+
Token budget: {token_budget} tokens for the full response (including reasoning).
|
|
139
|
+
</output_format>
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**[View the full system prompt, filled in](SYSTEM_PROMPT.md)** (a concrete 3-agent example on overworld).
|
|
143
|
+
|
|
144
|
+
**Observation template** — the structure every agent receives each step:
|
|
145
|
+
|
|
146
|
+
```text
|
|
147
|
+
Step: {step}/{max_steps} ({steps_remaining} remaining, ends early if all agents die)
|
|
148
|
+
Position: (x={x}, y={y})
|
|
149
|
+
Role: {role}
|
|
150
|
+
Location: {dungeon_level}
|
|
151
|
+
Achievements: {unlocked}/{total} ({locked} unlock later)
|
|
152
|
+
|
|
153
|
+
You see:
|
|
154
|
+
- {object} {relative_position} (x={x}, y={y})
|
|
155
|
+
...one line per visible object...
|
|
156
|
+
|
|
157
|
+
Facing: {direction}. Do target: {object_in_front} (x={x}, y={y}).
|
|
158
|
+
|
|
159
|
+
Coordination:
|
|
160
|
+
- {object} (x={x}, y={y}): {how_this_object_must_be_coordinated}
|
|
161
|
+
...one line per coordination-relevant object...
|
|
162
|
+
|
|
163
|
+
Teammates:
|
|
164
|
+
Agent {id} ({role}): {relative_position} (x={x}, y={y}), health={hp}
|
|
165
|
+
...one line per teammate...
|
|
166
|
+
|
|
167
|
+
Your status: health {hp}, food {food}, drink {drink}, energy {energy}, mana {mana}, xp {xp}
|
|
168
|
+
Available actions: {legal_actions_this_step}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**Filled-in example** — what the warrior actually sees at step 0:
|
|
172
|
+
|
|
173
|
+
```text
|
|
174
|
+
Step: 0/10000 (10000 remaining, ends early if all agents die)
|
|
175
|
+
Position: (x=24, y=24)
|
|
176
|
+
Role: warrior
|
|
177
|
+
Location: Overworld (surface)
|
|
178
|
+
Achievements: 0/93 (39 unlock later)
|
|
179
|
+
|
|
180
|
+
You see:
|
|
181
|
+
- stone 5 steps east (x=29, y=24)
|
|
182
|
+
- tree 1 step north and 2 steps west (x=22, y=23)
|
|
183
|
+
- construction_site 2 steps north (x=24, y=22)
|
|
184
|
+
- iron 3 steps south and 5 steps east (x=29, y=27)
|
|
185
|
+
|
|
186
|
+
Facing: north. Do target: grass (x=24, y=23).
|
|
187
|
+
|
|
188
|
+
Coordination:
|
|
189
|
+
- construction_site (x=24, y=22): requires 3 agents to Build simultaneously (fails alone).
|
|
190
|
+
- tree (x=26, y=23): one agent begins, another completes it within 6 steps (handover).
|
|
191
|
+
- stone (x=20, y=21): works solo, but a bonus when 3 agents Do simultaneously.
|
|
192
|
+
|
|
193
|
+
Teammates:
|
|
194
|
+
Agent 1 (forager): 1 step east (x=25, y=24), health=9
|
|
195
|
+
Agent 2 (miner): 1 step south (x=24, y=25), health=9
|
|
196
|
+
|
|
197
|
+
Your status: health 9, food 9, drink 9, energy 9, mana 9, xp 0
|
|
198
|
+
Available actions: Noop, Move {West,East,North,South}, Do, Sleep, Rest, Request {Food,Drink,Wood,Stone,Iron,Coal,Diamond,Ruby,Sapphire}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
</details>
|
|
202
|
+
|
|
203
|
+
## Install
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
pip install alem-env # latest release from PyPI
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Or from source for development (editable install):
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
uv venv --python 3.12
|
|
213
|
+
source .venv/bin/activate # Linux / macOS
|
|
214
|
+
# .venv\Scripts\activate # Windows
|
|
215
|
+
uv pip install -e .
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
Optional extras (work with either `alem-env` or `-e .`):
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
uv pip install -e ".[llm]" # OpenAI-compatible LLM interface
|
|
222
|
+
uv pip install -e ".[play]" # pygame human-play example
|
|
223
|
+
uv pip install -e ".[gpu]" # NVIDIA CUDA 12 JAX wheels
|
|
224
|
+
uv pip install -e ".[baselines-rl]" # JAX MARL trainers (see Baselines)
|
|
225
|
+
uv pip install -e ".[baselines-llm]" # LLM-agent evaluation harness
|
|
226
|
+
uv pip install -e ".[dev]" # pytest, ruff, jaxtyping
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Plain `pip` also works (no uv required):
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
pip install -e .
|
|
233
|
+
pip install -e ".[gpu]"
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
> **Running scripts with uv:** Commands below use `uv run python …`, which uses `.venv` without a prior `source activate` (activating once and calling `python …` also works). Note: it's `uv run python script.py` — `uv python script.py` is not valid.
|
|
237
|
+
|
|
238
|
+
## Quick Start
|
|
239
|
+
|
|
240
|
+
```python
|
|
241
|
+
import jax
|
|
242
|
+
from alem.alem_env import make_alem_env_from_name
|
|
243
|
+
|
|
244
|
+
env = make_alem_env_from_name("Alem-Coop-Symbolic")
|
|
245
|
+
obs, state = env.reset(jax.random.PRNGKey(0))
|
|
246
|
+
|
|
247
|
+
rng_act = jax.random.split(jax.random.PRNGKey(1), env.num_agents)
|
|
248
|
+
actions = {
|
|
249
|
+
agent: env.action_space(agent).sample(rng_act[i])
|
|
250
|
+
for i, agent in enumerate(env.agents)
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
obs, state, rewards, dones, infos = env.step(jax.random.PRNGKey(2), state, actions)
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
Available environments:
|
|
257
|
+
|
|
258
|
+
| Name | Description |
|
|
259
|
+
| --------------------------- | -------------------------------------------------------- |
|
|
260
|
+
| `Alem-Coop-Symbolic` | Full multi-agent environment, symbolic observations |
|
|
261
|
+
| `Alem-Coop-Pixels` | Full multi-agent environment, pixel observations |
|
|
262
|
+
| `Alem-Coop-Symbolic-Debug` | Smaller debug environment, only overworld (first floor). |
|
|
263
|
+
| `Alem-SingleAgent-Symbolic` | Single-agent variant (experimental) |
|
|
264
|
+
|
|
265
|
+
## Configure
|
|
266
|
+
|
|
267
|
+
```python
|
|
268
|
+
from alem.alem_coop.alem_state import EnvParams, StaticEnvParams, get_coordination_params
|
|
269
|
+
|
|
270
|
+
env_params = EnvParams().replace(
|
|
271
|
+
**get_coordination_params("easy"),
|
|
272
|
+
soft_specialization=True,
|
|
273
|
+
shared_reward=False,
|
|
274
|
+
)
|
|
275
|
+
static_env_params = StaticEnvParams(player_count=3, num_comm_channels=4)
|
|
276
|
+
|
|
277
|
+
env = make_alem_env_from_name(
|
|
278
|
+
"Alem-Coop-Symbolic",
|
|
279
|
+
env_params=env_params,
|
|
280
|
+
static_env_params=static_env_params,
|
|
281
|
+
)
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
Coordination difficulty can be `"none"`, `"easy"`, `"medium"`, `"hard"`, or a numeric alpha in `[0, 1]`.
|
|
285
|
+
|
|
286
|
+
## RL Agents
|
|
287
|
+
|
|
288
|
+
A minimal framework-free rollout using symbolic observations and legal action masks:
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
uv run python examples/random_rl_agent.py --coord easy --steps 100
|
|
292
|
+
uv run python examples/random_rl_agent.py --players 2 --coord hard --steps 200
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
The example uses a jitted `lax.scan` loop and can serve as a template for custom policies. Full MARL training recipes (IPPO, HyperMARL-IPPO, MAPPO, PQN-VDN) live in [`baselines/`](baselines) — see [Baselines](#baselines).
|
|
296
|
+
|
|
297
|
+
## LLM Agents
|
|
298
|
+
|
|
299
|
+
Preview 3-agent text observations without any model calls:
|
|
300
|
+
|
|
301
|
+
```bash
|
|
302
|
+
uv run python examples/llm_text_smoke.py --coord easy --show-affordances
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
Run one 3-agent step with any OpenAI-compatible model:
|
|
306
|
+
|
|
307
|
+
```bash
|
|
308
|
+
export OPENAI_API_KEY=sk-...
|
|
309
|
+
uv run python examples/llm_openai_smoke.py --model gpt-4o-mini --steps 1
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
Local vLLM server:
|
|
313
|
+
|
|
314
|
+
```bash
|
|
315
|
+
uv run python examples/llm_openai_smoke.py \
|
|
316
|
+
--base-url http://localhost:8000/v1 \
|
|
317
|
+
--api-key EMPTY \
|
|
318
|
+
--model meta-llama/Llama-3.2-1B-Instruct \
|
|
319
|
+
--steps 1
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
Full LLM evaluation runners live in [`baselines/llm/`](baselines/llm) — see [Baselines](#baselines).
|
|
323
|
+
|
|
324
|
+
## Baselines
|
|
325
|
+
|
|
326
|
+
Reference MARL training code and the LLM-agent evaluation harness live in this repo under [`baselines/`](baselines). Following the [CleanRL](https://github.com/vwxyzjn/cleanrl) philosophy — and [JaxMARL](https://github.com/FLAIROx/JaxMARL), which these are adapted from — each RL algorithm is a single self-contained file with a matching [Hydra](https://hydra.cc) config in `baselines/config/`.
|
|
327
|
+
|
|
328
|
+
Install only the set you need:
|
|
329
|
+
|
|
330
|
+
```bash
|
|
331
|
+
uv pip install -e ".[baselines-rl]" # JAX MARL trainers (IPPO / MAPPO / PQN-VDN / HyperMARL)
|
|
332
|
+
uv pip install -e ".[baselines-llm]" # LLM-agent evaluation harness
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### RL training
|
|
336
|
+
|
|
337
|
+
| Algorithm | Entry point | Reference |
|
|
338
|
+
| ------------------------------- | --------------------------------- | ------------------------------------------------------ |
|
|
339
|
+
| IPPO (RNN, shared params) | `baselines/ippo_rnn.py` | [IPPO](https://arxiv.org/abs/2011.09533) |
|
|
340
|
+
| IPPO (RNN, no param sharing) | `baselines/ippo_rnn_nops.py` | [IPPO](https://arxiv.org/abs/2011.09533) |
|
|
341
|
+
| HyperMARL-IPPO (RNN) | `baselines/ippo_hypermarl_rnn.py` | [HyperMARL](https://arxiv.org/abs/2412.04233) ([code](https://github.com/KaleabTessera/HyperMARL)) |
|
|
342
|
+
| MAPPO (RNN) | `baselines/mappo_rnn.py` | [MAPPO](https://arxiv.org/abs/2103.01955) |
|
|
343
|
+
| PQN-VDN (RNN) | `baselines/pqn_vdn_rnn.py` | [PQN](https://arxiv.org/abs/2407.04811) ([code](https://github.com/mttga/purejaxql)) |
|
|
344
|
+
|
|
345
|
+
Run the baselines from the `baselines/` directory and override config values on the command line:
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
cd baselines
|
|
349
|
+
python ippo_rnn.py
|
|
350
|
+
python mappo_rnn.py coordination_difficulty=hard # override any config value
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### Running stored policies
|
|
354
|
+
|
|
355
|
+
Pretrained RL checkpoints from the paper are on the Hugging Face Hub at
|
|
356
|
+
[**alem-world/alem-rl-baselines**](https://huggingface.co/alem-world/alem-rl-baselines):
|
|
357
|
+
120 checkpoints = 2 training budgets (`100M`, `1B` env steps) × 4 algorithms × 3
|
|
358
|
+
difficulties × 5 seeds, laid out as `<budget>/<algorithm>/<difficulty>/seed<N>/`.
|
|
359
|
+
|
|
360
|
+
Each trainer can skip training and instead restore a saved checkpoint, then run the
|
|
361
|
+
same final evaluation (and visualization) used after training. Download the checkpoints,
|
|
362
|
+
then pass `LOAD_CHECKPOINT` pointing at the checkpoint directory:
|
|
363
|
+
|
|
364
|
+
```bash
|
|
365
|
+
# 1. Download the checkpoints (needs: pip install -U huggingface_hub)
|
|
366
|
+
hf download alem-world/alem-rl-baselines --local-dir alem-rl-baselines
|
|
367
|
+
|
|
368
|
+
# 2. Reload and evaluate an IPPO policy (note NUM_COMM_CHANNELS=4)
|
|
369
|
+
cd baselines
|
|
370
|
+
python ippo_rnn.py \
|
|
371
|
+
+LOAD_CHECKPOINT=../alem-rl-baselines/1B/ippo-rnn/hard/seed0/checkpoint \
|
|
372
|
+
NUM_COMM_CHANNELS=4 \
|
|
373
|
+
EVAL_DIFFICULTIES=[hard] \
|
|
374
|
+
+VISUALIZE=True
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
Gifs are saved in `./outputs/`, set `VISUALIZE=False` to skip rendering and only run the numeric evaluation.
|
|
378
|
+
|
|
379
|
+
> **Important — the config must match how the checkpoint was trained.** Checkpoint
|
|
380
|
+
> shapes are fixed at training time, so the env config (number of agents, communication
|
|
381
|
+
> channels, etc.) must match or the restore will fail with a shape mismatch. The released
|
|
382
|
+
> checkpoints were all trained with **4 communication channels**, so load them with
|
|
383
|
+
> `NUM_COMM_CHANNELS=4`. The exact overrides for any checkpoint are stored under
|
|
384
|
+
> `reload_overrides` in its `config.json`.
|
|
385
|
+
|
|
386
|
+
### LLM-agent evaluation
|
|
387
|
+
|
|
388
|
+
The harness (derived from [BALROG](https://github.com/balrog-ai/BALROG)) drives 3 language agents through the text interface and supports vLLM, OpenAI, Anthropic, Gemini, and other OpenAI-compatible providers. See [`baselines/llm/README.md`](baselines/llm/README.md) for full launch commands and configuration.
|
|
389
|
+
|
|
390
|
+
```bash
|
|
391
|
+
cd baselines/llm
|
|
392
|
+
export OPENAI_API_KEY=sk-...
|
|
393
|
+
python eval_alem.py \
|
|
394
|
+
clients.0.client_name=openai \
|
|
395
|
+
clients.1.client_name=openai \
|
|
396
|
+
clients.2.client_name=openai
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
## Human Play
|
|
400
|
+
|
|
401
|
+
Install the optional play dependencies first:
|
|
402
|
+
|
|
403
|
+
```bash
|
|
404
|
+
uv pip install -e ".[play]"
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
```bash
|
|
408
|
+
uv run python examples/play_alem.py
|
|
409
|
+
uv run python examples/play_alem.py --players 3 --coord easy --seed 42
|
|
410
|
+
uv run python examples/play_alem.py --players 2 --coord hard --god
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
| Key | Action |
|
|
414
|
+
| ----------- | ---------------- |
|
|
415
|
+
| `W A S D` | Move |
|
|
416
|
+
| `Space` | Do / interact |
|
|
417
|
+
| `Tab` | Sleep |
|
|
418
|
+
| `E` | Rest |
|
|
419
|
+
| `.` / `,` | Descend / ascend |
|
|
420
|
+
| `Backspace` | Give to teammate |
|
|
421
|
+
| `Q` | No-op |
|
|
422
|
+
|
|
423
|
+
The game advances after all players have chosen an action.
|
|
424
|
+
|
|
425
|
+
## Docker
|
|
426
|
+
|
|
427
|
+
**Build:**
|
|
428
|
+
|
|
429
|
+
```bash
|
|
430
|
+
# CPU (default)
|
|
431
|
+
docker build -f docker/Dockerfile.env -t alem-env .
|
|
432
|
+
|
|
433
|
+
# GPU — NVIDIA CUDA 12
|
|
434
|
+
docker build -f docker/Dockerfile.env --build-arg ALEM_ACCELERATOR=cuda12 -t alem-env:gpu .
|
|
435
|
+
|
|
436
|
+
# With optional extras (e.g. LLM + play)
|
|
437
|
+
docker build -f docker/Dockerfile.env --build-arg ALEM_EXTRAS=llm,play -t alem-env:extras .
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
**Run:**
|
|
441
|
+
|
|
442
|
+
The image uses the system Python (`UV_SYSTEM_PYTHON=1`), so inside a container you call `python` directly — no `uv run` prefix needed.
|
|
443
|
+
|
|
444
|
+
```bash
|
|
445
|
+
# Smoke test — confirms the install works (default CMD)
|
|
446
|
+
docker run --rm alem-env
|
|
447
|
+
docker run --rm --gpus all alem-env:gpu
|
|
448
|
+
|
|
449
|
+
# Run examples
|
|
450
|
+
docker run --rm alem-env python examples/random_rl_agent.py --steps 20
|
|
451
|
+
docker run --rm alem-env python examples/llm_text_smoke.py --coord easy
|
|
452
|
+
|
|
453
|
+
# LLM smoke test (pass your API key)
|
|
454
|
+
docker run --rm -e OPENAI_API_KEY=$OPENAI_API_KEY alem-env:extras \
|
|
455
|
+
python examples/llm_openai_smoke.py --model gpt-4o-mini --steps 1
|
|
456
|
+
|
|
457
|
+
# Interactive shell
|
|
458
|
+
docker run --rm -it alem-env bash
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
> **Human play is easiest natively** — `uv pip install -e ".[play]"` then `uv run python examples/play_alem.py`. Pygame opens a real window with no display plumbing.
|
|
462
|
+
|
|
463
|
+
<details>
|
|
464
|
+
<summary><b>Running human play inside Docker (X11 setup)</b></summary>
|
|
465
|
+
|
|
466
|
+
<br>
|
|
467
|
+
|
|
468
|
+
Inside Docker, human play needs an X11 display *and* an image built with the `play` extra (so the SDL/X11 libs are present):
|
|
469
|
+
|
|
470
|
+
```bash
|
|
471
|
+
# Build with the play extra (adds pygame + SDL/X11 runtime libs)
|
|
472
|
+
docker build -f docker/Dockerfile.env --build-arg ALEM_EXTRAS=play -t alem-env:play .
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
- **Linux:** grant the container access to your X server first (this is the step that's usually missing when the window never appears), then run it:
|
|
476
|
+
```bash
|
|
477
|
+
xhost +local:root
|
|
478
|
+
docker run --rm -it --network host -e DISPLAY=$DISPLAY \
|
|
479
|
+
-v /tmp/.X11-unix:/tmp/.X11-unix alem-env:play python examples/play_alem.py
|
|
480
|
+
xhost -local:root # revoke when done
|
|
481
|
+
```
|
|
482
|
+
- **macOS / Windows:** start XQuartz (macOS) or VcXsrv (Windows), enable "allow connections from network clients", then set `DISPLAY` accordingly.
|
|
483
|
+
|
|
484
|
+
</details>
|
|
485
|
+
|
|
486
|
+
## Package Layout
|
|
487
|
+
|
|
488
|
+
<details>
|
|
489
|
+
<summary><b>Repository map — where each piece lives</b></summary>
|
|
490
|
+
|
|
491
|
+
<br>
|
|
492
|
+
|
|
493
|
+
| Path | Purpose |
|
|
494
|
+
| ------------------------------ | --------------------------------------------------------------------- |
|
|
495
|
+
| `alem/alem_env.py` | Environment factory |
|
|
496
|
+
| `alem/alem_coop/envs/` | Symbolic, pixel, debug, and single-agent env classes |
|
|
497
|
+
| `alem/alem_coop/alem_state.py` | State dataclasses and `EnvParams` / `StaticEnvParams` |
|
|
498
|
+
| `alem/alem_coop/game_logic.py` | Step logic: movement, resources, combat, crafting, coordination |
|
|
499
|
+
| `alem/alem_coop/world_gen/` | Procedural world generation |
|
|
500
|
+
| `alem/alem_coop/renderer/` | Symbolic, pixel, and text renderers |
|
|
501
|
+
| `alem/alem_coop/constants.py` | Actions, achievements, blocks, items, textures |
|
|
502
|
+
| `alem/llm/` | Text observations, action parsing, ASCII maps, LLM evaluator adapters |
|
|
503
|
+
| `examples/random_rl_agent.py` | Masked-random symbolic rollout (RL template) |
|
|
504
|
+
| `examples/llm_text_smoke.py` | Preview text observations without model calls |
|
|
505
|
+
| `examples/llm_openai_smoke.py` | One-step OpenAI-compatible LLM smoke test |
|
|
506
|
+
| `examples/play_alem.py` | Human pygame player |
|
|
507
|
+
|
|
508
|
+
</details>
|
|
509
|
+
|
|
510
|
+
## Development
|
|
511
|
+
|
|
512
|
+
```bash
|
|
513
|
+
uv pip install -e ".[dev]" # pytest, ruff, jaxtyping
|
|
514
|
+
uv run pytest alem/tests/ # run the test suite
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
<details>
|
|
518
|
+
<summary><b>Lint & format (ruff)</b></summary>
|
|
519
|
+
|
|
520
|
+
<br>
|
|
521
|
+
|
|
522
|
+
Code style is enforced with [ruff](https://docs.astral.sh/ruff/) (config in `pyproject.toml`). CI runs these checks before the test suite, so run them locally first:
|
|
523
|
+
|
|
524
|
+
```bash
|
|
525
|
+
uv run ruff check . # lint
|
|
526
|
+
uv run ruff format --check . # verify formatting
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
To auto-fix before committing:
|
|
530
|
+
|
|
531
|
+
```bash
|
|
532
|
+
uv run ruff check --fix . # apply safe lint fixes
|
|
533
|
+
uv run ruff format . # format the code
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
</details>
|
|
537
|
+
|
|
538
|
+
## RL vs LLM Interfaces
|
|
539
|
+
|
|
540
|
+
Both interfaces drive the **same** environment but are **not directly comparable** -- treat cross-paradigm scores as indicative, not head-to-head.
|
|
541
|
+
|
|
542
|
+
| | MARL (symbolic) | LLM (text) |
|
|
543
|
+
| ------------------- | -------------------------------------------------------- | --------------------------------------------------------------------------------- |
|
|
544
|
+
| **Observation** | Numeric vector | Natural-language text |
|
|
545
|
+
| **Communication** | A discrete signal on one of `num_comm_channels` (e.g. 4) | Free-form text, ≤ 400 chars |
|
|
546
|
+
| **Comms vs acting** | Costs your action that turn | Sent alongside the action |
|
|
547
|
+
| **Memory** | Recurrent hidden state | Private `<scratchpad>` notes — not shared; the agent's only memory across steps. |
|
|
548
|
+
| **Learning** | Trained from reward | Zero-shot |
|
|
549
|
+
|
|
550
|
+
(`Request`/`Give` resource transfers are ordinary actions in both.)
|
|
551
|
+
|
|
552
|
+
Text observations apply lightweight preprocessing, including compact local-state summaries (inspired by [BALROG](https://github.com/balrog-ai/BALROG/blob/b7afe79e3e4265811cfa985ed7c95c4d1a11e3f5/balrog/environments/crafter/env.py#L129)) and action affordances. See the [language wrapper](alem/llm/alem_language_wrapper.py) for details.
|
|
553
|
+
|
|
554
|
+
## Reproduce the Paper
|
|
555
|
+
|
|
556
|
+
The full experiments from the paper — the 13-LLM evaluation and the RL baselines (IPPO, HyperMARL-IPPO, MAPPO, PQN-VDN) — live in [`baselines/`](baselines); see [Baselines](#baselines) for launch commands and configs.
|
|
557
|
+
|
|
558
|
+
The paper's numbers were produced against *Alem* [`v0.1.0`](https://github.com/alem-world/alem-env/releases/tag/v0.1.0). For the exact settings to use when reporting an Alem number — seeds, episode count, metrics — see the canonical [evaluation protocol](EVALUATION.md).
|
|
559
|
+
|
|
560
|
+
## Contributing
|
|
561
|
+
|
|
562
|
+
Contributions are welcome — new baselines, bug fixes, docs, and coordination tasks. See [`CONTRIBUTING.md`](CONTRIBUTING.md) for the dev setup, lint/test workflow, and PR checklist, and [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) for community expectations. To put a result on the [leaderboard](https://alem-world.github.io/leaderboard), follow the submission instructions there.
|
|
563
|
+
|
|
564
|
+
## Citation
|
|
565
|
+
|
|
566
|
+
```bibtex
|
|
567
|
+
@article{tessera2026alem,
|
|
568
|
+
title = {Benchmarking Open-Ended Multi-Agent Coordination in Language Agents},
|
|
569
|
+
author = {Tessera, {Kale-ab} Abebe and Szecsenyi, Andras and Barker, Cameron and
|
|
570
|
+
Rutherford, Alexander and Paglieri, Davide and Scannell, Aidan and
|
|
571
|
+
Gouk, Henry and Crowley, Elliot J. and Rockt\"{a}schel, Tim and
|
|
572
|
+
Storkey, Amos},
|
|
573
|
+
year = {2026},
|
|
574
|
+
url = {https://arxiv.org/abs/2606.08340}
|
|
575
|
+
}
|
|
576
|
+
```
|
|
577
|
+
|
|
578
|
+
## License
|
|
579
|
+
|
|
580
|
+
MIT. See `LICENSE`.
|