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.