Spaces:
Sleeping
Sleeping
Commit ·
ca0ff77
1
Parent(s): 6a4d305
feat(web): ship per-turn replay frames in the memory payload
Browse filesCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- proteus/web/server.py +7 -1
- tests/web/test_memory_modes.py +22 -0
proteus/web/server.py
CHANGED
|
@@ -121,10 +121,16 @@ def _memory_info(session) -> dict:
|
|
| 121 |
"turns": (len(mem.memory_turns) if mem else 0),
|
| 122 |
"persona": (mem.persona_weight_id if mem else None),
|
| 123 |
"block": None,
|
|
|
|
| 124 |
}
|
| 125 |
if mem is not None:
|
| 126 |
-
from proteus.
|
|
|
|
| 127 |
info["block"] = render_memory_block(mem)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 128 |
return info
|
| 129 |
|
| 130 |
|
|
|
|
| 121 |
"turns": (len(mem.memory_turns) if mem else 0),
|
| 122 |
"persona": (mem.persona_weight_id if mem else None),
|
| 123 |
"block": None,
|
| 124 |
+
"frames": [],
|
| 125 |
}
|
| 126 |
if mem is not None:
|
| 127 |
+
from proteus.grid.scenario import get_scenario
|
| 128 |
+
from proteus.runtime.memory import memory_frames, render_memory_block
|
| 129 |
info["block"] = render_memory_block(mem)
|
| 130 |
+
scen = get_scenario(mem.scenario)()
|
| 131 |
+
info["frames"] = memory_frames(
|
| 132 |
+
mem, legend=scen.legend(), grid_size=scen.grid_size,
|
| 133 |
+
)
|
| 134 |
return info
|
| 135 |
|
| 136 |
|
tests/web/test_memory_modes.py
CHANGED
|
@@ -82,3 +82,25 @@ def test_response_carries_rendered_memory_block_for_display():
|
|
| 82 |
_, none, _ = server.handle_request(
|
| 83 |
"POST", "/session", {"scenario": "predator_evade", "memory": "none"}, _reg())
|
| 84 |
assert none["memory"]["block"] is None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 82 |
_, none, _ = server.handle_request(
|
| 83 |
"POST", "/session", {"scenario": "predator_evade", "memory": "none"}, _reg())
|
| 84 |
assert none["memory"]["block"] is None
|
| 85 |
+
|
| 86 |
+
|
| 87 |
+
def test_memory_payload_includes_replay_frames_for_pack_evade():
|
| 88 |
+
_, payload, _ = server.handle_request(
|
| 89 |
+
"POST", "/session",
|
| 90 |
+
{"scenario": "pack_evade", "seed": 42, "play_turns": 3, "memory": "default"},
|
| 91 |
+
_reg())
|
| 92 |
+
frames = payload["memory"]["frames"]
|
| 93 |
+
assert isinstance(frames, list) and len(frames) >= 1
|
| 94 |
+
f0 = frames[0]
|
| 95 |
+
assert set(f0) == {"turn_idx", "action", "grid"}
|
| 96 |
+
assert len(f0["grid"]) == 64 and len(f0["grid"][0]) == 64 # 64x64 field
|
| 97 |
+
assert any(3 in row for row in f0["grid"]) # walls present
|
| 98 |
+
|
| 99 |
+
|
| 100 |
+
def test_memory_frames_empty_when_no_memory():
|
| 101 |
+
_, payload, _ = server.handle_request(
|
| 102 |
+
"POST", "/session",
|
| 103 |
+
{"scenario": "pack_evade", "seed": 42, "play_turns": 3, "memory": "none"},
|
| 104 |
+
_reg())
|
| 105 |
+
assert payload["memory"]["attached"] is False
|
| 106 |
+
assert payload["memory"]["frames"] == []
|