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.
Files changed (205) hide show
  1. alem_env-0.1.0/LICENSE +19 -0
  2. alem_env-0.1.0/PKG-INFO +580 -0
  3. alem_env-0.1.0/README.md +520 -0
  4. alem_env-0.1.0/alem/__init__.py +7 -0
  5. alem_env-0.1.0/alem/alem_coop/__init__.py +0 -0
  6. alem_env-0.1.0/alem/alem_coop/action_masking.py +384 -0
  7. alem_env-0.1.0/alem/alem_coop/alem_state.py +649 -0
  8. alem_env-0.1.0/alem/alem_coop/assets/0.png +0 -0
  9. alem_env-0.1.0/alem/alem_coop/assets/1.png +0 -0
  10. alem_env-0.1.0/alem/alem_coop/assets/2.png +0 -0
  11. alem_env-0.1.0/alem/alem_coop/assets/3.png +0 -0
  12. alem_env-0.1.0/alem/alem_coop/assets/4.png +0 -0
  13. alem_env-0.1.0/alem/alem_coop/assets/5.png +0 -0
  14. alem_env-0.1.0/alem/alem_coop/assets/6.png +0 -0
  15. alem_env-0.1.0/alem/alem_coop/assets/7.png +0 -0
  16. alem_env-0.1.0/alem/alem_coop/assets/8.png +0 -0
  17. alem_env-0.1.0/alem/alem_coop/assets/9.png +0 -0
  18. alem_env-0.1.0/alem/alem_coop/assets/arrow-down.png +0 -0
  19. alem_env-0.1.0/alem/alem_coop/assets/arrow-left.png +0 -0
  20. alem_env-0.1.0/alem/alem_coop/assets/arrow-right.png +0 -0
  21. alem_env-0.1.0/alem/alem_coop/assets/arrow-up.png +0 -0
  22. alem_env-0.1.0/alem/alem_coop/assets/arrow_fire_enchantment.png +0 -0
  23. alem_env-0.1.0/alem/alem_coop/assets/arrow_ice_enchantment.png +0 -0
  24. alem_env-0.1.0/alem/alem_coop/assets/bat.png +0 -0
  25. alem_env-0.1.0/alem/alem_coop/assets/book.png +0 -0
  26. alem_env-0.1.0/alem/alem_coop/assets/boots_fire_enchantment.png +0 -0
  27. alem_env-0.1.0/alem/alem_coop/assets/boots_ice_enchantment.png +0 -0
  28. alem_env-0.1.0/alem/alem_coop/assets/bow.png +0 -0
  29. alem_env-0.1.0/alem/alem_coop/assets/buffalo.png +0 -0
  30. alem_env-0.1.0/alem/alem_coop/assets/chest.png +0 -0
  31. alem_env-0.1.0/alem/alem_coop/assets/chestplate_fire_enchantment.png +0 -0
  32. alem_env-0.1.0/alem/alem_coop/assets/chestplate_ice_enchantment.png +0 -0
  33. alem_env-0.1.0/alem/alem_coop/assets/clock.png +0 -0
  34. alem_env-0.1.0/alem/alem_coop/assets/coal.png +0 -0
  35. alem_env-0.1.0/alem/alem_coop/assets/construction_in_progress.png +0 -0
  36. alem_env-0.1.0/alem/alem_coop/assets/construction_site.png +0 -0
  37. alem_env-0.1.0/alem/alem_coop/assets/cow.png +0 -0
  38. alem_env-0.1.0/alem/alem_coop/assets/dagger.png +0 -0
  39. alem_env-0.1.0/alem/alem_coop/assets/debug-2.png +0 -0
  40. alem_env-0.1.0/alem/alem_coop/assets/debug-3.png +0 -0
  41. alem_env-0.1.0/alem/alem_coop/assets/debug.png +0 -0
  42. alem_env-0.1.0/alem/alem_coop/assets/debug_tile.png +0 -0
  43. alem_env-0.1.0/alem/alem_coop/assets/deep_thing.png +0 -0
  44. alem_env-0.1.0/alem/alem_coop/assets/dexterity.png +0 -0
  45. alem_env-0.1.0/alem/alem_coop/assets/diamond.png +0 -0
  46. alem_env-0.1.0/alem/alem_coop/assets/diamond_boots.png +0 -0
  47. alem_env-0.1.0/alem/alem_coop/assets/diamond_chestplate.png +0 -0
  48. alem_env-0.1.0/alem/alem_coop/assets/diamond_helmet.png +0 -0
  49. alem_env-0.1.0/alem/alem_coop/assets/diamond_pants.png +0 -0
  50. alem_env-0.1.0/alem/alem_coop/assets/diamond_pickaxe.png +0 -0
  51. alem_env-0.1.0/alem/alem_coop/assets/diamond_sword.png +0 -0
  52. alem_env-0.1.0/alem/alem_coop/assets/drink.png +0 -0
  53. alem_env-0.1.0/alem/alem_coop/assets/enchantment_table_fire.png +0 -0
  54. alem_env-0.1.0/alem/alem_coop/assets/enchantment_table_ice.png +0 -0
  55. alem_env-0.1.0/alem/alem_coop/assets/energy.png +0 -0
  56. alem_env-0.1.0/alem/alem_coop/assets/epic_beacon.png +0 -0
  57. alem_env-0.1.0/alem/alem_coop/assets/epic_forge.png +0 -0
  58. alem_env-0.1.0/alem/alem_coop/assets/epic_shelter.png +0 -0
  59. alem_env-0.1.0/alem/alem_coop/assets/fence.png +0 -0
  60. alem_env-0.1.0/alem/alem_coop/assets/fire_elemental.png +0 -0
  61. alem_env-0.1.0/alem/alem_coop/assets/fire_grass.png +0 -0
  62. alem_env-0.1.0/alem/alem_coop/assets/fire_stone.png +0 -0
  63. alem_env-0.1.0/alem/alem_coop/assets/fire_tree.png +0 -0
  64. alem_env-0.1.0/alem/alem_coop/assets/fireball.png +0 -0
  65. alem_env-0.1.0/alem/alem_coop/assets/food.png +0 -0
  66. alem_env-0.1.0/alem/alem_coop/assets/forager.png +0 -0
  67. alem_env-0.1.0/alem/alem_coop/assets/fountain.png +0 -0
  68. alem_env-0.1.0/alem/alem_coop/assets/frost_troll.png +0 -0
  69. alem_env-0.1.0/alem/alem_coop/assets/furnace.png +0 -0
  70. alem_env-0.1.0/alem/alem_coop/assets/gnome_archer.png +0 -0
  71. alem_env-0.1.0/alem/alem_coop/assets/gnome_warrior.png +0 -0
  72. alem_env-0.1.0/alem/alem_coop/assets/grass.png +0 -0
  73. alem_env-0.1.0/alem/alem_coop/assets/grave.png +0 -0
  74. alem_env-0.1.0/alem/alem_coop/assets/grave2.png +0 -0
  75. alem_env-0.1.0/alem/alem_coop/assets/grave3.png +0 -0
  76. alem_env-0.1.0/alem/alem_coop/assets/gravel.png +0 -0
  77. alem_env-0.1.0/alem/alem_coop/assets/heal_cross.png +0 -0
  78. alem_env-0.1.0/alem/alem_coop/assets/health.png +0 -0
  79. alem_env-0.1.0/alem/alem_coop/assets/helmet_fire_enchantment.png +0 -0
  80. alem_env-0.1.0/alem/alem_coop/assets/helmet_ice_enchantment.png +0 -0
  81. alem_env-0.1.0/alem/alem_coop/assets/ice_elemental.png +0 -0
  82. alem_env-0.1.0/alem/alem_coop/assets/ice_grass.png +0 -0
  83. alem_env-0.1.0/alem/alem_coop/assets/ice_shrub.png +0 -0
  84. alem_env-0.1.0/alem/alem_coop/assets/iceball.png +0 -0
  85. alem_env-0.1.0/alem/alem_coop/assets/intelligence.png +0 -0
  86. alem_env-0.1.0/alem/alem_coop/assets/iron.png +0 -0
  87. alem_env-0.1.0/alem/alem_coop/assets/iron_boots.png +0 -0
  88. alem_env-0.1.0/alem/alem_coop/assets/iron_chestplate.png +0 -0
  89. alem_env-0.1.0/alem/alem_coop/assets/iron_helmet.png +0 -0
  90. alem_env-0.1.0/alem/alem_coop/assets/iron_pants.png +0 -0
  91. alem_env-0.1.0/alem/alem_coop/assets/iron_pickaxe.png +0 -0
  92. alem_env-0.1.0/alem/alem_coop/assets/iron_sword.png +0 -0
  93. alem_env-0.1.0/alem/alem_coop/assets/knight.png +0 -0
  94. alem_env-0.1.0/alem/alem_coop/assets/knight_archer.png +0 -0
  95. alem_env-0.1.0/alem/alem_coop/assets/kobold.png +0 -0
  96. alem_env-0.1.0/alem/alem_coop/assets/ladder_down.png +0 -0
  97. alem_env-0.1.0/alem/alem_coop/assets/ladder_down_blocked.png +0 -0
  98. alem_env-0.1.0/alem/alem_coop/assets/ladder_up.png +0 -0
  99. alem_env-0.1.0/alem/alem_coop/assets/large_cow.png +0 -0
  100. alem_env-0.1.0/alem/alem_coop/assets/lava.png +0 -0
  101. alem_env-0.1.0/alem/alem_coop/assets/leaves.png +0 -0
  102. alem_env-0.1.0/alem/alem_coop/assets/lizard.png +0 -0
  103. alem_env-0.1.0/alem/alem_coop/assets/log.png +0 -0
  104. alem_env-0.1.0/alem/alem_coop/assets/mana.png +0 -0
  105. alem_env-0.1.0/alem/alem_coop/assets/message_bubble.png +0 -0
  106. alem_env-0.1.0/alem/alem_coop/assets/miner.png +0 -0
  107. alem_env-0.1.0/alem/alem_coop/assets/necromancer.png +0 -0
  108. alem_env-0.1.0/alem/alem_coop/assets/necromancer_vulnerable.png +0 -0
  109. alem_env-0.1.0/alem/alem_coop/assets/orc_mage.png +0 -0
  110. alem_env-0.1.0/alem/alem_coop/assets/orc_soldier.png +0 -0
  111. alem_env-0.1.0/alem/alem_coop/assets/pants_fire_enchantment.png +0 -0
  112. alem_env-0.1.0/alem/alem_coop/assets/pants_ice_enchantment.png +0 -0
  113. alem_env-0.1.0/alem/alem_coop/assets/path.png +0 -0
  114. alem_env-0.1.0/alem/alem_coop/assets/path_moss.png +0 -0
  115. alem_env-0.1.0/alem/alem_coop/assets/pigman.png +0 -0
  116. alem_env-0.1.0/alem/alem_coop/assets/plant-ripe.png +0 -0
  117. alem_env-0.1.0/alem/alem_coop/assets/plant-young.png +0 -0
  118. alem_env-0.1.0/alem/alem_coop/assets/plant.png +0 -0
  119. alem_env-0.1.0/alem/alem_coop/assets/plant_on_grass.png +0 -0
  120. alem_env-0.1.0/alem/alem_coop/assets/player-dead.png +0 -0
  121. alem_env-0.1.0/alem/alem_coop/assets/player-down.png +0 -0
  122. alem_env-0.1.0/alem/alem_coop/assets/player-exchange.png +0 -0
  123. alem_env-0.1.0/alem/alem_coop/assets/player-left.png +0 -0
  124. alem_env-0.1.0/alem/alem_coop/assets/player-right.png +0 -0
  125. alem_env-0.1.0/alem/alem_coop/assets/player-sleep.png +0 -0
  126. alem_env-0.1.0/alem/alem_coop/assets/player-up.png +0 -0
  127. alem_env-0.1.0/alem/alem_coop/assets/player.png +0 -0
  128. alem_env-0.1.0/alem/alem_coop/assets/pointer-right-dead.png +0 -0
  129. alem_env-0.1.0/alem/alem_coop/assets/pointer-right.png +0 -0
  130. alem_env-0.1.0/alem/alem_coop/assets/pointer-top-right-dead.png +0 -0
  131. alem_env-0.1.0/alem/alem_coop/assets/pointer-top-right.png +0 -0
  132. alem_env-0.1.0/alem/alem_coop/assets/potion_blue.png +0 -0
  133. alem_env-0.1.0/alem/alem_coop/assets/potion_cyan.png +0 -0
  134. alem_env-0.1.0/alem/alem_coop/assets/potion_green.png +0 -0
  135. alem_env-0.1.0/alem/alem_coop/assets/potion_pink.png +0 -0
  136. alem_env-0.1.0/alem/alem_coop/assets/potion_red.png +0 -0
  137. alem_env-0.1.0/alem/alem_coop/assets/potion_yellow.png +0 -0
  138. alem_env-0.1.0/alem/alem_coop/assets/ripe_plant_on_grass.png +0 -0
  139. alem_env-0.1.0/alem/alem_coop/assets/ruby.png +0 -0
  140. alem_env-0.1.0/alem/alem_coop/assets/sand.png +0 -0
  141. alem_env-0.1.0/alem/alem_coop/assets/sapling.png +0 -0
  142. alem_env-0.1.0/alem/alem_coop/assets/sapphire.png +0 -0
  143. alem_env-0.1.0/alem/alem_coop/assets/skeleton.png +0 -0
  144. alem_env-0.1.0/alem/alem_coop/assets/slimeball.png +0 -0
  145. alem_env-0.1.0/alem/alem_coop/assets/snail.png +0 -0
  146. alem_env-0.1.0/alem/alem_coop/assets/spider.png +0 -0
  147. alem_env-0.1.0/alem/alem_coop/assets/stalagmite.png +0 -0
  148. alem_env-0.1.0/alem/alem_coop/assets/stone.png +0 -0
  149. alem_env-0.1.0/alem/alem_coop/assets/stone_pickaxe.png +0 -0
  150. alem_env-0.1.0/alem/alem_coop/assets/stone_sword.png +0 -0
  151. alem_env-0.1.0/alem/alem_coop/assets/strength.png +0 -0
  152. alem_env-0.1.0/alem/alem_coop/assets/sword_fire_enchantment.png +0 -0
  153. alem_env-0.1.0/alem/alem_coop/assets/sword_ice_enchantment.png +0 -0
  154. alem_env-0.1.0/alem/alem_coop/assets/table.png +0 -0
  155. alem_env-0.1.0/alem/alem_coop/assets/torch_in_inventory.png +0 -0
  156. alem_env-0.1.0/alem/alem_coop/assets/torch_on_path.png +0 -0
  157. alem_env-0.1.0/alem/alem_coop/assets/tree.png +0 -0
  158. alem_env-0.1.0/alem/alem_coop/assets/troll.png +0 -0
  159. alem_env-0.1.0/alem/alem_coop/assets/unknown.png +0 -0
  160. alem_env-0.1.0/alem/alem_coop/assets/wall.png +0 -0
  161. alem_env-0.1.0/alem/alem_coop/assets/wall2.png +0 -0
  162. alem_env-0.1.0/alem/alem_coop/assets/wall_moss.png +0 -0
  163. alem_env-0.1.0/alem/alem_coop/assets/warrior.png +0 -0
  164. alem_env-0.1.0/alem/alem_coop/assets/water.png +0 -0
  165. alem_env-0.1.0/alem/alem_coop/assets/wood.png +0 -0
  166. alem_env-0.1.0/alem/alem_coop/assets/wood_pickaxe.png +0 -0
  167. alem_env-0.1.0/alem/alem_coop/assets/wood_sword.png +0 -0
  168. alem_env-0.1.0/alem/alem_coop/assets/xp.png +0 -0
  169. alem_env-0.1.0/alem/alem_coop/assets/zombie.png +0 -0
  170. alem_env-0.1.0/alem/alem_coop/constants.py +1679 -0
  171. alem_env-0.1.0/alem/alem_coop/envs/__init__.py +0 -0
  172. alem_env-0.1.0/alem/alem_coop/envs/alem_pixels_env.py +231 -0
  173. alem_env-0.1.0/alem/alem_coop/envs/alem_symbolic_env.py +302 -0
  174. alem_env-0.1.0/alem/alem_coop/envs/alem_symbolic_env_debug.py +411 -0
  175. alem_env-0.1.0/alem/alem_coop/envs/alem_symbolic_single_agent_env.py +165 -0
  176. alem_env-0.1.0/alem/alem_coop/envs/common.py +1030 -0
  177. alem_env-0.1.0/alem/alem_coop/game_logic.py +4928 -0
  178. alem_env-0.1.0/alem/alem_coop/renderer/renderer_llm.py +833 -0
  179. alem_env-0.1.0/alem/alem_coop/renderer/renderer_pixels.py +1795 -0
  180. alem_env-0.1.0/alem/alem_coop/renderer/renderer_symbolic.py +459 -0
  181. alem_env-0.1.0/alem/alem_coop/util/__init__.py +0 -0
  182. alem_env-0.1.0/alem/alem_coop/util/game_logic_utils.py +1107 -0
  183. alem_env-0.1.0/alem/alem_coop/util/maths_utils.py +74 -0
  184. alem_env-0.1.0/alem/alem_coop/util/noise.py +130 -0
  185. alem_env-0.1.0/alem/alem_coop/world_gen/__init__.py +0 -0
  186. alem_env-0.1.0/alem/alem_coop/world_gen/world_gen.py +1196 -0
  187. alem_env-0.1.0/alem/alem_coop/world_gen/world_gen_configs.py +306 -0
  188. alem_env-0.1.0/alem/alem_env.py +44 -0
  189. alem_env-0.1.0/alem/environment_base/__init__.py +0 -0
  190. alem_env-0.1.0/alem/environment_base/environment_bases.py +169 -0
  191. alem_env-0.1.0/alem/environment_base/jaxmarl_compat.py +182 -0
  192. alem_env-0.1.0/alem/environment_base/util.py +40 -0
  193. alem_env-0.1.0/alem/llm/__init__.py +1 -0
  194. alem_env-0.1.0/alem/llm/action_parser.py +170 -0
  195. alem_env-0.1.0/alem/llm/alem_env.py +294 -0
  196. alem_env-0.1.0/alem/llm/alem_language_wrapper.py +2710 -0
  197. alem_env-0.1.0/alem/llm/alem_language_wrapper_single.py +515 -0
  198. alem_env-0.1.0/alem/llm/ascii_map.py +339 -0
  199. alem_env-0.1.0/alem_env.egg-info/PKG-INFO +580 -0
  200. alem_env-0.1.0/alem_env.egg-info/SOURCES.txt +203 -0
  201. alem_env-0.1.0/alem_env.egg-info/dependency_links.txt +1 -0
  202. alem_env-0.1.0/alem_env.egg-info/requires.txt +48 -0
  203. alem_env-0.1.0/alem_env.egg-info/top_level.txt +1 -0
  204. alem_env-0.1.0/pyproject.toml +115 -0
  205. 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.
@@ -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 &amp; 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`.