--- title: Adjudicator Environment Server emoji: ⚖️ colorFrom: blue colorTo: purple sdk: docker pinned: false app_port: 8000 base_path: /web tags: - openenv --- # Adjudicator Environment A debate training environment where an agent is given a topic and side, and must construct a compelling argument. Arguments are scored by an LLM judge on relevance, evidence, logic, and persuasiveness. ## Quick Start The simplest way to use the Adjudicator environment is through the `AdjudicatorEnv` class: ```python from client import AdjudicatorEnv from models import DebateAction try: # Create environment from Docker image env = AdjudicatorEnv.from_docker_image("adjudicator-env:latest") # Reset — receive a debate topic and side result = env.reset() obs = result.observation print(f"Topic: {obs.topic}") print(f"Side: {obs.side}") print(f"Difficulty: {obs.difficulty}") # Submit an argument action = DebateAction( argument="A 2018 MIT study found false news spreads 6x faster than true news on Twitter, directly damaging public health decisions and political discourse at unprecedented scale." ) result = env.step(action) print(f"Reward: {result.observation.reward}") print(f"Feedback: {result.observation.feedback}") print(f"Scores: {result.observation.scores}") finally: env.close() ``` ## Building the Docker Image ```bash # Generate debate data first python debate_data.py # Build from project root docker build -t adjudicator-env:latest -f server/Dockerfile . ``` ## Deploying to Hugging Face Spaces ```bash # From the environment directory openenv push # With options openenv push --namespace my-org --private ``` The `openenv push` command will: 1. Validate the environment structure 2. Prepare a Hugging Face Docker space build 3. Upload to Hugging Face ### Options - `--directory`, `-d`: Directory containing the environment (defaults to current) - `--repo-id`, `-r`: Repository ID in format `username/repo-name` - `--base-image`, `-b`: Override Dockerfile base image - `--private`: Deploy as private (default: public) ### Examples ```bash openenv push openenv push --repo-id my-org/adjudicator openenv push --private openenv push --repo-id my-org/adjudicator --private ``` After deployment, your space will be available at: `https://huggingface.co/spaces/` The deployed space includes: - **Web Interface** at `/web` — Interactive UI for exploring the environment - **API Documentation** at `/docs` — Full OpenAPI/Swagger interface - **Health Check** at `/health` — Container health monitoring - **WebSocket** at `/ws` — Persistent session endpoint for low-latency interactions ## Environment Details ### Action **DebateAction**: The argument submitted by the agent - `argument` (str) — The debate argument to be judged - `metadata` (dict) — Optional metadata ### Observation **DebateObservation**: Feedback from the judge after each step - `done` (bool) — Whether the episode has ended - `reward` (float) — Normalized score 0.0–1.0 - `topic` (str) — The debate topic - `side` (str) — `"FOR"` or `"AGAINST"` - `difficulty` (int) — Topic difficulty level (1–3) - `attempts_remaining` (int) — Remaining attempts in the episode - `feedback` (str) — One-sentence judge feedback - `scores` (dict) — Breakdown: `relevance`, `evidence`, `logic`, `persuasiveness`, `total` - `metadata` (dict) — Additional info ### Reward Arguments are scored on four criteria (0–10 total), normalized to 0.0–1.0: | Criterion | Max Points | Description | |---|---|---| | Relevance | 3 | Does it address the topic? | | Evidence | 3 | Does it cite facts, studies, or examples? | | Logic | 2 | Is the reasoning sound? | | Persuasiveness | 2 | Would it convince a neutral observer? | ## Advanced Usage ### Connecting to an Existing Server ```python from client import AdjudicatorEnv env = AdjudicatorEnv(base_url="http://localhost:8000") result = env.reset() result = env.step(DebateAction(argument="Your argument here.")) ``` ### Using the Context Manager ```python from client import AdjudicatorEnv from models import DebateAction with AdjudicatorEnv(base_url="http://localhost:8000") as env: result = env.reset() print(f"Topic: {result.observation.topic}") result = env.step(DebateAction(argument="Your argument here.")) print(f"Reward: {result.observation.reward}") ``` ### Running Locally ```bash uvicorn server.app:app --reload ``` ## Project Structure ``` Adjudicator/ ├── __init__.py # Module exports ├── README.md # This file ├── openenv.yaml # OpenEnv manifest ├── pyproject.toml # Project metadata and dependencies ├── uv.lock # Locked dependencies (generated) ├── client.py # AdjudicatorEnv client ├── models.py # DebateAction, DebateObservation, DebateState ├── judge.py # LLM judge (Claude Haiku) ├── debate_data.py # Script to generate debate_data.json ├── debate_data.json # Debate topics dataset ├── game_loop.py # Manual test loop └── server/ ├── __init__.py # Server module exports ├── debate_environment.py # Core environment logic ├── app.py # FastAPI application └── Dockerfile # Container image definition ```