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.3.tar.gz (16.9 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.3-py3-none-any.whl (18.0 kB view details)

Uploaded Python 3

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

Hashes for appworld_sdk-0.1.3.tar.gz
Algorithm Hash digest
SHA256 a3edc3f0c3ce02d7a61657eb3910a9d202421d830e4b8fcd0273b8f0c75ea55c
MD5 e912f064bd8e533d05733369caa30348
BLAKE2b-256 f6b6c6b67379ddc8c836abff924a79dda503070707013a19f7f4c713a8b3d225

See more details on using hashes here.

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

Hashes for appworld_sdk-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 a3e6d6c96c81456cd84bc102a8bf050e7ef013f5b2df1ed6523b902ebf50e9af
MD5 12826d490c668f432f348cb9901b8b73
BLAKE2b-256 b37195ea924ef3631aa431d1540c578a5bff994c06e69b54e13d1784d13ff486

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