Install
openclaw skills install lybic-sandboxLybic Sandbox is a cloud sandbox built for agents and automation workflows. Think of it as a disposable cloud computer you can spin up on demand. Agents can perform GUI actions like seeing the screen, clicking, typing, and handling pop ups, which makes it a great fit for legacy apps and complex flows where APIs are missing or incomplete. It is designed for control and observability. You can monitor execution in real time, stop it when needed, and use logs and replay to debug, reproduce runs, and evaluate reliability. For long running tasks, iterative experimentation, or sensitive environments, sandboxed execution helps reduce risk and operational overhead.
openclaw skills install lybic-sandboxYou are an expert at controlling Lybic cloud sandboxes using the Lybic Python SDK.
You can help users interact with Lybic cloud sandboxes to:
Manage Sandboxes
Perform GUI Automation
Execute Code and Commands
Manage Files
Network Operations
Project Management
The Lybic Python SDK must be installed:
pip install lybic
Users need Lybic credentials set via environment variables:
LYBIC_ORG_ID - Organization IDLYBIC_API_KEY - API keyOf course, these two parameters can also be manually specified and passed to the client.
import asyncio
from lybic import LybicClient, LybicAuth
async def main():
async with LybicClient(LybicAuth(
org_id="your_org_id", # Lybic organization ID
api_key="your_api_key"
)) as client:
# Your code here
pass
import asyncio
from lybic import LybicClient
async def main():
async with LybicClient() as client:
# Your code here
pass
if __name__ == '__main__':
asyncio.run(main())
try:
result = await client.sandbox.create(name="test", shape="beijing-2c-4g-cpu-linux")
print(f"Created: {result.id}")
except Exception as e:
print(f"Error: {e}")
import base64
# For stdin
code = "print('hello')"
stdin_b64 = base64.b64encode(code.encode()).decode()
# For stdout/stderr
result = await client.sandbox.execute_process(...)
output = base64.b64decode(result.stdoutBase64 or '').decode()
# Recommended: Resolution-independent
action = {
"type": "mouse:click",
"x": {"type": "/", "numerator": 1, "denominator": 2}, # 50%
"y": {"type": "/", "numerator": 1, "denominator": 2}, # 50%
"button": 1
}
# Alternative: Absolute pixels (less portable)
action = {
"type": "mouse:click",
"x": {"type": "px", "value": 500},
"y": {"type": "px", "value": 300},
"button": 1
}
import asyncio
import base64
from lybic import LybicClient
async def run_code_in_sandbox():
async with LybicClient() as client:
# Create linux based code sandbox
sandbox = await client.sandbox.create(
name="code-runner",
shape="beijing-2c-4g-cpu-linux"
)
# Execute code
code = "print('Hello from sandbox')"
result = await client.sandbox.execute_process(
sandbox.id,
executable="python3",
stdinBase64=base64.b64encode(code.encode()).decode()
)
print(base64.b64decode(result.stdoutBase64).decode())
# Cleanup
await client.sandbox.delete(sandbox.id)
asyncio.run(run_code_in_sandbox())
import asyncio
from lybic import LybicClient
async def automate_gui():
async with LybicClient() as client:
sandbox_id = "SBX-xxxx"
# Take initial screenshot
url, img, _ = await client.sandbox.get_screenshot(sandbox_id)
img.show()
# Click at center
await client.sandbox.execute_sandbox_action(
sandbox_id,
action={
"type": "mouse:click",
"x": {"type": "/", "numerator": 1, "denominator": 2},
"y": {"type": "/", "numerator": 1, "denominator": 2},
"button": 1
}
)
# Type text
await client.sandbox.execute_sandbox_action(
sandbox_id,
action={
"type": "keyboard:type",
"content": "Hello!"
}
)
# Press Enter
await client.sandbox.execute_sandbox_action(
sandbox_id,
action={
"type": "keyboard:hotkey",
"keys": "Return"
}
)
asyncio.run(automate_gui())
import asyncio
import base64
from lybic import LybicClient
from lybic.dto import FileCopyItem, HttpGetLocation, SandboxFileLocation
async def download_and_process():
async with LybicClient() as client:
sandbox_id = "SBX-xxxx"
# Download file
await client.sandbox.copy_files(
sandbox_id,
files=[
FileCopyItem(
id="dataset",
src=HttpGetLocation(url="https://example.com/data.csv"),
dest=SandboxFileLocation(path="/tmp/data.csv")
)
]
)
# Process with Python
code = """
import pandas as pd
df = pd.read_csv('/tmp/data.csv')
print(df.describe())
"""
result = await client.sandbox.execute_process(
sandbox_id,
executable="python3",
stdinBase64=base64.b64encode(code.encode()).decode()
)
print(base64.b64decode(result.stdoutBase64).decode())
asyncio.run(download_and_process())
# Click
{"type": "mouse:click", "x": {...}, "y": {...}, "button": 1} # 1=left, 2=right
# Double-click
{"type": "mouse:doubleClick", "x": {...}, "y": {...}, "button": 1}
# Move
{"type": "mouse:move", "x": {...}, "y": {...}}
# Drag
{"type": "mouse:drag", "startX": {...}, "startY": {...}, "endX": {...}, "endY": {...}}
# Scroll
{"type": "mouse:scroll", "x": {...}, "y": {...}, "stepVertical": -5, "stepHorizontal": 0}
# Type text
{"type": "keyboard:type", "content": "Hello, World!"}
# Hotkey
{"type": "keyboard:hotkey", "keys": "ctrl+c"} # Copy
{"type": "keyboard:hotkey", "keys": "Return"} # Enter
{"type": "keyboard:hotkey", "keys": "ctrl+shift+s"} # Save as
# Tap
{"type": "touch:tap", "x": {...}, "y": {...}}
# Long press
{"type": "touch:longPress", "x": {...}, "y": {...}, "duration": 2000}
# Swipe
{"type": "touch:swipe", "x": {...}, "y": {...}, "direction": "up", "distance": {...}}
# Android buttons
{"type": "android:back"}
{"type": "android:home"}
# Start app
{"type": "os:startApp", "packageName": "com.android.chrome"}
{"type": "os:startAppByName", "name": "Chrome"}
# Close app
{"type": "os:closeApp", "packageName": "com.android.chrome"}
{"type": "os:closeAppByName", "name": "Chrome"}
# List apps
{"type": "os:listApps"}
# Screenshot
{"type": "screenshot"}
# Wait
{"type": "wait", "duration": 3000} # milliseconds
# Task status
{"type": "finished", "message": "Task completed"}
{"type": "failed", "message": "Error occurred"}
exitCode to verify process success (0 = success)Lybic determines the operating system type of the cloud sandbox through the shape parameter when creating the sandbox.
get()pip3 installUse this skill when users need to:
For detailed API reference: