Spaces:
Runtime error
Runtime error
| title: Orchid Env - Map-Reduce Orchestrator Evaluation | |
| emoji: 🤖 | |
| colorFrom: purple | |
| colorTo: blue | |
| sdk: docker | |
| pinned: false | |
| app_port: 8000 | |
| base_path: /web | |
| tags: | |
| - openenv | |
| - rl | |
| - multi-agent | |
| - big-data | |
| # Orchid Env - Map-Reduce Orchestrator Evaluation Environment | |
| Orchid Env is a sophisticated OpenEnv environment designed to evaluate RL agents on their ability to **orchestrate multi-agent workflows**. Instead of solving tasks directly, the agent acts as an **Orchestrator** that must divide a massive dataset into chunks, delegate processing to sub-agents (running in isolated Daytona sandboxes), and synthesize the results. | |
| ## Motivation | |
| Real-world AI engineering often involves managing context window limits and parallelizing data processing. Orchid Env benchmarks an agent's "wisdom" in task decomposition, delegation efficacy, and load balancing across multiple execution environments. | |
| ## Environment Details | |
| ### Action Space | |
| **OrchidAction**: | |
| - `chunking_strategy` (str): Natural language explanation of the breakdown logic. | |
| - `sub_agents` (List[SubAgentConfig]): | |
| - `role_prompt`: Instructions for the sub-agent. | |
| - `start_line` / `end_line`: The slice of the dataset to process. | |
| - `python_code`: The script the sub-agent runs to extract data from its chunk. | |
| - `synthesis_code` (str): Python script to reduce the list of sub-agent outputs into a final answer. | |
| ### Observation Space | |
| **OrchidObservation**: | |
| - `task_description` / `dataset_lines`: Context for the current "Big Data" task. | |
| - `correctness_score` (float): Accuracy of the final synthesized output (0.0 - 1.0). | |
| - `decomposition_score` (float): Efficiency of chunking (penalizes overlap, missing lines, and sub-agent overhead). | |
| - `prompt_score` (float): Heuristic quality of the delegation instructions. | |
| - `reward` (float): Weighted RL signal. | |
| - `done` (bool): True when all tasks in the episode are complete. | |
| ### Task Bank (10,000+ line System Logs) | |
| | Task ID | Objective | Difficulty | Grader Type | | |
| | :--- | :--- | :--- | :--- | | |
| | `extract_anomalies_easy` | Extract 'EASTER_EGG' error codes. | Easy | Jaccard Similarity | | |
| | `count_critical_medium` | Count total 'CRITICAL' logs in the file. | Medium | Distance Penalty | | |
| | `extract_timestamps_hard` | Extract precise timestamps for all anomalies. | Hard | Chronological List | | |
| ## Reward Function | |
| The environment provides a dense, multi-objective reward: | |
| - **Correctness (50%)**: Rewards partial progress (e.g., finding 2/3 items). | |
| - **Decomposition Efficiency (30%)**: Rewards optimal chunk sizes (~2000 lines) and load balancing. Penalizes overlapping or skipped data. | |
| - **Prompt Quality (20%)**: Rewards clear, actionable sub-agent instructions. | |
| - **Trajectory Decay**: `-0.05 * step_count` to penalize inefficient trials. | |
| ## Setup & Usage | |
| ### 1. Installation | |
| ```bash | |
| git clone <repo-url> | |
| cd orchid_env | |
| uv sync | |
| ``` | |
| ### 2. Build and Run Server (Docker) | |
| The environment uses a lightweight Python 3.11-slim image: | |
| ```bash | |
| docker build -t orchid_env-env:latest -f server/Dockerfile . | |
| docker run -p 8000:8000 -e DAYTONA_API_KEY="your_key" orchid_env-env:latest | |
| ``` | |
| ### 3. Running the Baseline Inference | |
| To test an agent (using Gemini or any OpenAI-compatible API): | |
| ```bash | |
| export API_BASE_URL="https://generativelanguage.googleapis.com/v1beta/openai/" | |
| export MODEL_NAME="gemini-1.5-flash" | |
| export API_KEY="your_api_key" | |
| uv run python inference.py | |
| ``` | |
| ## Quick Start Client Example | |
| ```python | |
| from client import OrchidEnv | |
| from models import OrchidAction, SubAgentConfig | |
| async with OrchidEnv(base_url="http://localhost:8000") as env: | |
| obs = await env.reset() | |
| # Define a Map-Reduce plan | |
| action = OrchidAction( | |
| chunking_strategy="Split 10k lines into 5 agents", | |
| sub_agents=[SubAgentConfig(start_line=0, end_line=2000, python_code="...", role_prompt="...")], | |
| synthesis_code="print(sub_outputs)" | |
| ) | |
| result = await env.step(action) | |
| print(f"Orchestration Reward: {result.reward}") | |
| ``` | |