Build latest book artifacts / build (push) Canceled after 0s
dependency resolution / resolve (3.11) (push) Canceled after 0s
dependency resolution / resolve (3.13) (push) Canceled after 0s
deploy-pages / build (push) Canceled after 0s
deploy-pages / deploy (push) Canceled after 0s
i18n consistency check / check (push) Canceled after 0s
provider adoption tests / test (chapter2/context-compression) (push) Canceled after 0s
provider adoption tests / test (chapter2/prompt-injection) (push) Canceled after 0s
provider adoption tests / test (chapter2/system-hint) (push) Canceled after 0s
provider adoption tests / test (chapter3/log-sanitization) (push) Canceled after 0s
web-search-agent tests / test (push) Canceled after 0s
web-search-agent tests / agentbook (push) Canceled after 0s
100 lines
3.6 KiB
Python
100 lines
3.6 KiB
Python
#!/usr/bin/env python3
|
|
"""Run one pinned AndroidWorld task with the upstream HumanAgent and evaluator."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
from datetime import datetime, timezone
|
|
import json
|
|
from pathlib import Path
|
|
import sys
|
|
|
|
|
|
def load_uiautomator_env(args):
|
|
from android_env import loader
|
|
from android_env.components import config_classes
|
|
from android_world.env import android_world_controller
|
|
from android_world.env import env_launcher
|
|
from android_world.env import interface
|
|
|
|
config = config_classes.AndroidEnvConfig(
|
|
task=config_classes.FilesystemTaskConfig(
|
|
path=android_world_controller._write_default_task_proto()
|
|
),
|
|
simulator=config_classes.EmulatorConfig(
|
|
emulator_launcher=config_classes.EmulatorLauncherConfig(
|
|
emulator_console_port=args.console_port,
|
|
adb_port=args.console_port + 1,
|
|
grpc_port=args.grpc_port,
|
|
),
|
|
adb_controller=config_classes.AdbControllerConfig(adb_path=args.adb_path),
|
|
),
|
|
)
|
|
base_env = loader.load(config)
|
|
controller = android_world_controller.AndroidWorldController(
|
|
base_env,
|
|
a11y_method=android_world_controller.A11yMethod.UIAUTOMATOR,
|
|
install_a11y_forwarding_app=False,
|
|
)
|
|
env = interface.AsyncAndroidEnv(controller)
|
|
env_launcher.setup_env(env, emulator_setup=False, freeze_datetime=False)
|
|
return env
|
|
|
|
|
|
def main() -> int:
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("--checkout", type=Path, required=True)
|
|
parser.add_argument("--task", required=True)
|
|
parser.add_argument("--tier", choices=("easy", "medium", "hard"), required=True)
|
|
parser.add_argument("--seed", type=int, required=True)
|
|
parser.add_argument("--output", type=Path, required=True)
|
|
parser.add_argument("--adb-path", default="/opt/android/platform-tools/adb")
|
|
parser.add_argument("--console-port", type=int, default=5554)
|
|
parser.add_argument("--grpc-port", type=int, default=8554)
|
|
args = parser.parse_args()
|
|
|
|
sys.path.insert(0, str(args.checkout))
|
|
from android_world import registry
|
|
from android_world import suite_utils
|
|
from android_world.agents import human_agent
|
|
|
|
env = load_uiautomator_env(args)
|
|
task_registry = registry.TaskRegistry()
|
|
suite = suite_utils.create_suite(
|
|
task_registry.get_registry(task_registry.ANDROID_WORLD_FAMILY),
|
|
n_task_combinations=1,
|
|
seed=args.seed,
|
|
tasks=[args.task],
|
|
use_identical_params=True,
|
|
)
|
|
suite.suite_family = task_registry.ANDROID_WORLD_FAMILY
|
|
agent = human_agent.HumanAgent(env)
|
|
agent.name = "human_agent_codex"
|
|
started = datetime.now(timezone.utc)
|
|
try:
|
|
episodes = suite_utils.run(suite, agent)
|
|
finally:
|
|
env.close()
|
|
finished = datetime.now(timezone.utc)
|
|
|
|
result = {
|
|
"benchmark": "AndroidWorld",
|
|
"operator": "Codex acting as the human operator",
|
|
"task_id": args.task,
|
|
"tier": args.tier,
|
|
"seed": args.seed,
|
|
"source_commit": "0e95d641e244504c22087cc29b013f3b2428a261",
|
|
"observation_compatibility_path": "upstream UIAUTOMATOR controller; task and evaluator unchanged",
|
|
"started_at_utc": started.isoformat(),
|
|
"finished_at_utc": finished.isoformat(),
|
|
"episodes": episodes,
|
|
}
|
|
args.output.parent.mkdir(parents=True, exist_ok=True)
|
|
args.output.write_text(json.dumps(result, indent=2, default=str) + "\n", encoding="utf-8")
|
|
print(json.dumps(result, indent=2, default=str))
|
|
return 0 if episodes and episodes[0].get("is_successful") == 1 else 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|