#!/usr/bin/env python3 """ Test script for benchmark environment concurrency. Run the server first: cd benchmark && uvicorn server.app:app --reload --port 8000 Then run this script: python test_concurrency.py --requests 10 --wait 1.0 """ import argparse import asyncio import time import httpx BASE_URL = "https://burtenshaw-openenv-benchmark.hf.space/" async def reset(client: httpx.AsyncClient) -> dict: """Reset the environment and return observation.""" response = await client.post(f"{BASE_URL}/reset") response.raise_for_status() return response.json() async def step(client: httpx.AsyncClient, wait_seconds: float) -> dict: """Execute a step with the given wait time.""" response = await client.post( f"{BASE_URL}/step", json={"action": {"wait_seconds": wait_seconds}}, ) response.raise_for_status() return response.json() async def timed_request(client: httpx.AsyncClient, wait_seconds: float, request_id: int) -> dict: """Make a timed request and return results with timing info.""" start = time.perf_counter() result = await step(client, wait_seconds) elapsed = time.perf_counter() - start obs = result["observation"] return { "request_id": request_id, "wait_requested": wait_seconds, "elapsed": elapsed, "pid": obs["pid"], "session_hash": obs["session_hash"], } async def test_concurrent(num_requests: int, wait_seconds: float) -> dict: """Test concurrent requests and return timing stats.""" async with httpx.AsyncClient(timeout=60.0) as client: # Reset first reset_result = await reset(client) obs = reset_result["observation"] print(f"Server: {obs['host_url']} | PID: {obs['pid']} | Session: {obs['session_hash']}") print(f"Running {num_requests} concurrent requests, each waiting {wait_seconds}s...") start = time.perf_counter() # Launch all requests concurrently tasks = [timed_request(client, wait_seconds, i) for i in range(num_requests)] results = await asyncio.gather(*tasks) total_time = time.perf_counter() - start avg_time = sum(r["elapsed"] for r in results) / len(results) return { "num_requests": num_requests, "wait_seconds": wait_seconds, "total_time": total_time, "avg_time": avg_time, } async def main(): parser = argparse.ArgumentParser(description="Test benchmark environment concurrency") parser.add_argument("--requests", "-n", type=int, default=10, help="Number of concurrent requests") parser.add_argument("--wait", "-w", type=float, default=1.0, help="Wait time per request (seconds)") parser.add_argument("--url", "-u", type=str, default="http://localhost:8000", help="Server URL") args = parser.parse_args() global BASE_URL BASE_URL = args.url result = await test_concurrent(args.requests, args.wait) print(f"\nTotal time: {result['total_time']:.3f}s") print(f"Avg time: {result['avg_time']:.3f}s") if __name__ == "__main__": asyncio.run(main())