synth-ai 0.2.13.dev1__py3-none-any.whl → 0.2.13.dev2__py3-none-any.whl

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.

Potentially problematic release.


This version of synth-ai might be problematic. Click here for more details.

Files changed (226) hide show
  1. examples/multi_step/configs/crafter_rl_stepwise_hosted_judge.toml +12 -1
  2. examples/swe/task_app/grpo_swe_mini.py +55 -26
  3. examples/swe/task_app/hosted/rollout.py +40 -0
  4. examples/swe/task_app/hosted/test_service.py +5 -6
  5. examples/task_apps/TESTING.md +275 -0
  6. examples/task_apps/__init__.py +0 -0
  7. examples/task_apps/crafter/__init__.py +0 -0
  8. examples/task_apps/crafter/task_app/__init__.py +2 -0
  9. examples/{warming_up_to_rl → task_apps/crafter}/task_app/grpo_crafter.py +18 -13
  10. examples/{warming_up_to_rl → task_apps/crafter}/task_app/grpo_crafter_task_app.py +1 -1
  11. examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/envs/crafter/policy.py +60 -4
  12. examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/policy_routes.py +25 -3
  13. examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/rollout.py +10 -0
  14. examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/test_service.py +5 -6
  15. examples/task_apps/dev/pokemon_emerald/__init__.py +2 -0
  16. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/README.md +811 -0
  17. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/__init__.py +120 -0
  18. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/action.py +160 -0
  19. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/memory.py +155 -0
  20. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/perception.py +69 -0
  21. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/planning.py +96 -0
  22. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/simple.py +1502 -0
  23. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/system_prompt.py +4 -0
  24. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/grab_map.py +68 -0
  25. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/manual.py +216 -0
  26. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/__init__.py +35 -0
  27. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/emerald_utils.py +631 -0
  28. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/emulator.py +1544 -0
  29. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/enums.py +1428 -0
  30. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/memory_reader.py +4848 -0
  31. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/types.py +41 -0
  32. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/utils.py +298 -0
  33. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pyproject.toml +95 -0
  34. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/run.py +204 -0
  35. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/server/__init__.py +0 -0
  36. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/server/app.py +2152 -0
  37. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/server/client.py +429 -0
  38. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/server/frame_server.py +155 -0
  39. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/README.md +78 -0
  40. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/__init__.py +0 -0
  41. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/run_tests.py +122 -0
  42. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_agent_direct.py +76 -0
  43. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_agent_prompts.py +413 -0
  44. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_battle_state_formatting.py +204 -0
  45. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_dialogue_detection.py +133 -0
  46. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_dialogue_detection_comprehensive.py +229 -0
  47. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_direct_agent_emulator.py +300 -0
  48. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_fps_adjustment_pytest.py +205 -0
  49. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_house_to_outside_direct.py +200 -0
  50. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_house_to_outside_transition.py +284 -0
  51. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_map_ground_truth_comparison.py +468 -0
  52. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_memory_map.py +575 -0
  53. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_server_map_validation.py +311 -0
  54. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_torchic_state.py +259 -0
  55. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/__init__.py +0 -0
  56. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/anticheat.py +372 -0
  57. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/checkpoint.py +296 -0
  58. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/error_handler.py +275 -0
  59. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/get_local_ip.py +22 -0
  60. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/helpers.py +44 -0
  61. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/llm_logger.py +514 -0
  62. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_formatter.py +415 -0
  63. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_stitcher.py +1763 -0
  64. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_stitcher_singleton.py +33 -0
  65. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_trimmer.py +106 -0
  66. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_visualizer.py +334 -0
  67. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/ocr_dialogue.py +1020 -0
  68. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/recording.py +188 -0
  69. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/state_formatter.py +1481 -0
  70. examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/vlm.py +862 -0
  71. examples/task_apps/dev/pokemon_emerald/modal_app.py +114 -0
  72. examples/task_apps/dev/pokemon_emerald/task_app/README.md +81 -0
  73. examples/task_apps/dev/pokemon_emerald/task_app/__init__.py +6 -0
  74. examples/task_apps/dev/pokemon_emerald/task_app/pokemon_emerald.py +685 -0
  75. examples/task_apps/enron/__init__.py +1 -0
  76. examples/task_apps/enron/eval_groq_qwen32.toml +16 -0
  77. examples/task_apps/enron/task_app/README.md +14 -0
  78. examples/task_apps/enron/task_app/__init__.py +1 -0
  79. examples/task_apps/enron/task_app/grpo_enron.py +906 -0
  80. examples/task_apps/enron/task_app/grpo_enron_task_app.py +146 -0
  81. examples/task_apps/enron/tests/__init__.py +2 -0
  82. examples/task_apps/enron/tests/conftest.py +115 -0
  83. examples/task_apps/enron/tests/integration/__init__.py +2 -0
  84. examples/task_apps/enron/tests/integration/test_enron_eval.py +177 -0
  85. examples/task_apps/enron/tests/integration/test_enron_rollout.py +135 -0
  86. examples/task_apps/enron/tests/unit/__init__.py +2 -0
  87. examples/task_apps/enron/tests/unit/test_enron_environment.py +126 -0
  88. examples/task_apps/math/__init__.py +0 -0
  89. examples/{rl/task_app → task_apps/math}/math_single_step.py +19 -10
  90. examples/task_apps/pokemon_battle/__init__.py +2 -0
  91. examples/task_apps/pokemon_battle/modal_app.py +104 -0
  92. examples/task_apps/pokemon_battle/task_app/README.md +68 -0
  93. examples/task_apps/pokemon_battle/task_app/__init__.py +6 -0
  94. examples/task_apps/pokemon_battle/task_app/pokemon_showdown.py +932 -0
  95. examples/task_apps/pokemon_red/README.md +357 -0
  96. examples/task_apps/pokemon_red/__init__.py +3 -0
  97. examples/task_apps/pokemon_red/eval_pokemon_red_policy.py +225 -0
  98. examples/task_apps/pokemon_red/pallet_town_rl_config.toml +73 -0
  99. examples/task_apps/pokemon_red/task_app.py +606 -0
  100. examples/task_apps/pokemon_red/test_pallet_town_rewards.py +191 -0
  101. examples/task_apps/sokoban/README.md +307 -0
  102. examples/task_apps/sokoban/__init__.py +3 -0
  103. examples/task_apps/sokoban/eval_groq_qwen32.toml +16 -0
  104. examples/task_apps/sokoban/eval_openai_gpt5.toml +16 -0
  105. examples/task_apps/sokoban/task_app.py +1058 -0
  106. examples/task_apps/sokoban/tests/__init__.py +2 -0
  107. examples/task_apps/sokoban/tests/conftest.py +113 -0
  108. examples/task_apps/sokoban/tests/integration/__init__.py +2 -0
  109. examples/task_apps/sokoban/tests/integration/test_sokoban_eval.py +57 -0
  110. examples/task_apps/sokoban/tests/integration/test_sokoban_rollout.py +198 -0
  111. examples/task_apps/sokoban/tests/unit/__init__.py +2 -0
  112. examples/task_apps/sokoban/tests/unit/test_sokoban_environment.py +114 -0
  113. examples/task_apps/verilog/__init__.py +1 -0
  114. examples/task_apps/verilog/eval_groq_qwen32b.toml +20 -0
  115. examples/task_apps/verilog/task_app/README.md +12 -0
  116. examples/task_apps/verilog/task_app/__init__.py +1 -0
  117. examples/task_apps/verilog/task_app/grpo_verilog.py +931 -0
  118. examples/task_apps/verilog/task_app/grpo_verilog_task_app.py +145 -0
  119. examples/task_apps/verilog/tests/__init__.py +2 -0
  120. examples/task_apps/verilog/tests/conftest.py +115 -0
  121. examples/task_apps/verilog/tests/integration/__init__.py +2 -0
  122. examples/task_apps/verilog/tests/integration/test_verilog_eval.py +179 -0
  123. examples/task_apps/verilog/tests/integration/test_verilog_rollout.py +55 -0
  124. examples/task_apps/verilog/tests/unit/__init__.py +2 -0
  125. examples/task_apps/verilog/tests/unit/test_verilog_scoring.py +118 -0
  126. examples/vlm/crafter_openai_vlm_agent.py +4 -4
  127. examples/vlm/run_crafter_vlm_benchmark.py +4 -4
  128. examples/workflows/__init__.py +0 -0
  129. examples/workflows/math_rl/__init__.py +0 -0
  130. examples/workflows/math_rl/download_dataset.py +80 -0
  131. synth_ai/__init__.py +2 -2
  132. synth_ai/api/train/builders.py +25 -11
  133. synth_ai/api/train/cli.py +12 -6
  134. synth_ai/api/train/configs/__init__.py +10 -10
  135. synth_ai/api/train/configs/rl.py +5 -4
  136. synth_ai/api/train/configs/sft.py +4 -3
  137. synth_ai/api/train/env_resolver.py +5 -2
  138. synth_ai/api/train/supported_algos.py +10 -5
  139. synth_ai/api/train/utils.py +7 -4
  140. synth_ai/cli/__init__.py +7 -51
  141. synth_ai/cli/_storage.py +4 -3
  142. synth_ai/cli/_validate_task_app.py +11 -0
  143. synth_ai/cli/balance.py +4 -3
  144. synth_ai/cli/calc.py +2 -2
  145. synth_ai/cli/demo.py +14 -7
  146. synth_ai/cli/legacy_root_backup.py +1 -1
  147. synth_ai/cli/rl_demo.py +8 -7
  148. synth_ai/cli/root.py +0 -97
  149. synth_ai/cli/task_apps.py +1707 -186
  150. synth_ai/demos/demo_task_apps/crafter/grpo_crafter_task_app.py +28 -16
  151. synth_ai/environments/examples/enron/engine.py +7 -2
  152. synth_ai/environments/examples/enron/environment.py +68 -0
  153. synth_ai/environments/examples/red/engine.py +27 -0
  154. synth_ai/environments/examples/red/engine_helpers/memory_map.py +7 -0
  155. synth_ai/environments/examples/red/engine_helpers/reward_library/pallet_town_progression.py +477 -0
  156. synth_ai/environments/examples/red/engine_helpers/state_extraction.py +32 -0
  157. synth_ai/environments/examples/red/environment.py +60 -0
  158. synth_ai/environments/examples/sokoban/taskset.py +116 -0
  159. synth_ai/environments/examples/verilog/engine.py +30 -4
  160. synth_ai/evals/client.py +58 -61
  161. synth_ai/jobs/client.py +16 -4
  162. synth_ai/judge_schemas.py +16 -16
  163. synth_ai/py.typed +0 -0
  164. synth_ai/task/__init__.py +14 -5
  165. synth_ai/task/contracts.py +124 -38
  166. synth_ai/task/proxy.py +48 -56
  167. synth_ai/task/rubrics/__init__.py +53 -0
  168. synth_ai/task/rubrics/loaders.py +133 -0
  169. synth_ai/task/rubrics/models.py +57 -0
  170. synth_ai/task/rubrics/scoring.py +113 -0
  171. synth_ai/{rubrics/validators.py → task/rubrics/strict.py} +53 -30
  172. synth_ai/task/server.py +8 -7
  173. synth_ai/task/validators.py +269 -6
  174. synth_ai/tracing_v3/decorators.py +7 -3
  175. synth_ai/tracing_v3/replica_sync.py +4 -4
  176. synth_ai/tracing_v3/serialization.py +5 -5
  177. synth_ai/tracing_v3/trace_utils.py +317 -0
  178. synth_ai/tracing_v3/turso/native_manager.py +3 -3
  179. {synth_ai-0.2.13.dev1.dist-info → synth_ai-0.2.13.dev2.dist-info}/METADATA +4 -1
  180. {synth_ai-0.2.13.dev1.dist-info → synth_ai-0.2.13.dev2.dist-info}/RECORD +214 -101
  181. examples/agora_ex/README_MoE.md +0 -224
  182. examples/agora_ex/__init__.py +0 -7
  183. examples/agora_ex/agora_ex.py +0 -65
  184. examples/agora_ex/agora_ex_task_app.py +0 -590
  185. examples/agora_ex/configs/rl_lora_qwen3_moe_2xh200.toml +0 -121
  186. examples/agora_ex/reward_fn_grpo-human.py +0 -129
  187. examples/agora_ex/system_prompt_CURRENT.md +0 -63
  188. examples/agora_ex/task_app/agora_ex_task_app.py +0 -590
  189. examples/agora_ex/task_app/reward_fn_grpo-human.py +0 -129
  190. examples/agora_ex/task_app/system_prompt_CURRENT.md +0 -63
  191. synth_ai/rubrics/__init__.py +0 -22
  192. synth_ai/task/rubrics.py +0 -219
  193. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/README.md +0 -0
  194. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/README.md +0 -0
  195. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/__init__.py +0 -0
  196. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/branching.py +0 -0
  197. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/environment_routes.py +0 -0
  198. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/envs/__init__.py +0 -0
  199. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/envs/crafter/__init__.py +0 -0
  200. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/envs/crafter/app.py +0 -0
  201. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/envs/crafter/environment.py +0 -0
  202. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/envs/crafter/react_agent.py +0 -0
  203. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/envs/crafter/shared.py +0 -0
  204. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/envs/crafter/tools.py +0 -0
  205. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/hosted_app.py +0 -0
  206. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/inference/__init__.py +0 -0
  207. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/inference/openai_client.py +0 -0
  208. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/main.py +0 -0
  209. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/registry.py +0 -0
  210. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/storage/__init__.py +0 -0
  211. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/storage/volume.py +0 -0
  212. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/test_agents.py +0 -0
  213. /examples/{warming_up_to_rl → task_apps/crafter}/task_app/synth_envs_hosted/utils.py +0 -0
  214. /examples/{rl/task_app → task_apps/math}/README.md +0 -0
  215. /examples/{rl/task_app → task_apps/math}/math_task_app.py +0 -0
  216. /examples/{rl → workflows/math_rl}/configs/eval_base_qwen.toml +0 -0
  217. /examples/{rl → workflows/math_rl}/configs/eval_rl_qwen.toml +0 -0
  218. /examples/{rl → workflows/math_rl}/configs/rl_from_base_qwen.toml +0 -0
  219. /examples/{rl → workflows/math_rl}/configs/rl_from_base_qwen17.toml +0 -0
  220. /examples/{rl → workflows/math_rl}/configs/rl_from_ft_qwen.toml +0 -0
  221. /examples/{rl → workflows/math_rl}/run_eval.py +0 -0
  222. /examples/{rl → workflows/math_rl}/run_rl_and_save.py +0 -0
  223. {synth_ai-0.2.13.dev1.dist-info → synth_ai-0.2.13.dev2.dist-info}/WHEEL +0 -0
  224. {synth_ai-0.2.13.dev1.dist-info → synth_ai-0.2.13.dev2.dist-info}/entry_points.txt +0 -0
  225. {synth_ai-0.2.13.dev1.dist-info → synth_ai-0.2.13.dev2.dist-info}/licenses/LICENSE +0 -0
  226. {synth_ai-0.2.13.dev1.dist-info → synth_ai-0.2.13.dev2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,4 @@
1
+ # System prompt for the Pokémon Emerald AI agent
2
+ system_prompt = """
3
+ You are an AI agent playing Pokémon Emerald on a Game Boy Advance emulator. Your goal is to analyze the current game frame, understand the game state, and make intelligent decisions to progress efficiently. Use your perception, memory, planning, and action modules to interact with the game world. Always provide detailed, context-aware responses and consider the current situation in the game.
4
+ """
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Script to grab and display the current map data from the running Pokemon Emerald server.
4
+ Usage: python grab_map.py [--save FILENAME]
5
+ """
6
+
7
+ import argparse
8
+ import requests
9
+ import sys
10
+ from tests.test_memory_map import print_map_data
11
+
12
+ SERVER_URL = "http://127.0.0.1:8000"
13
+
14
+ def main():
15
+ parser = argparse.ArgumentParser(description='Grab and display current map data from running Pokemon Emerald server')
16
+ parser.add_argument('--save', type=str, default=None,
17
+ help='Save the formatted map to a text file')
18
+ parser.add_argument('--server', type=str, default=SERVER_URL,
19
+ help=f'Server URL (default: {SERVER_URL})')
20
+ args = parser.parse_args()
21
+
22
+ print(f"Connecting to server at {args.server}...")
23
+
24
+ try:
25
+ # Get comprehensive state from server
26
+ response = requests.get(f"{args.server}/state", timeout=5)
27
+ if response.status_code != 200:
28
+ print(f"Error: Failed to get state from server (HTTP {response.status_code})")
29
+ print("Make sure server/app.py is running!")
30
+ sys.exit(1)
31
+
32
+ state_data = response.json()
33
+
34
+ # Extract map data
35
+ if 'map' not in state_data or 'tiles' not in state_data['map']:
36
+ print("Error: No map data in server response")
37
+ print("The server might not have map data available yet")
38
+ sys.exit(1)
39
+
40
+ map_data = state_data['map']['tiles']
41
+
42
+ # Get additional info
43
+ location = state_data.get('player', {}).get('location', 'Unknown')
44
+ coords = state_data.get('player', {}).get('position', {})
45
+
46
+ # Format and display the map
47
+ title = f"Current Map - {location} ({coords.get('x', '?')}, {coords.get('y', '?')})"
48
+ formatted_map = print_map_data(map_data, title)
49
+
50
+ # Save to file if requested
51
+ if args.save:
52
+ with open(args.save, 'w') as f:
53
+ f.write(formatted_map)
54
+ print(f"\nMap saved to {args.save}")
55
+
56
+ except requests.exceptions.ConnectionError:
57
+ print(f"Error: Could not connect to server at {args.server}")
58
+ print("Make sure server/app.py is running!")
59
+ sys.exit(1)
60
+ except requests.exceptions.Timeout:
61
+ print("Error: Server request timed out")
62
+ sys.exit(1)
63
+ except Exception as e:
64
+ print(f"Error: {e}")
65
+ sys.exit(1)
66
+
67
+ if __name__ == "__main__":
68
+ main()
@@ -0,0 +1,216 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Manual mode utilities for debugging and testing the Pokemon agent.
4
+ """
5
+
6
+ from utils.state_formatter import format_state_for_llm
7
+ from utils.map_formatter import format_map_for_display
8
+ from pokemon_env.enums import MetatileBehavior
9
+
10
+
11
+ def display_comprehensive_state(emulator):
12
+ """
13
+ Display comprehensive game state exactly as the LLM sees it.
14
+ This is triggered by pressing 'M' in manual mode.
15
+
16
+ Args:
17
+ emulator: The game emulator instance
18
+ """
19
+ print("\n" + "="*80)
20
+ print("COMPREHENSIVE GAME STATE (What the LLM sees)")
21
+ print("="*80)
22
+
23
+ try:
24
+ # Get the comprehensive state with screenshot for OCR
25
+ screenshot = emulator.get_screenshot()
26
+ state = emulator.get_comprehensive_state(screenshot)
27
+
28
+ # Format the state using the same formatter the agent uses
29
+ formatted_state = format_state_for_llm(state)
30
+
31
+ print(formatted_state)
32
+
33
+ # Show additional debug info
34
+ print("\n" + "="*80)
35
+ # print("ADDITIONAL DEBUG INFO")
36
+ print("="*80)
37
+
38
+ # Show raw game state
39
+ game_state = state.get('game_state', {})
40
+ print(f"\n📍 Player Position: {game_state.get('player_location', 'Unknown')}")
41
+ print(f"🗺️ Map: {game_state.get('current_map', 'Unknown')}")
42
+ print(f"💰 Money: ${game_state.get('money', 0)}")
43
+ print(f"🎮 Play Time: {game_state.get('play_time', 'Unknown')}")
44
+
45
+ # Show party info
46
+ party = game_state.get('party', [])
47
+ if party:
48
+ print(f"\n🎭 Party ({len(party)} Pokémon):")
49
+ for i, mon in enumerate(party, 1):
50
+ print(f" {i}. {mon.get('species', 'Unknown')} "
51
+ f"Lv.{mon.get('level', '?')} "
52
+ f"HP: {mon.get('hp', '?')}/{mon.get('max_hp', '?')}")
53
+
54
+ # Show battle info if in battle
55
+ if game_state.get('in_battle'):
56
+ print(f"\n⚔️ BATTLE MODE:")
57
+ print(f" Enemy: {game_state.get('enemy_pokemon', 'Unknown')}")
58
+ print(f" Type: {game_state.get('battle_type', 'Unknown')}")
59
+
60
+ # Show dialogue if present
61
+ dialogue = state.get('visual', {}).get('dialogue_text', '')
62
+ if dialogue:
63
+ print(f"\n💬 Current Dialogue:")
64
+ print(f" {dialogue}")
65
+
66
+ # Show milestone progress
67
+ progress = state.get('progress', {})
68
+ milestones = progress.get('milestones', {})
69
+ if milestones:
70
+ completed = sum(1 for v in milestones.values() if v)
71
+ total = len(milestones)
72
+ print(f"\n🏆 Milestones: {completed}/{total} completed")
73
+
74
+ # Show next uncompleted milestone
75
+ for name, completed in milestones.items():
76
+ if not completed:
77
+ print(f" Next: {name}")
78
+ break
79
+
80
+ print("\n" + "="*80)
81
+
82
+ except Exception as e:
83
+ print(f"❌ Error displaying state: {e}")
84
+ import traceback
85
+ traceback.print_exc()
86
+
87
+
88
+ def display_map_visualization(emulator):
89
+ """
90
+ Display a visual representation of the current map.
91
+ This is triggered by pressing Shift+M in manual mode.
92
+
93
+ Args:
94
+ emulator: The game emulator instance
95
+ """
96
+ print("\n" + "="*80)
97
+ print("MAP VISUALIZATION")
98
+ print("="*80)
99
+
100
+ try:
101
+ # Get current state
102
+ screenshot = emulator.get_screenshot()
103
+ state = emulator.get_comprehensive_state(screenshot)
104
+ game_state = state.get('game_state', {})
105
+
106
+ # Get map data
107
+ map_grid = game_state.get('map_grid', [[]])
108
+ player_pos = game_state.get('player_position', (0, 0))
109
+ map_name = game_state.get('current_map', 'Unknown')
110
+
111
+ print(f"\n🗺️ Current Map: {map_name}")
112
+ print(f"📍 Player Position: {player_pos}")
113
+
114
+ if map_grid:
115
+ # Use the map formatter to display
116
+ formatted_map = format_map_for_display(
117
+ map_grid,
118
+ player_pos,
119
+ view_radius=7
120
+ )
121
+ print(formatted_map)
122
+
123
+ # Show tile legend
124
+ print("\n📋 Tile Legend:")
125
+ print(" @ = Player")
126
+ print(" . = Walkable")
127
+ print(" # = Wall/Obstacle")
128
+ print(" ~ = Water")
129
+ print(" ^ = Grass")
130
+ print(" D = Door/Warp")
131
+ print(" N = NPC")
132
+ print(" ! = Ledge")
133
+ print(" ? = Unknown")
134
+ else:
135
+ print("⚠️ No map data available")
136
+
137
+ # Try to use the visual map if available
138
+ try:
139
+ visualize_map_state(emulator.memory_reader)
140
+ except:
141
+ pass # Silent fail if visualization not available
142
+
143
+ except Exception as e:
144
+ print(f"❌ Error displaying map: {e}")
145
+ import traceback
146
+ traceback.print_exc()
147
+
148
+
149
+ def show_debug_menu():
150
+ """Display the debug menu with available commands"""
151
+ print("\n" + "="*50)
152
+ # print("DEBUG MENU")
153
+ print("="*50)
154
+ print("M - Display comprehensive state (LLM view)")
155
+ print("Shift+M - Display map visualization")
156
+ print("S - Save screenshot")
157
+ print("1 - Save state")
158
+ print("2 - Load state")
159
+ print("Tab - Toggle Agent/Manual mode")
160
+ print("A - Toggle auto-agent mode")
161
+ print("Space - Single agent step")
162
+ print("Esc - Quit")
163
+ print("="*50)
164
+
165
+
166
+ def handle_debug_command(key, emulator, agent_mode=False):
167
+ """
168
+ Handle debug keyboard commands.
169
+
170
+ Args:
171
+ key: The key pressed
172
+ emulator: The emulator instance
173
+ agent_mode: Whether in agent mode
174
+
175
+ Returns:
176
+ dict: Action to take based on the command
177
+ """
178
+ action = {}
179
+
180
+ if key == 'm':
181
+ display_comprehensive_state(emulator)
182
+ elif key == 'M': # Shift+M
183
+ display_map_visualization(emulator)
184
+ elif key == 's':
185
+ # Save screenshot
186
+ screenshot = emulator.get_screenshot()
187
+ filename = f"screenshot_{datetime.now().strftime('%Y%m%d_%H%M%S')}.png"
188
+ screenshot.save(filename)
189
+ print(f"💾 Screenshot saved to {filename}")
190
+ elif key == '1':
191
+ # Save state
192
+ import os
193
+ os.makedirs(".pokeagent_cache", exist_ok=True)
194
+ emulator.save_state(".pokeagent_cache/manual_save.state")
195
+ print("💾 State saved to .pokeagent_cache/manual_save.state")
196
+ elif key == '2':
197
+ # Load state
198
+ try:
199
+ emulator.load_state(".pokeagent_cache/manual_save.state")
200
+ print("📂 State loaded from .pokeagent_cache/manual_save.state")
201
+ except:
202
+ print("⚠️ No save state found")
203
+ elif key == 'tab':
204
+ action['toggle_mode'] = True
205
+ elif key == 'a':
206
+ action['toggle_auto'] = True
207
+ elif key == ' ' and agent_mode:
208
+ action['agent_step'] = True
209
+ elif key == 'h':
210
+ show_debug_menu()
211
+
212
+ return action
213
+
214
+
215
+ # Add missing import
216
+ from datetime import datetime
@@ -0,0 +1,35 @@
1
+ """
2
+ Pokemon Emerald Memory Reader Package
3
+
4
+ This package provides tools for reading memory from Pokemon Emerald games
5
+ running in mGBA or other GBA emulators.
6
+ """
7
+
8
+ from .memory_reader import PokemonEmeraldReader
9
+ from .enums import (
10
+ MetatileBehavior,
11
+ PokemonType,
12
+ PokemonSpecies,
13
+ Move,
14
+ Badge,
15
+ MapLocation,
16
+ Tileset,
17
+ StatusCondition
18
+ )
19
+ from .types import PokemonData
20
+
21
+ __version__ = "3.0.0-preview"
22
+ __author__ = "Seth Karten"
23
+
24
+ __all__ = [
25
+ "PokemonEmeraldReader",
26
+ "MetatileBehavior",
27
+ "PokemonType",
28
+ "PokemonSpecies",
29
+ "Move",
30
+ "Badge",
31
+ "MapLocation",
32
+ "Tileset",
33
+ "StatusCondition",
34
+ "PokemonData"
35
+ ]