openapp_env / example_usage.py
Crashbandicoote2's picture
Upload folder using huggingface_hub
446b0a9 verified
#!/usr/bin/env python3
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree.
"""
Example usage of OpenApp Environment.
This script demonstrates how to use the OpenApp environment with OpenEnv.
For a complete runnable example, see: examples/openapp_example.py
Visualization Options:
To see the browser window and watch agent interactions:
Terminal 1: Start OpenApps server with visible browser
cd OpenApps
python OpenApps/launch.py browsergym_env_args.headless=False
Terminal 2: Run your agent code
export OPENAPPS_URL=http://localhost:5001
python examples/openapp_example.py --mode local
Or access OpenApps web interface at http://localhost:5001
Docker mode web interface at http://localhost:8000/web
Important:
Browser visualization is controlled by the OpenApps SERVER, not the client.
Launch the server with 'browsergym_env_args.headless=False' to see the browser.
"""
import sys
from pathlib import Path
# Add src to path for local testing
sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent))
from envs.openapp_env import OpenAppAction, OpenAppEnv
def example_basic_usage():
"""Basic usage example."""
print("=" * 60)
print("OpenApp Environment - Basic Usage Example")
print("=" * 60)
# Option 1: Connect to a running server
print("\nOption 1: Connect to running server")
print("client = OpenAppEnv(base_url='http://localhost:8000')")
# Option 2: Start from Docker image (recommended)
print("\nOption 2: Start from Docker image")
print("client = OpenAppEnv.from_docker_image('openapp-env:latest')")
print("\n" + "-" * 60)
def example_actions():
"""Example of different action types."""
print("\nExample Actions")
print("-" * 60)
# Navigate to a page
print("\n1. Navigate to calendar app:")
print("action = OpenAppAction(")
print(" action_type='goto',")
print(" url='http://localhost:5001/calendar'")
print(")")
print("result = client.step(action)")
# Click on an element
print("\n2. Click on a button:")
print("action = OpenAppAction(")
print(" action_type='click',")
print(" bid='add-event-btn' # BrowserGym element ID")
print(")")
print("result = client.step(action)")
# Fill a form field
print("\n3. Fill in text input:")
print("action = OpenAppAction(")
print(" action_type='fill',")
print(" bid='event-title-input',")
print(" text='Team Meeting'")
print(")")
print("result = client.step(action)")
# Select from dropdown
print("\n4. Select from dropdown:")
print("action = OpenAppAction(")
print(" action_type='select_option',")
print(" bid='time-select',")
print(" value='14:00'")
print(")")
print("result = client.step(action)")
# Scroll the page
print("\n5. Scroll down:")
print("action = OpenAppAction(")
print(" action_type='scroll',")
print(" direction='down'")
print(")")
print("result = client.step(action)")
# No operation
print("\n6. No operation (useful for observation):")
print("action = OpenAppAction(action_type='noop')")
print("result = client.step(action)")
def example_observations():
"""Example of observation structure."""
print("\n\nObservation Structure")
print("-" * 60)
print("\nAfter reset() or step(), you receive:")
print("result.observation.html # Current page HTML")
print("result.observation.url # Current URL")
print("result.observation.open_pages_urls # All open pages")
print("result.observation.axtree_txt # Accessibility tree")
print("result.observation.app_state # App states (calendar, todo, etc.)")
print("result.observation.task_info # Task information (if using tasks)")
print("result.observation.screenshot # Page screenshot (base64)")
print("result.observation.last_action_error # Error from last action")
print("result.reward # Step reward")
print("result.done # Episode done flag")
def example_complete_workflow():
"""Complete workflow example."""
print("\n\nComplete Workflow Example")
print("=" * 60)
example_code = """
from envs.openapp_env import OpenAppAction, OpenAppEnv
# Create client (starts Docker container)
client = OpenAppEnv.from_docker_image("openapp-env:latest")
try:
# Reset environment
result = client.reset()
print(f"Starting at: {result.observation.url}")
# Navigate to calendar
result = client.step(OpenAppAction(
action_type="goto",
url="http://localhost:5001/calendar"
))
# Click to add new event
result = client.step(OpenAppAction(
action_type="click",
bid="new-event-button"
))
# Fill event title
result = client.step(OpenAppAction(
action_type="fill",
bid="title-input",
text="Project Review Meeting"
))
# Fill event date
result = client.step(OpenAppAction(
action_type="fill",
bid="date-input",
text="2025-12-15"
))
# Submit form
result = client.step(OpenAppAction(
action_type="click",
bid="submit-button"
))
print(f"Reward: {result.reward}")
print(f"Done: {result.done}")
print(f"App State: {result.observation.app_state}")
finally:
# Always cleanup
client.close()
"""
print(example_code)
def example_with_tasks():
"""Example using OpenApps tasks."""
print("\n\nUsing Tasks (Task-Based RL)")
print("=" * 60)
example_code = """
# Environment can be configured with specific tasks
# Tasks define goals and automatic reward calculation
from envs.openapp_env.server.openapp_environment import OpenAppEnvironment
env = OpenAppEnvironment(
openapps_url="http://localhost:5001", # OpenApps server URL
task_name="add_meeting_with_dennis", # Optional task name
headless=False, # Set to False to watch the browser
max_steps=50,
)
obs = env.reset()
# Now the environment has a goal: add a meeting with Dennis
# Rewards will be based on progress toward this goal
# Agent loop
done = False
while not done:
action = agent.get_action(obs) # Your agent
obs = env.step(action)
done = obs.done
print(f"Task completed! Reward: {obs.reward}")
env.close()
"""
print(example_code)
def example_visualization():
"""Example of visualization options."""
print("\n\nVisualization Options")
print("=" * 60)
example_code = """
# Option 1: Show browser window (watch agent in real-time)
from envs.openapp_env.server.openapp_environment import OpenAppEnvironment
env = OpenAppEnvironment(
openapps_url="http://localhost:5001",
headless=False, # Show browser window
)
obs = env.reset()
# You'll see a browser window open!
# Option 2: Access web interface manually
# While OpenApps server is running, open in your browser:
# - Main: http://localhost:5001
# - Calendar: http://localhost:5001/calendar
# - Todo: http://localhost:5001/todo
# - Messenger: http://localhost:5001/messenger
# - Maps: http://localhost:5001/maps
# Option 3: Use the example script with --show-browser
# python examples/openapp_example.py --mode local --show-browser
"""
print(example_code)
def main():
"""Run all examples."""
example_basic_usage()
example_actions()
example_observations()
example_complete_workflow()
example_with_tasks()
example_visualization()
print("\n" + "=" * 60)
print("For a complete runnable example:")
print(" python examples/openapp_example.py --mode local --show-browser")
print("\nFor more information, see:")
print("- README.md in this directory")
print("- OpenApps docs: https://facebookresearch.github.io/OpenApps/")
print("- OpenEnv docs: https://meta-pytorch.org/OpenEnv/")
print("=" * 60)
if __name__ == "__main__":
main()