Pig is an API to launch and automate Windows apps. Plug this SDK into your AI Agent apps to give them a computer!
Warning: This API and associated infrastructure are currently in alpha and will likely undergo changes.
- Pig Docs
Install the package using pip:
pip install pig-pythonThis installation includes both the Python SDK and the pig command-line interface.
Set up your API key before using the SDK:
export PIG_SECRET_KEY=your_api_keyApply Here to get your API key.
Here's a simple example to launch and interact with a VM:
from pig import VM
# Create and connect to a new VM
vm = VM()
print("Starting VM...")
conn = vm.connect() # Initial boot takes a few minutes
# Interact with the VM
conn.mouse_move(100, 100)
conn.left_click(100, 100)
conn.type("Hello, World!")To reconnect to an existing VM:
vm = VM(id="VM-ABCDEFG-ABCDEFG-ABCDEFG")
conn = vm.connect()
conn.type("Hello Again!")Hint: if you don't know the VM ID, you can use the
pig lsCLI command to list all VMs.
Always clean up your VMs when finished:
# Option 1: Stop VM (persists to disk)
vm.stop()
# Option 2: Terminate VM (deletes the disk)
vm.terminate()For automated scripts, use the context manager pattern:
with VM().session() as conn:
conn.mouse_move(100, 100)
conn.left_click(100, 100)
# VM automatically stops when the block exitsThe context manager ensures your VMs stop.
Warning: During the alpha period, VMs left running without activity may be manually stopped by the Pig team. But please be a good citizen and clean up after yourself.
The pig CLI provides convenient VM management commands:
# List all VMs
pig ls
# Output format:
ID Status Created
-------------------------- -------- ----------------
VM-6F25BH9-VHENR80-05CRX4Z Running 2025-01-16 06:47
VM-6F228MS-Q0EEQR0-02JT39X Running 2025-01-15 23:45Available Commands:
pig ls: List all VMspig create: Create a new VMpig start <vm_id>: Start a specific VMpig stop <vm_id>: Stop a specific VMpig terminate <vm_id>: Terminate and delete a VMpig img ls: List available VM imagespig img snapshot --vm <vm_id> --tag <tag>: Snapshot an existing VM into a new image. Destroys the parent VM.
The VM class is your interface for managing VMs, the cloud machines that run the Windows OS.
VM(
id: Optional[str] = None, # Optionally attach to existing VM.
# If none, new VM will be created.
image: Optional[Union[Windows, str]] = None, # OS image configuration
temporary: bool = False, # If True, terminates VM after session
api_key: Optional[str] = None, # API key (alternative to env var)
log_level: str = "INFO", # Log level for any informational messages
)create() -> str: Creates a new VM and returns its IDconnect() -> Connection: Connects to the VM, creating if necessarysession() -> VMSession: Creates a managed VM sessionstart(): Starts the VMstop(): Stops the VMterminate(): Terminates and deletes the VM
Tip: During development and exploration, prefer using the imperative API (
vm.start(), vm.stop()) so you can watch the VM and experiment. Use the context manager (vm.session()) once you're ready to automate tasks.
The connection class is your interface for interracting with a running VM. This is what you'll expose as Tools to your agent.
A Connection has the following methods:
cursor_position() -> Tuple[int, int]: Get current cursor positionmouse_move(x: int, y: int): Move cursor to coordinatesleft_click(x: Optional[int], y: Optional[int]): Left click at current location, or at specified coordinatesleft_click_drag(x: int, y: int): Click and drag from current location to target coordinatesdouble_click(x: Optional[int], y: Optional[int]): Double click at current location, or at specified coordinatesright_click(x: Optional[int], y: Optional[int]): Right click at current location, or at specified coordinates
type(text: str): Type text into VM. Maps to keystrokes, executed with a short delay between each character.key(combo: str): Send key combination (e.g., 'ctrl+c', 'alt+Tab'). Supports multiple key strokes separated by space (e.g., 'shift-h i ctrl+a ctrl+c')
screenshot() -> bytes: Capture screenshot (BMP format)width -> int: Get VM width (1024)height -> int: Get VM height (768)
cmd(command: str, close_after: bool = False): Sends a workflow to the VM to open a cmd terminal and input a command. Close_after to close the terminal after running the script. Otherwise the terminal window will remain open.powershell(command: str, close_after: bool = False): Sends a workflow to the VM to open a powershell terminal and input a command. Close_after to close the window after running the script. Otherwise the powershell window will remain open.
yield_control(): Transfer control to human operator. This makes all future interactions error until a button is clicked in the UI to grant control back to the agent.await_control(): Wait for control to be returned to the agent.
All methods on VM and Connection can be made async by adding .aio() to the method call.
For example:
from pig import VM
async def main():
vm = VM()
await vm.create.aio()
async with vm.session.aio() as conn:
await conn.left_click.aio(x=100, y=100)
await conn.type.aio("Hello, World!")You can create custom VM images to use.
- Connect to a machine from your desired base image.
- Install your desired applications and configuration.
- Use the below CLI command to snapshot the VM into a new image
# Snapshot VM into image
pig img snapshot --vm YOUR_VM_ID -t YOUR_CHOSEN_NAME
# View your images
pig img lsFuture VMs may then be created from these images
via CLI:
pig create -i IMAGE_IDor via the SDK:
vm = VM(image="IMAGE_ID")
vm.create()vm = VM(temporary=True)
with vm.session() as conn:
# VM terminates after block exit, rather than stopping.
# This deletes the VM disk, making it no longer usable.Environment Variables:
PIG_SECRET_KEY: API authentication key