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 keyget_rig(rig_id)— single rig detail
Sessions
create_session(rig_id, mode="desktop")— start a sessionget_session(session_id)— current statuslist_sessions()— all active sessionsend_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 cropdirty_rects(session_id)— DXGI dirty rects since last poll (VP0);available=falseon GDI ⇒ assume changedlist_targets(session_id)— sparse click targets from host UIA (P8); empty if noneobserve(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 (needspip install pillow)targets_from_grid(…)— build cell targets for a rectangular boardclick_target(session_id, target_or_id, targets=…)— click bbox center
Apps
launch_app(session_id, path, args=None)— spawn a process on the rig (returnspid)kill_app(session_id, pid=None)— kill session-launched apps (pidoptional)
Input
send_input(session_id, events)— batch input eventsclick(session_id, x, y, button)— click at coordinatestype_text(session_id, text)— type a stringkey_press(session_id, key)— press a keymove_mouse(session_id, x, y)— move cursorscroll(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 skeletontemplates/notepad_type/— Notepad via UIA + typetemplates/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, disconnectvp0_smoke.py— dirty rects + ROI screenshot smokevp0_observe.py— shared VP0 helper (dirty skip + ROI coalesce) for agent loopspaint_mark_demo.py— an agent draws a themed GLASSWARP outline in Paint (custom colors + native drag). See Paint quickstart.paint_mona_lisa_demo.py— an 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→ verifyclaude_agent_loop.py— observe → Claude → act; VP0 on by default (VP0=0for 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)
| File | Size | Uploaded | |
|---|---|---|---|
| glasswarp-0.1.6.tar.gz | 141.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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 logRelease 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