Skip to main content

One-shot screenshot

Downscale for cheaper model calls, or crop to a region of interest:

observe — frame + change + targets + text

obs.text is a compact structured summary — focused window title/role plus readable target lines like [3] Filename (edit, focused) — so your model can often decide without spending image tokens. Password and masked fields are redacted in that text (masked, value always [redacted]). See Safety and consent. Pass your own targets to get a Set-of-Mark annotated frame back:

Text-only verification (image=False)

For simple checks — did the dialog close? is the field focused? — skip the JPEG:
This is much faster than a full frame. Request the image when you need to read or judge the screen visually.

Cheap verification frames

When you do need a JPEG for a quick verify, downscale harder:

Only look when something changed

Or use observe and check obs.changed / empty obs.dirty["rects"].
Pair dirty rects with ROI observe (x,y,w,h): encode only the changed region and skip full-frame model calls.

Cadence

You do not need a fresh observe between every click. Verify after each meaningful step — after a short batch of predictable actions, or after a single action when the next screen is uncertain. Prefer image=False for verification when text/targets are enough. Target ids from observe / list_targets are valid for that response only. Do not persist them across sessions, and re-observe before clicking when the screen may have changed (lists, file browsers, tables). See Vision for the concepts and Agent loop to put it together.