Skip to main content

Glasswarp Python SDK

See any screen. Control any PC. One API.

Glasswarp gives your agent eyes and hands on a real Windows machine; you supply the brain (model, prompts, CV, solvers). Example task logic lives under examples/ and outcome-named starters under templates/ — not in the platform. Public plans: Free / Builder / Growth / Enterprise. Game Mode at /play is a frozen demo of the same capture pipeline.

pip install glasswarp
# optional SoM / image helpers:
pip install "glasswarp[grounding]"
# optional glasswarp-demo CLI + bundled showcase scripts:
pip install "glasswarp[demos]"

Published on PyPI: pypi.org/project/glasswarp (0.1.1). Release process: docs/PYPI_PUBLISH.md.

Want Claude / Cursor with no project code? Use the remote MCP server instead — glasswarp.com/mcp · docs.

Quickstart

from glasswarp import GlasswarpClient

gw = GlasswarpClient(api_key="gw_live_sk_...")

# List your rigs
rigs = gw.list_rigs()
rig = rigs[0]

# Start a desktop session
session = gw.create_session(rig_id=rig.id)

# Take a screenshot (returns JPEG bytes)
screenshot = gw.screenshot(session.session_id)
with open("screen.jpg", "wb") as f:
    f.write(screenshot.jpeg)

# Send input
gw.click(session.session_id, x=500, y=400)
gw.type_text(session.session_id, "Hello from Python!")
gw.key_press(session.session_id, "Enter")

# End the session
gw.end_session(session.session_id)

Configuration

Parameter Env var Default
api_key GLASSWARP_API_KEY (required)
base_url GLASSWARP_BASE_URL https://signal.glasswarp.com

API reference

Rigs

  • list_rigs() — all rigs accessible to this key
  • get_rig(rig_id) — single rig detail

Sessions

  • create_session(rig_id, mode="desktop") — start a session
  • get_session(session_id) — current status
  • list_sessions() — all active sessions
  • end_session(session_id) — end and trigger safety_restore

Visual

  • screenshot(session_id, max_width=None, quality=None, x=y=w=h=None) — JPEG; optional ROI crop
  • dirty_rects(session_id) — DXGI dirty rects since last poll (VP0); available=false on GDI ⇒ assume changed
  • list_targets(session_id) — sparse click targets from host UIA (P8); empty if none
  • observe(session_id, mark=True, targets=None, …) — one RTT: JPEG + dirty + targets + capture_mode (SoM when marked)

Grounding (SoM)

Agents should click targets, not guessed pixels:

from glasswarp import targets_from_grid, som_annotate

# Host UIA targets (P8) or client CV/grid:
targets = targets_from_grid(x0=100, y0=200, x1=900, y1=800, rows=8, cols=8)
obs = gw.observe(session.session_id, max_width=1280, mark=True, targets=targets)
# obs.jpeg is Set-of-Mark annotated; model returns target id →
gw.click_target(session.session_id, "12", targets=targets)
  • som_annotate(jpeg, targets, native_width=…, native_height=…) — draw numbered marks (needs pip install pillow)
  • targets_from_grid(…) — build cell targets for a rectangular board
  • click_target(session_id, target_or_id, targets=…) — click bbox center

Apps

  • launch_app(session_id, path, args=None) — spawn a process on the rig (returns pid)
  • kill_app(session_id, pid=None) — kill session-launched apps (pid optional)

Input

  • send_input(session_id, events) — batch input events
  • click(session_id, x, y, button) — click at coordinates
  • type_text(session_id, text) — type a string
  • key_press(session_id, key) — press a key
  • move_mouse(session_id, x, y) — move cursor
  • scroll(session_id, dx, dy) — scroll

Stream

  • stream(session_id) — WebRTC signaling credentials for a live 60fps feed

Templates

Outcome-named starters in templates/ (observe → think → act → verify):

  • templates/observe_think_act/ — minimal agent-loop skeleton
  • templates/notepad_type/ — Notepad via UIA + type
  • templates/live_view_hitl/ — hold a session for Console Live View

Demos CLI (tight loops — not MCP click-per-cell)

export GLASSWARP_API_KEY=gw_live_sk_...
glasswarp-demo list
glasswarp-demo minesweeper
glasswarp-demo mona-lisa

Same entrypoint: python -m glasswarp.demos minesweeper. Prefer this (or the scripts below) for click-speed loops; use MCP tools for ad-hoc UI. Guide: Ways to run agents.

Examples

See examples/ for complete runnable scripts:

  • quickstart.py — connect, screenshot, click, type, disconnect
  • vp0_smoke.py — dirty rects + ROI screenshot smoke
  • vp0_observe.py — shared VP0 helper (dirty skip + ROI coalesce) for agent loops
  • paint_mark_demo.pyan agent draws a themed GLASSWARP outline in Paint (custom colors + native drag). See Paint quickstart.
  • paint_mona_lisa_demo.pyan agent reproduces the Mona Lisa in Paint (observe→think→act→verify: vision placement, UIA colors, tile fills, Save As→Desktop). VNC-hard differentiator. See Mona Lisa quickstart.
  • notepad_uia_demo.py — Notepad via UIA targets + type. See Notepad quickstart.
  • minesweeper_solver_demo.py — Minesweeper demo (CV + solver). See quickstart.
  • gemini_agent_loop.py — Minesweeper demo with Gemini + SoM → click_target → verify
  • claude_agent_loop.py — observe → Claude → act; VP0 on by default (VP0=0 for full frames)

License

Apache-2.0

Release files for glasswarp 0.1.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for glasswarp 0.1.6
File Size Uploaded
glasswarp-0.1.6.tar.gz 141.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for glasswarp 0.1.6
File Interpreter ABI Platform
glasswarp-0.1.6-py3-none-any.whl Python 3 none any Details

Total release size: 264.1 kB

Release files / glasswarp-0.1.6.tar.gz

Download URL glasswarp-0.1.6.tar.gz
Size 141.7 kB
Tags Source
SHA-256 checksum
How to use checksums
ddfbb750a54d5be2e80c2494b65386b8eee187172c233af483c4746d970a6fcc
BLAKE2b-256 checksum
How to use checksums
2ce13b7931dbf9a2749ce058611da6bc21323b4c47f56292ff719aa19434a341
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 23, 2026.

Transparency log

Release files / glasswarp-0.1.6-py3-none-any.whl

Download URL glasswarp-0.1.6-py3-none-any.whl
Size 122.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0d7e2853d2320532063f17e381e93d70917f80ac759b56b6c79aceb91661deab
BLAKE2b-256 checksum
How to use checksums
e14c960e9c5f341147dd068921d40db0c11fcf37e90c789734d20fb0071ee77a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 23, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.6 This release

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page