Skip to main content

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

appworld_sdk-0.1.5.tar.gz (17.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

appworld_sdk-0.1.5-py3-none-any.whl (18.8 kB view details)

Uploaded Python 3

File details

Details for the file appworld_sdk-0.1.5.tar.gz.

File metadata

  • Download URL: appworld_sdk-0.1.5.tar.gz
  • Upload date:
  • Size: 17.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.7

File hashes

Hashes for appworld_sdk-0.1.5.tar.gz
Algorithm Hash digest
SHA256 2a64e7022522afc953ddf98eee33b48166a2c0ae1480dac18dbfe2b40495e051
MD5 852067f1ee22d0ee5c6137027d90ae14
BLAKE2b-256 ef405c595800fc94cd829d402ec2d260fa5b4df76b5dae7b8d0889c3738d0eb9

See more details on using hashes here.

File details

Details for the file appworld_sdk-0.1.5-py3-none-any.whl.

File metadata

  • Download URL: appworld_sdk-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 18.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.7

File hashes

Hashes for appworld_sdk-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 7ec990b3d64dad7ad76c68bb2c345f87c00e80d7357cebdc56e3f0b33bf06785
MD5 298b0053b6818d66455ea153631d97c6
BLAKE2b-256 7b16a935a90ee8f75943700cc920020c5bb2a1c23562b2dcae228492aef9dca1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page