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:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user