Client SDK for App World — RL & Eval environments for Android apps
Project description
App World SDK
Lightweight Python client for the App World platform — RL training and evaluation on real Android apps, with a standard Gymnasium interface.
Installation
pip install appworld-sdk
Requirements: Python >= 3.11
Quick Start
from appworld_sdk import AppWorldClient
client = AppWorldClient(api_key="YOUR_API_KEY", base_url="https://api.appworld.dev")
# Browse available tasks
tasks = client.list_tasks()
# Allocate device resources
env_info = client.create_environment(task_ids=["FennoteCreateNote"])
env_id = env_info["id"]
# Get a Gymnasium-compatible environment
env = client.make_env(env_id=env_id, env_type="eval")
# Run a task
obs, info = env.reset(task_name="FennoteCreateNote")
done = False
while not done:
action = {"action_type": 0, "x": 0.5, "y": 0.5, "text": "", "direction": 0}
obs, reward, terminated, truncated, info = env.step(action)
done = terminated or truncated
env.close()
Environment Types
| Type | Class | Actions | Use Case |
|---|---|---|---|
"rl" |
RemoteAppWorldEnv |
5 discrete (tap, swipe, etc.) | RL training |
"eval" |
RemoteAppWorldEvalEnv |
7 (incl. text input) | Agent evaluation |
Client-Side Eval with Custom Agents
Implement the BaseAgent protocol to run evaluations where LLM calls stay on your side — your model API key never leaves the local process.
from appworld_sdk import AppWorldClient
class MyAgent:
"""Implement predict() — the SDK checks this via BaseAgent Protocol."""
def predict(self, *, screenshot, goal, **kwargs) -> dict:
# Your model inference here
return {"action_type": 0, "x": 0.5, "y": 0.5, "text": "", "direction": 0}
client = AppWorldClient(api_key="YOUR_API_KEY", base_url="https://api.appworld.dev")
env_info = client.create_environment(task_ids=["FennoteCreateNote", "FennoteDeleteNote"])
result = client.run_local_eval(
env_id=env_info["id"],
tasks=["FennoteCreateNote", "FennoteDeleteNote"],
agent=MyAgent(),
max_steps=15,
)
print(f"Success rate: {result.success_rate:.0%}")
print(f"Avg steps: {result.avg_steps:.1f}")
Server-Side Eval
Let the platform handle LLM calls:
from appworld_sdk import AppWorldClient
client = AppWorldClient(api_key="YOUR_API_KEY", base_url="https://api.appworld.dev")
env_info = client.create_environment(task_ids=["FennoteCreateNote"])
result = client.run_eval(
env_id=env_info["id"],
tasks=["FennoteCreateNote"],
model_provider="anthropic",
model_api_key="YOUR_MODEL_KEY",
model_name="claude-sonnet-4-20250514",
)
print(f"Success rate: {result.success_rate}")
API Reference
AppWorldClient(api_key, base_url, timeout)
| Method | Description |
|---|---|
list_apps(**filters) |
List available apps |
list_tasks(**filters) |
List available tasks |
get_task(task_id) |
Get task details |
create_environment(task_ids, name) |
Allocate device resources |
delete_environment(env_id) |
Release resources |
make_env(env_id, env_type) |
Create Gymnasium env |
run_eval(...) |
Server-side evaluation |
run_local_eval(...) |
Client-side evaluation |
Exceptions
| Exception | HTTP | Meaning |
|---|---|---|
AppWorldError |
— | Base exception |
AppWorldAPIError |
any | Server returned an error |
EnvironmentNotReady |
503 | Device not available |
SessionExpired |
410 | Session closed or timed out |
License
Apache 2.0 — see LICENSE for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file appworld_sdk-0.1.3.tar.gz.
File metadata
- Download URL: appworld_sdk-0.1.3.tar.gz
- Upload date:
- Size: 16.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a3edc3f0c3ce02d7a61657eb3910a9d202421d830e4b8fcd0273b8f0c75ea55c
|
|
| MD5 |
e912f064bd8e533d05733369caa30348
|
|
| BLAKE2b-256 |
f6b6c6b67379ddc8c836abff924a79dda503070707013a19f7f4c713a8b3d225
|
File details
Details for the file appworld_sdk-0.1.3-py3-none-any.whl.
File metadata
- Download URL: appworld_sdk-0.1.3-py3-none-any.whl
- Upload date:
- Size: 18.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a3e6d6c96c81456cd84bc102a8bf050e7ef013f5b2df1ed6523b902ebf50e9af
|
|
| MD5 |
12826d490c668f432f348cb9901b8b73
|
|
| BLAKE2b-256 |
b37195ea924ef3631aa431d1540c578a5bff994c06e69b54e13d1784d13ff486
|