vision: real-time perception — auto frame attach every N turns (--look-every) and on collision, frame context cap (6), digest fallback for text models

This commit is contained in:
opencode
2026-08-08 20:06:22 +03:00
parent d8373a50fc
commit 1d7dbb7b79
5 changed files with 449 additions and 18 deletions
+15
View File
@@ -122,6 +122,7 @@ async def chat_loop(client: AICCClient, manifest, args: argparse.Namespace) -> i
# The REPL stays responsive: /status to check progress, /stop to cancel.
mission: asyncio.Task | None = None
mission_goal = "reach the beacon and activate it"
user_turns = 0
def mission_log(role: str, msg: str) -> None:
print(f" [{role}] {msg}")
@@ -159,6 +160,7 @@ async def chat_loop(client: AICCClient, manifest, args: argparse.Namespace) -> i
args.mission_steps,
log=mission_log,
nudge_limit=args.mission_nudges,
look_every=args.look_every,
)
except RuntimeError as exc:
print(f" [mission] LLM error: {exc}")
@@ -330,6 +332,13 @@ async def chat_loop(client: AICCClient, manifest, args: argparse.Namespace) -> i
if not auto_steps:
break
# The model acted without commenting; let it keep going for 'go to X'
# Real-time perception in manual chat: refresh the model's view of the
# world on a cadence, so it reacts to what it sees without being asked.
user_turns += 1
if args.look_every and user_turns % args.look_every == 0:
await controller.auto_frame(
"Fresh camera frame for your reference — react if the world changed."
)
if controller.pos is not None:
save_map()
@@ -431,6 +440,12 @@ def main() -> int:
default=None,
help="always include the color-grid digest alongside images (off by default for multimodal models)",
)
parser.add_argument(
"--look-every",
type=int,
default=3,
help="attach a fresh camera frame every N turns (0 disables; default 3)",
)
args = parser.parse_args()
try:
return asyncio.run(run(args))