Spaces:
Runtime error
Runtime error
Upload folder using huggingface_hub
Browse files- README.md +76 -219
- training/eval.py +154 -0
- training/scenarios/eval_scenarios.json +142 -0
- training/scenarios/train_scenarios.json +0 -0
- training/train_grpo.py +195 -0
README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
---
|
| 2 |
title: Exec Assistant Arena Environment Server
|
| 3 |
-
emoji:
|
| 4 |
colorFrom: gray
|
| 5 |
colorTo: green
|
| 6 |
sdk: docker
|
|
@@ -11,245 +11,102 @@ tags:
|
|
| 11 |
- openenv
|
| 12 |
---
|
| 13 |
|
| 14 |
-
#
|
| 15 |
|
| 16 |
-
|
| 17 |
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
The simplest way to use the Exec Assistant Arena environment is through the `ExecAssistantArenaEnv` class:
|
| 21 |
-
|
| 22 |
-
```python
|
| 23 |
-
from exec_assistant_arena import ExecAssistantArenaAction, ExecAssistantArenaEnv
|
| 24 |
-
|
| 25 |
-
try:
|
| 26 |
-
# Create environment from Docker image
|
| 27 |
-
exec_assistant_arenaenv = ExecAssistantArenaEnv.from_docker_image("exec_assistant_arena-env:latest")
|
| 28 |
-
|
| 29 |
-
# Reset
|
| 30 |
-
result = exec_assistant_arenaenv.reset()
|
| 31 |
-
print(f"Reset: {result.observation.echoed_message}")
|
| 32 |
-
|
| 33 |
-
# Send multiple messages
|
| 34 |
-
messages = ["Hello, World!", "Testing echo", "Final message"]
|
| 35 |
-
|
| 36 |
-
for msg in messages:
|
| 37 |
-
result = exec_assistant_arenaenv.step(ExecAssistantArenaAction(message=msg))
|
| 38 |
-
print(f"Sent: '{msg}'")
|
| 39 |
-
print(f" → Echoed: '{result.observation.echoed_message}'")
|
| 40 |
-
print(f" → Length: {result.observation.message_length}")
|
| 41 |
-
print(f" → Reward: {result.reward}")
|
| 42 |
-
|
| 43 |
-
finally:
|
| 44 |
-
# Always clean up
|
| 45 |
-
exec_assistant_arenaenv.close()
|
| 46 |
-
```
|
| 47 |
-
|
| 48 |
-
That's it! The `ExecAssistantArenaEnv.from_docker_image()` method handles:
|
| 49 |
-
- Starting the Docker container
|
| 50 |
-
- Waiting for the server to be ready
|
| 51 |
-
- Connecting to the environment
|
| 52 |
-
- Container cleanup when you call `close()`
|
| 53 |
-
|
| 54 |
-
## Building the Docker Image
|
| 55 |
-
|
| 56 |
-
Before using the environment, you need to build the Docker image:
|
| 57 |
-
|
| 58 |
-
```bash
|
| 59 |
-
# From project root
|
| 60 |
-
docker build -t exec_assistant_arena-env:latest -f server/Dockerfile .
|
| 61 |
-
```
|
| 62 |
-
|
| 63 |
-
## Deploying to Hugging Face Spaces
|
| 64 |
|
| 65 |
-
|
| 66 |
|
| 67 |
-
|
| 68 |
-
# From the environment directory (where openenv.yaml is located)
|
| 69 |
-
openenv push
|
| 70 |
-
|
| 71 |
-
# Or specify options
|
| 72 |
-
openenv push --namespace my-org --private
|
| 73 |
-
```
|
| 74 |
-
|
| 75 |
-
The `openenv push` command will:
|
| 76 |
-
1. Validate that the directory is an OpenEnv environment (checks for `openenv.yaml`)
|
| 77 |
-
2. Prepare a custom build for Hugging Face Docker space (enables web interface)
|
| 78 |
-
3. Upload to Hugging Face (ensuring you're logged in)
|
| 79 |
-
|
| 80 |
-
### Prerequisites
|
| 81 |
-
|
| 82 |
-
- Authenticate with Hugging Face: The command will prompt for login if not already authenticated
|
| 83 |
-
|
| 84 |
-
### Options
|
| 85 |
-
|
| 86 |
-
- `--directory`, `-d`: Directory containing the OpenEnv environment (defaults to current directory)
|
| 87 |
-
- `--repo-id`, `-r`: Repository ID in format 'username/repo-name' (defaults to 'username/env-name' from openenv.yaml)
|
| 88 |
-
- `--base-image`, `-b`: Base Docker image to use (overrides Dockerfile FROM)
|
| 89 |
-
- `--private`: Deploy the space as private (default: public)
|
| 90 |
-
|
| 91 |
-
### Examples
|
| 92 |
-
|
| 93 |
-
```bash
|
| 94 |
-
# Push to your personal namespace (defaults to username/env-name from openenv.yaml)
|
| 95 |
-
openenv push
|
| 96 |
-
|
| 97 |
-
# Push to a specific repository
|
| 98 |
-
openenv push --repo-id my-org/my-env
|
| 99 |
-
|
| 100 |
-
# Push with a custom base image
|
| 101 |
-
openenv push --base-image ghcr.io/meta-pytorch/openenv-base:latest
|
| 102 |
-
|
| 103 |
-
# Push as a private space
|
| 104 |
-
openenv push --private
|
| 105 |
-
|
| 106 |
-
# Combine options
|
| 107 |
-
openenv push --repo-id my-org/my-env --base-image custom-base:latest --private
|
| 108 |
-
```
|
| 109 |
|
| 110 |
-
|
| 111 |
-
`https://huggingface.co/spaces/<repo-id>`
|
| 112 |
|
| 113 |
-
|
| 114 |
-
- **
|
| 115 |
-
- **
|
| 116 |
-
- **
|
| 117 |
-
- **WebSocket** at `/ws` - Persistent session endpoint for low-latency interactions
|
| 118 |
|
| 119 |
-
##
|
| 120 |
-
|
| 121 |
-
### Action
|
| 122 |
-
**ExecAssistantArenaAction**: Contains a single field
|
| 123 |
-
- `message` (str) - The message to echo back
|
| 124 |
-
|
| 125 |
-
### Observation
|
| 126 |
-
**ExecAssistantArenaObservation**: Contains the echo response and metadata
|
| 127 |
-
- `echoed_message` (str) - The message echoed back
|
| 128 |
-
- `message_length` (int) - Length of the message
|
| 129 |
-
- `reward` (float) - Reward based on message length (length × 0.1)
|
| 130 |
-
- `done` (bool) - Always False for echo environment
|
| 131 |
-
- `metadata` (dict) - Additional info like step count
|
| 132 |
-
|
| 133 |
-
### Reward
|
| 134 |
-
The reward is calculated as: `message_length × 0.1`
|
| 135 |
-
- "Hi" → reward: 0.2
|
| 136 |
-
- "Hello, World!" → reward: 1.3
|
| 137 |
-
- Empty message → reward: 0.0
|
| 138 |
-
|
| 139 |
-
## Advanced Usage
|
| 140 |
-
|
| 141 |
-
### Connecting to an Existing Server
|
| 142 |
-
|
| 143 |
-
If you already have a Exec Assistant Arena environment server running, you can connect directly:
|
| 144 |
-
|
| 145 |
-
```python
|
| 146 |
-
from exec_assistant_arena import ExecAssistantArenaEnv
|
| 147 |
-
|
| 148 |
-
# Connect to existing server
|
| 149 |
-
exec_assistant_arenaenv = ExecAssistantArenaEnv(base_url="<ENV_HTTP_URL_HERE>")
|
| 150 |
-
|
| 151 |
-
# Use as normal
|
| 152 |
-
result = exec_assistant_arenaenv.reset()
|
| 153 |
-
result = exec_assistant_arenaenv.step(ExecAssistantArenaAction(message="Hello!"))
|
| 154 |
-
```
|
| 155 |
-
|
| 156 |
-
Note: When connecting to an existing server, `exec_assistant_arenaenv.close()` will NOT stop the server.
|
| 157 |
-
|
| 158 |
-
### Using the Context Manager
|
| 159 |
-
|
| 160 |
-
The client supports context manager usage for automatic connection management:
|
| 161 |
-
|
| 162 |
-
```python
|
| 163 |
-
from exec_assistant_arena import ExecAssistantArenaAction, ExecAssistantArenaEnv
|
| 164 |
-
|
| 165 |
-
# Connect with context manager (auto-connects and closes)
|
| 166 |
-
with ExecAssistantArenaEnv(base_url="http://localhost:8000") as env:
|
| 167 |
-
result = env.reset()
|
| 168 |
-
print(f"Reset: {result.observation.echoed_message}")
|
| 169 |
-
# Multiple steps with low latency
|
| 170 |
-
for msg in ["Hello", "World", "!"]:
|
| 171 |
-
result = env.step(ExecAssistantArenaAction(message=msg))
|
| 172 |
-
print(f"Echoed: {result.observation.echoed_message}")
|
| 173 |
-
```
|
| 174 |
-
|
| 175 |
-
The client uses WebSocket connections for:
|
| 176 |
-
- **Lower latency**: No HTTP connection overhead per request
|
| 177 |
-
- **Persistent session**: Server maintains your environment state
|
| 178 |
-
- **Efficient for episodes**: Better for many sequential steps
|
| 179 |
-
|
| 180 |
-
### Concurrent WebSocket Sessions
|
| 181 |
-
|
| 182 |
-
The server supports multiple concurrent WebSocket connections. To enable this,
|
| 183 |
-
modify `server/app.py` to use factory mode:
|
| 184 |
|
| 185 |
```python
|
| 186 |
-
|
| 187 |
-
|
| 188 |
-
|
| 189 |
-
|
| 190 |
-
|
| 191 |
-
|
| 192 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 193 |
```
|
| 194 |
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
```python
|
| 198 |
-
from exec_assistant_arena import ExecAssistantArenaAction, ExecAssistantArenaEnv
|
| 199 |
-
from concurrent.futures import ThreadPoolExecutor
|
| 200 |
-
|
| 201 |
-
def run_episode(client_id: int):
|
| 202 |
-
with ExecAssistantArenaEnv(base_url="http://localhost:8000") as env:
|
| 203 |
-
result = env.reset()
|
| 204 |
-
for i in range(10):
|
| 205 |
-
result = env.step(ExecAssistantArenaAction(message=f"Client {client_id}, step {i}"))
|
| 206 |
-
return client_id, result.observation.message_length
|
| 207 |
-
|
| 208 |
-
# Run 4 episodes concurrently
|
| 209 |
-
with ThreadPoolExecutor(max_workers=4) as executor:
|
| 210 |
-
results = list(executor.map(run_episode, range(4)))
|
| 211 |
-
```
|
| 212 |
|
| 213 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 214 |
|
| 215 |
-
##
|
| 216 |
|
| 217 |
-
|
| 218 |
|
| 219 |
```bash
|
| 220 |
-
#
|
| 221 |
-
|
|
|
|
|
|
|
| 222 |
```
|
| 223 |
|
| 224 |
-
|
| 225 |
-
- Environment resets correctly
|
| 226 |
-
- Step executes actions properly
|
| 227 |
-
- State tracking works
|
| 228 |
-
- Rewards are calculated correctly
|
| 229 |
-
|
| 230 |
-
### Running Locally
|
| 231 |
-
|
| 232 |
-
Run the server locally for development:
|
| 233 |
-
|
| 234 |
-
```bash
|
| 235 |
-
uvicorn server.app:app --reload
|
| 236 |
-
```
|
| 237 |
|
| 238 |
## Project Structure
|
| 239 |
|
| 240 |
```
|
| 241 |
exec_assistant_arena/
|
| 242 |
-
├── .
|
| 243 |
-
├──
|
| 244 |
-
├──
|
| 245 |
-
├──
|
| 246 |
-
├──
|
| 247 |
-
├──
|
| 248 |
-
|
| 249 |
-
|
| 250 |
-
|
| 251 |
-
├──
|
| 252 |
-
├──
|
| 253 |
-
|
| 254 |
-
|
|
|
|
| 255 |
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
title: Exec Assistant Arena Environment Server
|
| 3 |
+
emoji: 📋
|
| 4 |
colorFrom: gray
|
| 5 |
colorTo: green
|
| 6 |
sdk: docker
|
|
|
|
| 11 |
- openenv
|
| 12 |
---
|
| 13 |
|
| 14 |
+
# Executive Assistant Arena
|
| 15 |
|
| 16 |
+
An [OpenEnv](https://github.com/meta-pytorch/OpenEnv) environment that simulates a personal assistant's morning inbox. The LLM agent must resolve calendar conflicts, draft email replies, infer hidden user preferences, and handle late-breaking schedule changes.
|
| 17 |
|
| 18 |
+
Trained a Qwen2.5-7B model via GRPO on this environment, showing measurable improvement across 6 decomposed reward components.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
|
| 20 |
+
## The Problem
|
| 21 |
|
| 22 |
+
Your AI assistant double-books you, ignores your "no mornings" preference, and can't handle it when your boss reschedules a meeting at the last minute. This environment trains LLMs to actually handle real-world scheduling chaos.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
|
| 24 |
+
## Architecture
|
|
|
|
| 25 |
|
| 26 |
+
- **Environment**: Procedurally generated scenarios with calendar conflicts, emails, user preferences, and late-breaking changes
|
| 27 |
+
- **3 difficulty tiers**: Easy (2 conflicts), Medium (4 conflicts + late changes), Hard (6 conflicts + 2 late changes)
|
| 28 |
+
- **6 reward components**: conflict resolution, preference inference, email quality, deadline adherence, efficiency, late-change recovery
|
| 29 |
+
- **All rewards are rule-based** — no LLM judges, fully deterministic and verifiable
|
|
|
|
| 30 |
|
| 31 |
+
## Quick Start
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
|
| 33 |
```python
|
| 34 |
+
from exec_assistant_arena import ExecAssistantArenaEnv, AssistantAction
|
| 35 |
+
|
| 36 |
+
with ExecAssistantArenaEnv(base_url="https://SidraMiconi-exec-assistant-arena.hf.space") as env:
|
| 37 |
+
result = env.reset(seed=42, difficulty="medium")
|
| 38 |
+
print(result.observation.tool_result) # scenario description
|
| 39 |
+
print(result.observation.conflicts) # scheduling conflicts
|
| 40 |
+
|
| 41 |
+
# Resolve a conflict
|
| 42 |
+
result = env.step(AssistantAction(
|
| 43 |
+
tool="reschedule",
|
| 44 |
+
arguments={"event_id": "mtg_2", "new_time": "2:00pm"}
|
| 45 |
+
))
|
| 46 |
+
print(f"Reward: {result.reward}") # +1.0 for resolved conflict
|
| 47 |
+
|
| 48 |
+
# Draft an email reply
|
| 49 |
+
result = env.step(AssistantAction(
|
| 50 |
+
tool="draft_reply",
|
| 51 |
+
arguments={
|
| 52 |
+
"email_id": "email_1",
|
| 53 |
+
"body": "Hey! Sure thing, I'll get the budget review to you by tomorrow."
|
| 54 |
+
}
|
| 55 |
+
))
|
| 56 |
+
|
| 57 |
+
# Finish
|
| 58 |
+
result = env.step(AssistantAction(tool="done"))
|
| 59 |
```
|
| 60 |
|
| 61 |
+
## Available Tools
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 62 |
|
| 63 |
+
| Tool | Arguments | Reward |
|
| 64 |
+
|------|-----------|--------|
|
| 65 |
+
| `check_calendar` | none | 0 (free) |
|
| 66 |
+
| `check_inbox` | none | 0 (free) |
|
| 67 |
+
| `reschedule` | `event_id`, `new_time` | +1.0 resolve, -0.5 new conflict |
|
| 68 |
+
| `draft_reply` | `email_id`, `body` | 0.0 to +1.0 (quality scored) |
|
| 69 |
+
| `delegate_task` | `task`, `to` | +0.5 if handles late change |
|
| 70 |
+
| `done` | none | terminal rewards |
|
| 71 |
|
| 72 |
+
## Training
|
| 73 |
|
| 74 |
+
Trained with GRPO (Group Relative Policy Optimization) using Unsloth + TRL:
|
| 75 |
|
| 76 |
```bash
|
| 77 |
+
# On H100
|
| 78 |
+
cd exec_assistant_arena
|
| 79 |
+
PYTHONPATH=. uvicorn server.app:app --host 0.0.0.0 --port 8000 &
|
| 80 |
+
python training/train_grpo.py
|
| 81 |
```
|
| 82 |
|
| 83 |
+
Colab notebook available at `training/train_colab.ipynb` for reproducing on free T4 GPU.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 84 |
|
| 85 |
## Project Structure
|
| 86 |
|
| 87 |
```
|
| 88 |
exec_assistant_arena/
|
| 89 |
+
├── models.py # Action, Observation, State
|
| 90 |
+
├── client.py # WebSocket client
|
| 91 |
+
├── server/
|
| 92 |
+
│ ├── app.py # FastAPI server
|
| 93 |
+
│ ├── exec_assistant_arena_environment.py # Core env logic
|
| 94 |
+
│ ├── scenario_generator.py # Procedural generation
|
| 95 |
+
│ └── reward.py # 6 decomposed reward components
|
| 96 |
+
└── training/
|
| 97 |
+
├── train_grpo.py # H100 training script
|
| 98 |
+
├── train_colab.ipynb # Colab version
|
| 99 |
+
├── eval.py # Before/after evaluation
|
| 100 |
+
└── scenarios/
|
| 101 |
+
├── train_scenarios.json # 80 training scenarios
|
| 102 |
+
└── eval_scenarios.json # 20 held-out scenarios
|
| 103 |
```
|
| 104 |
+
|
| 105 |
+
## Links
|
| 106 |
+
|
| 107 |
+
- **HF Space**: https://huggingface.co/spaces/SidraMiconi/exec-assistant-arena
|
| 108 |
+
- **GitHub**: https://github.com/Sidra/chief-of-staff/tree/main/exec_assistant_arena
|
| 109 |
+
- **W&B**: https://wandb.ai/code-happy-sf/exec-assistant-arena
|
| 110 |
+
- **Trained Model**: https://huggingface.co/SidraMiconi/exec-assistant-arena-lora
|
| 111 |
+
|
| 112 |
+
Built for the OpenEnv Hackathon SF, March 7-8, 2026.
|
training/eval.py
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Evaluation script: compare base model vs trained model on held-out scenarios.
|
| 2 |
+
|
| 3 |
+
Usage:
|
| 4 |
+
python training/eval.py --base-model Qwen/Qwen2.5-7B --trained-model SidraMiconi/exec-assistant-arena-lora
|
| 5 |
+
"""
|
| 6 |
+
|
| 7 |
+
import json
|
| 8 |
+
import os
|
| 9 |
+
import sys
|
| 10 |
+
import argparse
|
| 11 |
+
|
| 12 |
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
| 13 |
+
|
| 14 |
+
from exec_assistant_arena import ExecAssistantArenaEnv
|
| 15 |
+
from exec_assistant_arena.models import AssistantAction
|
| 16 |
+
from training.train_grpo import parse_tool_calls
|
| 17 |
+
|
| 18 |
+
ENV_URL = "http://localhost:8000"
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def evaluate_model(model, tokenizer, scenarios, env_url, label="model"):
|
| 22 |
+
"""Run model through eval scenarios and collect metrics."""
|
| 23 |
+
from unsloth import FastLanguageModel
|
| 24 |
+
FastLanguageModel.for_inference(model)
|
| 25 |
+
|
| 26 |
+
results = []
|
| 27 |
+
|
| 28 |
+
for i, scenario in enumerate(scenarios):
|
| 29 |
+
prompt = scenario["prompt"]
|
| 30 |
+
inputs = tokenizer(prompt, return_tensors="pt", truncation=True, max_length=2048).to("cuda")
|
| 31 |
+
|
| 32 |
+
outputs = model.generate(
|
| 33 |
+
**inputs,
|
| 34 |
+
max_new_tokens=1024,
|
| 35 |
+
temperature=0.7,
|
| 36 |
+
do_sample=True,
|
| 37 |
+
)
|
| 38 |
+
completion = tokenizer.decode(outputs[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)
|
| 39 |
+
|
| 40 |
+
# Score through environment
|
| 41 |
+
try:
|
| 42 |
+
with ExecAssistantArenaEnv(base_url=env_url) as env:
|
| 43 |
+
seed = scenario.get("seed", i + 80)
|
| 44 |
+
difficulty = scenario.get("difficulty", "medium")
|
| 45 |
+
env.reset(seed=seed, difficulty=difficulty)
|
| 46 |
+
|
| 47 |
+
actions = parse_tool_calls(completion)
|
| 48 |
+
total_reward = 0.0
|
| 49 |
+
for action in actions:
|
| 50 |
+
result = env.step(action)
|
| 51 |
+
total_reward += (result.reward or 0.0)
|
| 52 |
+
if result.done:
|
| 53 |
+
break
|
| 54 |
+
|
| 55 |
+
if not result.done:
|
| 56 |
+
result = env.step(AssistantAction(tool="done"))
|
| 57 |
+
total_reward += (result.reward or 0.0)
|
| 58 |
+
|
| 59 |
+
state = env.state()
|
| 60 |
+
results.append({
|
| 61 |
+
"scenario_idx": i,
|
| 62 |
+
"seed": seed,
|
| 63 |
+
"difficulty": difficulty,
|
| 64 |
+
"total_reward": total_reward,
|
| 65 |
+
"conflicts_resolved": state.conflicts_resolved,
|
| 66 |
+
"total_conflicts": state.total_conflicts,
|
| 67 |
+
"conflict_rate": state.conflicts_resolved / max(1, state.total_conflicts),
|
| 68 |
+
"emails_drafted": state.emails_drafted,
|
| 69 |
+
"total_emails": state.total_emails,
|
| 70 |
+
"preferences_inferred": state.preferences_inferred,
|
| 71 |
+
"deadlines_met": state.deadlines_met,
|
| 72 |
+
"unnecessary_actions": state.unnecessary_actions,
|
| 73 |
+
"n_actions": len(actions),
|
| 74 |
+
"completion": completion[:500],
|
| 75 |
+
})
|
| 76 |
+
except Exception as e:
|
| 77 |
+
print(f" Error on scenario {i}: {e}")
|
| 78 |
+
results.append({"scenario_idx": i, "total_reward": -1.0, "error": str(e)})
|
| 79 |
+
|
| 80 |
+
print(f" [{label}] Scenario {i}: reward={results[-1].get('total_reward', 'err'):.2f}")
|
| 81 |
+
|
| 82 |
+
return results
|
| 83 |
+
|
| 84 |
+
|
| 85 |
+
def print_comparison(base_results, trained_results):
|
| 86 |
+
"""Print side-by-side comparison."""
|
| 87 |
+
print("\n" + "=" * 70)
|
| 88 |
+
print("EVALUATION RESULTS")
|
| 89 |
+
print("=" * 70)
|
| 90 |
+
|
| 91 |
+
metrics = ["total_reward", "conflict_rate", "emails_drafted", "preferences_inferred", "unnecessary_actions"]
|
| 92 |
+
|
| 93 |
+
for metric in metrics:
|
| 94 |
+
base_vals = [r.get(metric, 0) for r in base_results if "error" not in r]
|
| 95 |
+
trained_vals = [r.get(metric, 0) for r in trained_results if "error" not in r]
|
| 96 |
+
|
| 97 |
+
if base_vals and trained_vals:
|
| 98 |
+
base_avg = sum(base_vals) / len(base_vals)
|
| 99 |
+
trained_avg = sum(trained_vals) / len(trained_vals)
|
| 100 |
+
delta = trained_avg - base_avg
|
| 101 |
+
print(f" {metric:25s} base={base_avg:7.2f} trained={trained_avg:7.2f} delta={delta:+.2f}")
|
| 102 |
+
|
| 103 |
+
print("=" * 70)
|
| 104 |
+
|
| 105 |
+
|
| 106 |
+
def main():
|
| 107 |
+
parser = argparse.ArgumentParser()
|
| 108 |
+
parser.add_argument("--base-model", default="Qwen/Qwen2.5-7B")
|
| 109 |
+
parser.add_argument("--trained-model", default="SidraMiconi/exec-assistant-arena-lora")
|
| 110 |
+
parser.add_argument("--env-url", default=ENV_URL)
|
| 111 |
+
parser.add_argument("--output", default="training/eval_results.json")
|
| 112 |
+
args = parser.parse_args()
|
| 113 |
+
|
| 114 |
+
script_dir = os.path.dirname(os.path.abspath(__file__))
|
| 115 |
+
with open(os.path.join(script_dir, "scenarios/eval_scenarios.json")) as f:
|
| 116 |
+
scenarios = json.load(f)
|
| 117 |
+
|
| 118 |
+
print(f"Evaluating on {len(scenarios)} held-out scenarios\n")
|
| 119 |
+
|
| 120 |
+
from unsloth import FastLanguageModel
|
| 121 |
+
|
| 122 |
+
# Load base model
|
| 123 |
+
print("Loading base model...")
|
| 124 |
+
base_model, base_tokenizer = FastLanguageModel.from_pretrained(
|
| 125 |
+
model_name=args.base_model, max_seq_length=2048, load_in_4bit=True,
|
| 126 |
+
)
|
| 127 |
+
print("Evaluating base model...")
|
| 128 |
+
base_results = evaluate_model(base_model, base_tokenizer, scenarios, args.env_url, "base")
|
| 129 |
+
del base_model
|
| 130 |
+
|
| 131 |
+
# Load trained model
|
| 132 |
+
print("\nLoading trained model...")
|
| 133 |
+
trained_model, trained_tokenizer = FastLanguageModel.from_pretrained(
|
| 134 |
+
model_name=args.trained_model, max_seq_length=2048, load_in_4bit=True,
|
| 135 |
+
)
|
| 136 |
+
print("Evaluating trained model...")
|
| 137 |
+
trained_results = evaluate_model(trained_model, trained_tokenizer, scenarios, args.env_url, "trained")
|
| 138 |
+
|
| 139 |
+
print_comparison(base_results, trained_results)
|
| 140 |
+
|
| 141 |
+
# Save results
|
| 142 |
+
output = {
|
| 143 |
+
"base_model": args.base_model,
|
| 144 |
+
"trained_model": args.trained_model,
|
| 145 |
+
"base_results": base_results,
|
| 146 |
+
"trained_results": trained_results,
|
| 147 |
+
}
|
| 148 |
+
with open(args.output, "w") as f:
|
| 149 |
+
json.dump(output, f, indent=2)
|
| 150 |
+
print(f"\nResults saved to {args.output}")
|
| 151 |
+
|
| 152 |
+
|
| 153 |
+
if __name__ == "__main__":
|
| 154 |
+
main()
|
training/scenarios/eval_scenarios.json
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[
|
| 2 |
+
{
|
| 3 |
+
"prompt": "You are an executive assistant. Your job is to manage the user's calendar and inbox efficiently.\n\nTODAY'S CALENDAR:\n[mtg_1] 9:30am (60min) - board prep with Eve Johnson [priority: high]\n[mtg_2] 9:30am (60min) - interview with Grace Wang [priority: high]\n[mtg_3] 11:00am (30min) - all-hands with Irene Davis [priority: medium]\n[mtg_4] 11:30am (30min) - 1:1 with Carol Park [priority: high]\n\nINBOX:\n[email_1] From: Henry Brown | Subject: Performance Review Follow-up [DEADLINE: today]\n Hi, I wanted to follow up on performance review follow-up. Could you get back to me by today? Thanks, Henry Brown\n\nSCHEDULING CONFLICTS:\nCONFLICT: mtg_1 overlaps with mtg_2\n\nUSER PREFERENCES:\n - User avoids meetings on Fridays\n - User always blocks 12pm-1pm for lunch\n\nPENDING TASKS:\n - Resolve conflict between mtg_1 and mtg_2\n - Reply to email email_1 from Henry Brown\n\nAvailable tools: check_calendar, check_inbox, reschedule, draft_reply, delegate_task, done\n\nResolve all conflicts, reply to emails respecting user preferences, and call \"done\" when finished.\nEach tool call should be formatted as: {\"tool\": \"tool_name\", \"arguments\": {...}}",
|
| 4 |
+
"seed": 80,
|
| 5 |
+
"difficulty": "easy",
|
| 6 |
+
"n_conflicts": 1,
|
| 7 |
+
"n_emails": 1
|
| 8 |
+
},
|
| 9 |
+
{
|
| 10 |
+
"prompt": "You are an executive assistant. Your job is to manage the user's calendar and inbox efficiently.\n\nTODAY'S CALENDAR:\n[mtg_1] 9:00am (30min) - interview with Irene Davis [priority: medium]\n[mtg_2] 9:00am (60min) - lunch meeting with Henry Brown [priority: medium]\n[mtg_3] 11:00am (30min) - 1:1 with Frank Lee [priority: medium]\n[mtg_4] 1:30pm (30min) - team standup with Eve Johnson [priority: high]\n\nINBOX:\n[email_1] From: Grace Wang | Subject: Partnership Proposal\n Hi, I wanted to follow up on partnership proposal. Could you get back to me? Thanks, Grace Wang\n\nSCHEDULING CONFLICTS:\nCONFLICT: mtg_1 overlaps with mtg_2\n\nUSER PREFERENCES:\n - User avoids meetings on Fridays\n - User prefers informal/casual tone in emails\n\nPENDING TASKS:\n - Resolve conflict between mtg_1 and mtg_2\n - Reply to email email_1 from Grace Wang\n\nAvailable tools: check_calendar, check_inbox, reschedule, draft_reply, delegate_task, done\n\nResolve all conflicts, reply to emails respecting user preferences, and call \"done\" when finished.\nEach tool call should be formatted as: {\"tool\": \"tool_name\", \"arguments\": {...}}",
|
| 11 |
+
"seed": 81,
|
| 12 |
+
"difficulty": "easy",
|
| 13 |
+
"n_conflicts": 1,
|
| 14 |
+
"n_emails": 1
|
| 15 |
+
},
|
| 16 |
+
{
|
| 17 |
+
"prompt": "You are an executive assistant. Your job is to manage the user's calendar and inbox efficiently.\n\nTODAY'S CALENDAR:\n[mtg_1] 4:30pm (30min) - client call with Carol Park [priority: medium]\n[mtg_2] 4:30pm (30min) - sprint planning with Henry Brown [priority: high]\n[mtg_3] 10:00am (30min) - strategy session with Eve Johnson [priority: medium]\n[mtg_4] 4:30pm (60min) - interview with Grace Wang [priority: medium]\n\nINBOX:\n[email_1] From: Bob Martinez | Subject: Team Offsite Planning [DEADLINE: today]\n Hi, I wanted to follow up on team offsite planning. Could you get back to me by today? Thanks, Bob Martinez\n\nSCHEDULING CONFLICTS:\nCONFLICT: mtg_1 overlaps with mtg_2\nCONFLICT: mtg_1 overlaps with mtg_4\nCONFLICT: mtg_2 overlaps with mtg_4\n\nUSER PREFERENCES:\n - User prefers formal/professional tone in emails\n - User avoids meetings on Fridays\n\nPENDING TASKS:\n - Resolve conflict between mtg_1 and mtg_2\n - Resolve conflict between mtg_1 and mtg_4\n - Resolve conflict between mtg_2 and mtg_4\n - Reply to email email_1 from Bob Martinez\n\nAvailable tools: check_calendar, check_inbox, reschedule, draft_reply, delegate_task, done\n\nResolve all conflicts, reply to emails respecting user preferences, and call \"done\" when finished.\nEach tool call should be formatted as: {\"tool\": \"tool_name\", \"arguments\": {...}}",
|
| 18 |
+
"seed": 82,
|
| 19 |
+
"difficulty": "easy",
|
| 20 |
+
"n_conflicts": 3,
|
| 21 |
+
"n_emails": 1
|
| 22 |
+
},
|
| 23 |
+
{
|
| 24 |
+
"prompt": "You are an executive assistant. Your job is to manage the user's calendar and inbox efficiently.\n\nTODAY'S CALENDAR:\n[mtg_1] 10:00am (30min) - 1:1 with Henry Brown [priority: medium]\n[mtg_2] 10:00am (30min) - strategy session with Jack Wilson [priority: medium]\n[mtg_3] 12:00pm (60min) - design review with Bob Martinez [priority: medium]\n[mtg_4] 12:30pm (60min) - team standup with Irene Davis [priority: low]\n\nINBOX:\n[email_1] From: David Kim | Subject: Hiring Update [DEADLINE: today]\n Hi, I wanted to follow up on hiring update. Could you get back to me by today? Thanks, David Kim\n\nSCHEDULING CONFLICTS:\nCONFLICT: mtg_1 overlaps with mtg_2\nCONFLICT: mtg_3 overlaps with mtg_4\n\nUSER PREFERENCES:\n - User prefers no meetings before 10am\n - Client meetings cannot be rescheduled\n\nPENDING TASKS:\n - Resolve conflict between mtg_1 and mtg_2\n - Resolve conflict between mtg_3 and mtg_4\n - Reply to email email_1 from David Kim\n\nAvailable tools: check_calendar, check_inbox, reschedule, draft_reply, delegate_task, done\n\nResolve all conflicts, reply to emails respecting user preferences, and call \"done\" when finished.\nEach tool call should be formatted as: {\"tool\": \"tool_name\", \"arguments\": {...}}",
|
| 25 |
+
"seed": 83,
|
| 26 |
+
"difficulty": "easy",
|
| 27 |
+
"n_conflicts": 2,
|
| 28 |
+
"n_emails": 1
|
| 29 |
+
},
|
| 30 |
+
{
|
| 31 |
+
"prompt": "You are an executive assistant. Your job is to manage the user's calendar and inbox efficiently.\n\nTODAY'S CALENDAR:\n[mtg_1] 11:00am (60min) - all-hands with Eve Johnson [priority: low]\n[mtg_2] 11:00am (60min) - design review with Alice Chen [priority: low]\n[mtg_3] 2:00pm (60min) - lunch meeting with Henry Brown [priority: low]\n[mtg_4] 4:30pm (30min) - board prep with Irene Davis [priority: high]\n\nINBOX:\n[email_1] From: Jack Wilson | Subject: Q3 Budget Review [DEADLINE: tomorrow]\n Hi, I wanted to follow up on q3 budget review. Could you get back to me by tomorrow? Thanks, Jack Wilson\n\nSCHEDULING CONFLICTS:\nCONFLICT: mtg_1 overlaps with mtg_2\n\nUSER PREFERENCES:\n - User needs 15-min buffer between meetings\n - User prefers 30-min meetings over 60-min\n\nPENDING TASKS:\n - Resolve conflict between mtg_1 and mtg_2\n - Reply to email email_1 from Jack Wilson\n\nAvailable tools: check_calendar, check_inbox, reschedule, draft_reply, delegate_task, done\n\nResolve all conflicts, reply to emails respecting user preferences, and call \"done\" when finished.\nEach tool call should be formatted as: {\"tool\": \"tool_name\", \"arguments\": {...}}",
|
| 32 |
+
"seed": 84,
|
| 33 |
+
"difficulty": "easy",
|
| 34 |
+
"n_conflicts": 1,
|
| 35 |
+
"n_emails": 1
|
| 36 |
+
},
|
| 37 |
+
{
|
| 38 |
+
"prompt": "You are an executive assistant. Your job is to manage the user's calendar and inbox efficiently.\n\nTODAY'S CALENDAR:\n[mtg_1] 12:30pm (60min) - lunch meeting with David Kim [priority: low]\n[mtg_2] 12:30pm (60min) - all-hands with Bob Martinez [priority: low]\n[mtg_3] 10:00am (30min) - design review with Frank Lee [priority: high]\n[mtg_4] 4:00pm (60min) - board prep with Irene Davis [priority: medium]\n\nINBOX:\n[email_1] From: Grace Wang | Subject: Hiring Update [DEADLINE: today]\n Hi, I wanted to follow up on hiring update. Could you get back to me by today? Thanks, Grace Wang\n\nSCHEDULING CONFLICTS:\nCONFLICT: mtg_1 overlaps with mtg_2\n\nUSER PREFERENCES:\n - User prefers informal/casual tone in emails\n - Meetings with the boss always take priority\n\nPENDING TASKS:\n - Resolve conflict between mtg_1 and mtg_2\n - Reply to email email_1 from Grace Wang\n\nAvailable tools: check_calendar, check_inbox, reschedule, draft_reply, delegate_task, done\n\nResolve all conflicts, reply to emails respecting user preferences, and call \"done\" when finished.\nEach tool call should be formatted as: {\"tool\": \"tool_name\", \"arguments\": {...}}",
|
| 39 |
+
"seed": 85,
|
| 40 |
+
"difficulty": "easy",
|
| 41 |
+
"n_conflicts": 1,
|
| 42 |
+
"n_emails": 1
|
| 43 |
+
},
|
| 44 |
+
{
|
| 45 |
+
"prompt": "You are an executive assistant. Your job is to manage the user's calendar and inbox efficiently.\n\nTODAY'S CALENDAR:\n[mtg_1] 5:00pm (60min) - team standup with Alice Chen [priority: high]\n[mtg_2] 5:00pm (30min) - board prep with Irene Davis [priority: medium]\n[mtg_3] 12:00pm (30min) - sprint planning with Frank Lee [priority: low]\n[mtg_4] 9:30am (30min) - interview with Henry Brown [priority: medium]\n\nINBOX:\n[email_1] From: Jack Wilson | Subject: Client Demo Prep [DEADLINE: today]\n Hi, I wanted to follow up on client demo prep. Could you get back to me by today? Thanks, Jack Wilson\n\nSCHEDULING CONFLICTS:\nCONFLICT: mtg_1 overlaps with mtg_2\n\nUSER PREFERENCES:\n - Client meetings cannot be rescheduled\n - Meetings with the boss always take priority\n\nPENDING TASKS:\n - Resolve conflict between mtg_1 and mtg_2\n - Reply to email email_1 from Jack Wilson\n\nAvailable tools: check_calendar, check_inbox, reschedule, draft_reply, delegate_task, done\n\nResolve all conflicts, reply to emails respecting user preferences, and call \"done\" when finished.\nEach tool call should be formatted as: {\"tool\": \"tool_name\", \"arguments\": {...}}",
|
| 46 |
+
"seed": 86,
|
| 47 |
+
"difficulty": "easy",
|
| 48 |
+
"n_conflicts": 1,
|
| 49 |
+
"n_emails": 1
|
| 50 |
+
},
|
| 51 |
+
{
|
| 52 |
+
"prompt": "You are an executive assistant. Your job is to manage the user's calendar and inbox efficiently.\n\nTODAY'S CALENDAR:\n[mtg_1] 12:00pm (30min) - all-hands with Carol Park [priority: low]\n[mtg_2] 12:00pm (60min) - 1:1 with David Kim [priority: high]\n[mtg_3] 12:00pm (60min) - sprint planning with Bob Martinez [priority: high]\n[mtg_4] 12:00pm (60min) - design review with Jack Wilson [priority: medium]\n[mtg_5] 12:00pm (60min) - board prep with Grace Wang [priority: high]\n[mtg_6] 1:30pm (60min) - interview with Eve Johnson [priority: low]\n\nINBOX:\n[email_1] From: Frank Lee | Subject: Q3 Budget Review [DEADLINE: tomorrow]\n Hi, I wanted to follow up on q3 budget review. Could you get back to me by tomorrow? Thanks, Frank Lee\n\n[email_2] From: Irene Davis | Subject: Q3 Budget Review [DEADLINE: today]\n Hi, I wanted to follow up on q3 budget review. Could you get back to me by today? Thanks, Irene Davis\n\n[email_3] From: Alice Chen | Subject: Q3 Budget Review [DEADLINE: today]\n Hi, I wanted to follow up on q3 budget review. Could you get back to me by today? Thanks, Alice Chen\n\nSCHEDULING CONFLICTS:\nCONFLICT: mtg_1 overlaps with mtg_2\nCONFLICT: mtg_1 overlaps with mtg_3\nCONFLICT: mtg_1 overlaps with mtg_4\nCONFLICT: mtg_1 overlaps with mtg_5\nCONFLICT: mtg_2 overlaps with mtg_3\nCONFLICT: mtg_2 overlaps with mtg_4\nCONFLICT: mtg_2 overlaps with mtg_5\nCONFLICT: mtg_3 overlaps with mtg_4\nCONFLICT: mtg_3 overlaps with mtg_5\nCONFLICT: mtg_4 overlaps with mtg_5\n\nUSER PREFERENCES:\n - User prefers 30-min meetings over 60-min\n - Client meetings cannot be rescheduled\n - User prefers formal/professional tone in emails\n - User avoids meetings on Fridays\n\nPENDING TASKS:\n - Resolve conflict between mtg_1 and mtg_2\n - Resolve conflict between mtg_1 and mtg_3\n - Resolve conflict between mtg_1 and mtg_4\n - Resolve conflict between mtg_1 and mtg_5\n - Resolve conflict between mtg_2 and mtg_3\n - Resolve conflict between mtg_2 and mtg_4\n - Resolve conflict between mtg_2 and mtg_5\n - Resolve conflict between mtg_3 and mtg_4\n - Resolve conflict between mtg_3 and mtg_5\n - Resolve conflict between mtg_4 and mtg_5\n - Reply to email email_1 from Frank Lee\n - Reply to email email_2 from Irene Davis\n - Reply to email email_3 from Alice Chen\n\nAvailable tools: check_calendar, check_inbox, reschedule, draft_reply, delegate_task, done\n\nResolve all conflicts, reply to emails respecting user preferences, and call \"done\" when finished.\nEach tool call should be formatted as: {\"tool\": \"tool_name\", \"arguments\": {...}}",
|
| 53 |
+
"seed": 87,
|
| 54 |
+
"difficulty": "medium",
|
| 55 |
+
"n_conflicts": 10,
|
| 56 |
+
"n_emails": 3
|
| 57 |
+
},
|
| 58 |
+
{
|
| 59 |
+
"prompt": "You are an executive assistant. Your job is to manage the user's calendar and inbox efficiently.\n\nTODAY'S CALENDAR:\n[mtg_1] 3:30pm (30min) - client call with Grace Wang [priority: medium]\n[mtg_2] 3:30pm (60min) - design review with David Kim [priority: low]\n[mtg_3] 3:30pm (30min) - team standup with Frank Lee [priority: medium]\n[mtg_4] 3:30pm (30min) - all-hands with Bob Martinez [priority: medium]\n[mtg_5] 12:30pm (30min) - lunch meeting with Henry Brown [priority: high]\n[mtg_6] 9:00am (60min) - sprint planning with Alice Chen [priority: high]\n\nINBOX:\n[email_1] From: Eve Johnson | Subject: Performance Review Follow-up [DEADLINE: today]\n Hi, I wanted to follow up on performance review follow-up. Could you get back to me by today? Thanks, Eve Johnson\n\n[email_2] From: Jack Wilson | Subject: Hiring Update [DEADLINE: tomorrow]\n Hi, I wanted to follow up on hiring update. Could you get back to me by tomorrow? Thanks, Jack Wilson\n\n[email_3] From: Carol Park | Subject: Customer Escalation [DEADLINE: tomorrow]\n Hi, I wanted to follow up on customer escalation. Could you get back to me by tomorrow? Thanks, Carol Park\n\nSCHEDULING CONFLICTS:\nCONFLICT: mtg_1 overlaps with mtg_2\nCONFLICT: mtg_1 overlaps with mtg_3\nCONFLICT: mtg_1 overlaps with mtg_4\nCONFLICT: mtg_2 overlaps with mtg_3\nCONFLICT: mtg_2 overlaps with mtg_4\nCONFLICT: mtg_3 overlaps with mtg_4\n\nUSER PREFERENCES:\n - User prefers no meetings before 10am\n - User prefers informal/casual tone in emails\n - User needs 15-min buffer between meetings\n - User prefers formal/professional tone in emails\n\nPENDING TASKS:\n - Resolve conflict between mtg_1 and mtg_2\n - Resolve conflict between mtg_1 and mtg_3\n - Resolve conflict between mtg_1 and mtg_4\n - Resolve conflict between mtg_2 and mtg_3\n - Resolve conflict between mtg_2 and mtg_4\n - Resolve conflict between mtg_3 and mtg_4\n - Reply to email email_1 from Eve Johnson\n - Reply to email email_2 from Jack Wilson\n - Reply to email email_3 from Carol Park\n\nAvailable tools: check_calendar, check_inbox, reschedule, draft_reply, delegate_task, done\n\nResolve all conflicts, reply to emails respecting user preferences, and call \"done\" when finished.\nEach tool call should be formatted as: {\"tool\": \"tool_name\", \"arguments\": {...}}",
|
| 60 |
+
"seed": 88,
|
| 61 |
+
"difficulty": "medium",
|
| 62 |
+
"n_conflicts": 6,
|
| 63 |
+
"n_emails": 3
|
| 64 |
+
},
|
| 65 |
+
{
|
| 66 |
+
"prompt": "You are an executive assistant. Your job is to manage the user's calendar and inbox efficiently.\n\nTODAY'S CALENDAR:\n[mtg_1] 4:00pm (30min) - sprint planning with Bob Martinez [priority: high]\n[mtg_2] 4:00pm (30min) - all-hands with Eve Johnson [priority: low]\n[mtg_3] 4:00pm (30min) - team standup with Carol Park [priority: high]\n[mtg_4] 4:00pm (60min) - strategy session with Henry Brown [priority: medium]\n[mtg_5] 11:00am (60min) - lunch meeting with Alice Chen [priority: high]\n[mtg_6] 10:00am (30min) - design review with Jack Wilson [priority: low]\n\nINBOX:\n[email_1] From: David Kim | Subject: Client Demo Prep\n Hi, I wanted to follow up on client demo prep. Could you get back to me? Thanks, David Kim\n\n[email_2] From: Irene Davis | Subject: Vendor Contract Renewal [DEADLINE: tomorrow]\n Hi, I wanted to follow up on vendor contract renewal. Could you get back to me by tomorrow? Thanks, Irene Davis\n\n[email_3] From: Frank Lee | Subject: Customer Escalation [DEADLINE: tomorrow]\n Hi, I wanted to follow up on customer escalation. Could you get back to me by tomorrow? Thanks, Frank Lee\n\nSCHEDULING CONFLICTS:\nCONFLICT: mtg_1 overlaps with mtg_2\nCONFLICT: mtg_1 overlaps with mtg_3\nCONFLICT: mtg_1 overlaps with mtg_4\nCONFLICT: mtg_2 overlaps with mtg_3\nCONFLICT: mtg_2 overlaps with mtg_4\nCONFLICT: mtg_3 overlaps with mtg_4\n\nUSER PREFERENCES:\n - Client meetings cannot be rescheduled\n - User avoids meetings on Fridays\n - User prefers 30-min meetings over 60-min\n - User needs 15-min buffer between meetings\n\nPENDING TASKS:\n - Resolve conflict between mtg_1 and mtg_2\n - Resolve conflict between mtg_1 and mtg_3\n - Resolve conflict between mtg_1 and mtg_4\n - Resolve conflict between mtg_2 and mtg_3\n - Resolve conflict between mtg_2 and mtg_4\n - Resolve conflict between mtg_3 and mtg_4\n - Reply to email email_1 from David Kim\n - Reply to email email_2 from Irene Davis\n - Reply to email email_3 from Frank Lee\n\nAvailable tools: check_calendar, check_inbox, reschedule, draft_reply, delegate_task, done\n\nResolve all conflicts, reply to emails respecting user preferences, and call \"done\" when finished.\nEach tool call should be formatted as: {\"tool\": \"tool_name\", \"arguments\": {...}}",
|
| 67 |
+
"seed": 89,
|
| 68 |
+
"difficulty": "medium",
|
| 69 |
+
"n_conflicts": 6,
|
| 70 |
+
"n_emails": 3
|
| 71 |
+
},
|
| 72 |
+
{
|
| 73 |
+
"prompt": "You are an executive assistant. Your job is to manage the user's calendar and inbox efficiently.\n\nTODAY'S CALENDAR:\n[mtg_1] 11:00am (30min) - lunch meeting with David Kim [priority: low]\n[mtg_2] 11:00am (30min) - sprint planning with Bob Martinez [priority: low]\n[mtg_3] 11:00am (60min) - board prep with Henry Brown [priority: medium]\n[mtg_4] 11:00am (30min) - design review with Frank Lee [priority: low]\n[mtg_5] 9:00am (30min) - client call with Eve Johnson [priority: high]\n[mtg_6] 1:30pm (30min) - all-hands with Grace Wang [priority: low]\n\nINBOX:\n[email_1] From: Carol Park | Subject: Performance Review Follow-up [DEADLINE: tomorrow]\n Hi, I wanted to follow up on performance review follow-up. Could you get back to me by tomorrow? Thanks, Carol Park\n\n[email_2] From: Jack Wilson | Subject: Team Offsite Planning [DEADLINE: today]\n Hi, I wanted to follow up on team offsite planning. Could you get back to me by today? Thanks, Jack Wilson\n\n[email_3] From: Irene Davis | Subject: Client Demo Prep [DEADLINE: tomorrow]\n Hi, I wanted to follow up on client demo prep. Could you get back to me by tomorrow? Thanks, Irene Davis\n\nSCHEDULING CONFLICTS:\nCONFLICT: mtg_1 overlaps with mtg_2\nCONFLICT: mtg_1 overlaps with mtg_3\nCONFLICT: mtg_1 overlaps with mtg_4\nCONFLICT: mtg_2 overlaps with mtg_3\nCONFLICT: mtg_2 overlaps with mtg_4\nCONFLICT: mtg_3 overlaps with mtg_4\n\nUSER PREFERENCES:\n - User needs 15-min buffer between meetings\n - User always blocks 12pm-1pm for lunch\n - Client meetings cannot be rescheduled\n - User prefers informal/casual tone in emails\n\nPENDING TASKS:\n - Resolve conflict between mtg_1 and mtg_2\n - Resolve conflict between mtg_1 and mtg_3\n - Resolve conflict between mtg_1 and mtg_4\n - Resolve conflict between mtg_2 and mtg_3\n - Resolve conflict between mtg_2 and mtg_4\n - Resolve conflict between mtg_3 and mtg_4\n - Reply to email email_1 from Carol Park\n - Reply to email email_2 from Jack Wilson\n - Reply to email email_3 from Irene Davis\n\nAvailable tools: check_calendar, check_inbox, reschedule, draft_reply, delegate_task, done\n\nResolve all conflicts, reply to emails respecting user preferences, and call \"done\" when finished.\nEach tool call should be formatted as: {\"tool\": \"tool_name\", \"arguments\": {...}}",
|
| 74 |
+
"seed": 90,
|
| 75 |
+
"difficulty": "medium",
|
| 76 |
+
"n_conflicts": 6,
|
| 77 |
+
"n_emails": 3
|
| 78 |
+
},
|
| 79 |
+
{
|
| 80 |
+
"prompt": "You are an executive assistant. Your job is to manage the user's calendar and inbox efficiently.\n\nTODAY'S CALENDAR:\n[mtg_1] 10:00am (30min) - design review with Bob Martinez [priority: medium]\n[mtg_2] 10:00am (30min) - strategy session with Carol Park [priority: low]\n[mtg_3] 10:00am (60min) - all-hands with Irene Davis [priority: medium]\n[mtg_4] 10:00am (60min) - interview with David Kim [priority: low]\n[mtg_5] 3:00pm (60min) - board prep with Grace Wang [priority: high]\n[mtg_6] 12:00pm (60min) - team standup with Frank Lee [priority: low]\n\nINBOX:\n[email_1] From: Eve Johnson | Subject: Product Launch Timeline [DEADLINE: today]\n Hi, I wanted to follow up on product launch timeline. Could you get back to me by today? Thanks, Eve Johnson\n\n[email_2] From: Jack Wilson | Subject: Board Presentation Draft [DEADLINE: today]\n Hi, I wanted to follow up on board presentation draft. Could you get back to me by today? Thanks, Jack Wilson\n\n[email_3] From: Henry Brown | Subject: Team Offsite Planning\n Hi, I wanted to follow up on team offsite planning. Could you get back to me? Thanks, Henry Brown\n\nSCHEDULING CONFLICTS:\nCONFLICT: mtg_1 overlaps with mtg_2\nCONFLICT: mtg_1 overlaps with mtg_3\nCONFLICT: mtg_1 overlaps with mtg_4\nCONFLICT: mtg_2 overlaps with mtg_3\nCONFLICT: mtg_2 overlaps with mtg_4\nCONFLICT: mtg_3 overlaps with mtg_4\n\nUSER PREFERENCES:\n - User prefers 30-min meetings over 60-min\n - User needs 15-min buffer between meetings\n - User avoids meetings on Fridays\n - Meetings with the boss always take priority\n\nPENDING TASKS:\n - Resolve conflict between mtg_1 and mtg_2\n - Resolve conflict between mtg_1 and mtg_3\n - Resolve conflict between mtg_1 and mtg_4\n - Resolve conflict between mtg_2 and mtg_3\n - Resolve conflict between mtg_2 and mtg_4\n - Resolve conflict between mtg_3 and mtg_4\n - Reply to email email_1 from Eve Johnson\n - Reply to email email_2 from Jack Wilson\n - Reply to email email_3 from Henry Brown\n\nAvailable tools: check_calendar, check_inbox, reschedule, draft_reply, delegate_task, done\n\nResolve all conflicts, reply to emails respecting user preferences, and call \"done\" when finished.\nEach tool call should be formatted as: {\"tool\": \"tool_name\", \"arguments\": {...}}",
|
| 81 |
+
"seed": 91,
|
| 82 |
+
"difficulty": "medium",
|
| 83 |
+
"n_conflicts": 6,
|
| 84 |
+
"n_emails": 3
|
| 85 |
+
},
|
| 86 |
+
{
|
| 87 |
+
"prompt": "You are an executive assistant. Your job is to manage the user's calendar and inbox efficiently.\n\nTODAY'S CALENDAR:\n[mtg_1] 11:30am (30min) - strategy session with Grace Wang [priority: low]\n[mtg_2] 11:30am (60min) - all-hands with Irene Davis [priority: medium]\n[mtg_3] 11:30am (30min) - 1:1 with Eve Johnson [priority: low]\n[mtg_4] 11:30am (60min) - lunch meeting with Jack Wilson [priority: high]\n[mtg_5] 11:30am (30min) - interview with Frank Lee [priority: medium]\n[mtg_6] 12:30pm (30min) - team standup with Alice Chen [priority: high]\n\nINBOX:\n[email_1] From: David Kim | Subject: Partnership Proposal [DEADLINE: today]\n Hi, I wanted to follow up on partnership proposal. Could you get back to me by today? Thanks, David Kim\n\n[email_2] From: Henry Brown | Subject: Board Presentation Draft\n Hi, I wanted to follow up on board presentation draft. Could you get back to me? Thanks, Henry Brown\n\n[email_3] From: Carol Park | Subject: Team Offsite Planning [DEADLINE: today]\n Hi, I wanted to follow up on team offsite planning. Could you get back to me by today? Thanks, Carol Park\n\nSCHEDULING CONFLICTS:\nCONFLICT: mtg_1 overlaps with mtg_2\nCONFLICT: mtg_1 overlaps with mtg_3\nCONFLICT: mtg_1 overlaps with mtg_4\nCONFLICT: mtg_1 overlaps with mtg_5\nCONFLICT: mtg_2 overlaps with mtg_3\nCONFLICT: mtg_2 overlaps with mtg_4\nCONFLICT: mtg_2 overlaps with mtg_5\nCONFLICT: mtg_3 overlaps with mtg_4\nCONFLICT: mtg_3 overlaps with mtg_5\nCONFLICT: mtg_4 overlaps with mtg_5\n\nUSER PREFERENCES:\n - User dislikes back-to-back meetings\n - User prefers 30-min meetings over 60-min\n - User avoids meetings on Fridays\n - Client meetings cannot be rescheduled\n\nPENDING TASKS:\n - Resolve conflict between mtg_1 and mtg_2\n - Resolve conflict between mtg_1 and mtg_3\n - Resolve conflict between mtg_1 and mtg_4\n - Resolve conflict between mtg_1 and mtg_5\n - Resolve conflict between mtg_2 and mtg_3\n - Resolve conflict between mtg_2 and mtg_4\n - Resolve conflict between mtg_2 and mtg_5\n - Resolve conflict between mtg_3 and mtg_4\n - Resolve conflict between mtg_3 and mtg_5\n - Resolve conflict between mtg_4 and mtg_5\n - Reply to email email_1 from David Kim\n - Reply to email email_2 from Henry Brown\n - Reply to email email_3 from Carol Park\n\nAvailable tools: check_calendar, check_inbox, reschedule, draft_reply, delegate_task, done\n\nResolve all conflicts, reply to emails respecting user preferences, and call \"done\" when finished.\nEach tool call should be formatted as: {\"tool\": \"tool_name\", \"arguments\": {...}}",
|
| 88 |
+
"seed": 92,
|
| 89 |
+
"difficulty": "medium",
|
| 90 |
+
"n_conflicts": 10,
|
| 91 |
+
"n_emails": 3
|
| 92 |
+
},
|
| 93 |
+
{
|
| 94 |
+
"prompt": "You are an executive assistant. Your job is to manage the user's calendar and inbox efficiently.\n\nTODAY'S CALENDAR:\n[mtg_1] 12:00pm (60min) - client call with Henry Brown [priority: high]\n[mtg_2] 12:00pm (30min) - 1:1 with Frank Lee [priority: low]\n[mtg_3] 12:00pm (30min) - team standup with Bob Martinez [priority: low]\n[mtg_4] 12:00pm (60min) - all-hands with Alice Chen [priority: medium]\n[mtg_5] 11:30am (60min) - sprint planning with Carol Park [priority: high]\n[mtg_6] 1:30pm (30min) - strategy session with Jack Wilson [priority: high]\n\nINBOX:\n[email_1] From: Eve Johnson | Subject: Q3 Budget Review [DEADLINE: today]\n Hi, I wanted to follow up on q3 budget review. Could you get back to me by today? Thanks, Eve Johnson\n\n[email_2] From: David Kim | Subject: Partnership Proposal [DEADLINE: tomorrow]\n Hi, I wanted to follow up on partnership proposal. Could you get back to me by tomorrow? Thanks, David Kim\n\n[email_3] From: Grace Wang | Subject: Team Offsite Planning [DEADLINE: today]\n Hi, I wanted to follow up on team offsite planning. Could you get back to me by today? Thanks, Grace Wang\n\nSCHEDULING CONFLICTS:\nCONFLICT: mtg_1 overlaps with mtg_2\nCONFLICT: mtg_1 overlaps with mtg_3\nCONFLICT: mtg_1 overlaps with mtg_4\nCONFLICT: mtg_1 overlaps with mtg_5\nCONFLICT: mtg_2 overlaps with mtg_3\nCONFLICT: mtg_2 overlaps with mtg_4\nCONFLICT: mtg_2 overlaps with mtg_5\nCONFLICT: mtg_3 overlaps with mtg_4\nCONFLICT: mtg_3 overlaps with mtg_5\nCONFLICT: mtg_4 overlaps with mtg_5\n\nUSER PREFERENCES:\n - User needs 15-min buffer between meetings\n - User prefers informal/casual tone in emails\n - User always blocks 12pm-1pm for lunch\n - User avoids meetings on Fridays\n\nPENDING TASKS:\n - Resolve conflict between mtg_1 and mtg_2\n - Resolve conflict between mtg_1 and mtg_3\n - Resolve conflict between mtg_1 and mtg_4\n - Resolve conflict between mtg_1 and mtg_5\n - Resolve conflict between mtg_2 and mtg_3\n - Resolve conflict between mtg_2 and mtg_4\n - Resolve conflict between mtg_2 and mtg_5\n - Resolve conflict between mtg_3 and mtg_4\n - Resolve conflict between mtg_3 and mtg_5\n - Resolve conflict between mtg_4 and mtg_5\n - Reply to email email_1 from Eve Johnson\n - Reply to email email_2 from David Kim\n - Reply to email email_3 from Grace Wang\n\nAvailable tools: check_calendar, check_inbox, reschedule, draft_reply, delegate_task, done\n\nResolve all conflicts, reply to emails respecting user preferences, and call \"done\" when finished.\nEach tool call should be formatted as: {\"tool\": \"tool_name\", \"arguments\": {...}}",
|
| 95 |
+
"seed": 93,
|
| 96 |
+
"difficulty": "medium",
|
| 97 |
+
"n_conflicts": 10,
|
| 98 |
+
"n_emails": 3
|
| 99 |
+
},
|
| 100 |
+
{
|
| 101 |
+
"prompt": "You are an executive assistant. Your job is to manage the user's calendar and inbox efficiently.\n\nTODAY'S CALENDAR:\n[mtg_1] 9:00am (30min) - all-hands with Irene Davis [priority: medium]\n[mtg_2] 9:00am (60min) - sprint planning with Carol Park [priority: medium]\n[mtg_3] 9:00am (60min) - interview with Bob Martinez [priority: high]\n[mtg_4] 9:00am (60min) - board prep with Grace Wang [priority: medium]\n[mtg_5] 11:00am (30min) - client call with Jack Wilson [priority: medium]\n[mtg_6] 1:30pm (30min) - lunch meeting with Frank Lee [priority: low]\n\nINBOX:\n[email_1] From: David Kim | Subject: Hiring Update [DEADLINE: tomorrow]\n Hi, I wanted to follow up on hiring update. Could you get back to me by tomorrow? Thanks, David Kim\n\n[email_2] From: Alice Chen | Subject: Board Presentation Draft [DEADLINE: today]\n Hi, I wanted to follow up on board presentation draft. Could you get back to me by today? Thanks, Alice Chen\n\n[email_3] From: Henry Brown | Subject: Product Launch Timeline [DEADLINE: tomorrow]\n Hi, I wanted to follow up on product launch timeline. Could you get back to me by tomorrow? Thanks, Henry Brown\n\nSCHEDULING CONFLICTS:\nCONFLICT: mtg_1 overlaps with mtg_2\nCONFLICT: mtg_1 overlaps with mtg_3\nCONFLICT: mtg_1 overlaps with mtg_4\nCONFLICT: mtg_2 overlaps with mtg_3\nCONFLICT: mtg_2 overlaps with mtg_4\nCONFLICT: mtg_3 overlaps with mtg_4\n\nUSER PREFERENCES:\n - User avoids meetings on Fridays\n - User prefers formal/professional tone in emails\n - User prefers 30-min meetings over 60-min\n - User always blocks 12pm-1pm for lunch\n\nPENDING TASKS:\n - Resolve conflict between mtg_1 and mtg_2\n - Resolve conflict between mtg_1 and mtg_3\n - Resolve conflict between mtg_1 and mtg_4\n - Resolve conflict between mtg_2 and mtg_3\n - Resolve conflict between mtg_2 and mtg_4\n - Resolve conflict between mtg_3 and mtg_4\n - Reply to email email_1 from David Kim\n - Reply to email email_2 from Alice Chen\n - Reply to email email_3 from Henry Brown\n\nAvailable tools: check_calendar, check_inbox, reschedule, draft_reply, delegate_task, done\n\nResolve all conflicts, reply to emails respecting user preferences, and call \"done\" when finished.\nEach tool call should be formatted as: {\"tool\": \"tool_name\", \"arguments\": {...}}",
|
| 102 |
+
"seed": 94,
|
| 103 |
+
"difficulty": "medium",
|
| 104 |
+
"n_conflicts": 6,
|
| 105 |
+
"n_emails": 3
|
| 106 |
+
},
|
| 107 |
+
{
|
| 108 |
+
"prompt": "You are an executive assistant. Your job is to manage the user's calendar and inbox efficiently.\n\nTODAY'S CALENDAR:\n[mtg_1] 11:00am (60min) - design review with Irene Davis [priority: medium]\n[mtg_2] 11:00am (30min) - 1:1 with Jack Wilson [priority: high]\n[mtg_3] 11:00am (30min) - strategy session with Carol Park [priority: low]\n[mtg_4] 11:00am (60min) - all-hands with David Kim [priority: low]\n[mtg_5] 11:00am (30min) - interview with Alice Chen [priority: high]\n[mtg_6] 11:00am (60min) - board prep with Bob Martinez [priority: medium]\n[mtg_7] 5:00pm (30min) - client call with Frank Lee [priority: medium]\n[mtg_8] 2:30pm (60min) - team standup with Henry Brown [priority: medium]\n\nINBOX:\n[email_1] From: Grace Wang | Subject: Performance Review Follow-up [DEADLINE: tomorrow]\n Hi, I wanted to follow up on performance review follow-up. Could you get back to me by tomorrow? Thanks, Grace Wang\n\n[email_2] From: Eve Johnson | Subject: Team Offsite Planning [DEADLINE: today]\n Hi, I wanted to follow up on team offsite planning. Could you get back to me by today? Thanks, Eve Johnson\n\n[email_3] From: Jack Wilson | Subject: Q3 Budget Review\n Hi, I wanted to follow up on q3 budget review. Could you get back to me? Thanks, Jack Wilson\n\n[email_4] From: Grace Wang | Subject: Performance Review Follow-up\n Hi, I wanted to follow up on performance review follow-up. Could you get back to me? Thanks, Grace Wang\n\n[email_5] From: Jack Wilson | Subject: Client Demo Prep\n Hi, I wanted to follow up on client demo prep. Could you get back to me? Thanks, Jack Wilson\n\nSCHEDULING CONFLICTS:\nCONFLICT: mtg_1 overlaps with mtg_2\nCONFLICT: mtg_1 overlaps with mtg_3\nCONFLICT: mtg_1 overlaps with mtg_4\nCONFLICT: mtg_1 overlaps with mtg_5\nCONFLICT: mtg_1 overlaps with mtg_6\nCONFLICT: mtg_2 overlaps with mtg_3\nCONFLICT: mtg_2 overlaps with mtg_4\nCONFLICT: mtg_2 overlaps with mtg_5\nCONFLICT: mtg_2 overlaps with mtg_6\nCONFLICT: mtg_3 overlaps with mtg_4\nCONFLICT: mtg_3 overlaps with mtg_5\nCONFLICT: mtg_3 overlaps with mtg_6\nCONFLICT: mtg_4 overlaps with mtg_5\nCONFLICT: mtg_4 overlaps with mtg_6\nCONFLICT: mtg_5 overlaps with mtg_6\n\nUSER PREFERENCES:\n - Client meetings cannot be rescheduled\n - User prefers informal/casual tone in emails\n - User always blocks 12pm-1pm for lunch\n - User prefers formal/professional tone in emails\n - Meetings with the boss always take priority\n - User dislikes back-to-back meetings\n\nPENDING TASKS:\n - Resolve conflict between mtg_1 and mtg_2\n - Resolve conflict between mtg_1 and mtg_3\n - Resolve conflict between mtg_1 and mtg_4\n - Resolve conflict between mtg_1 and mtg_5\n - Resolve conflict between mtg_1 and mtg_6\n - Resolve conflict between mtg_2 and mtg_3\n - Resolve conflict between mtg_2 and mtg_4\n - Resolve conflict between mtg_2 and mtg_5\n - Resolve conflict between mtg_2 and mtg_6\n - Resolve conflict between mtg_3 and mtg_4\n - Resolve conflict between mtg_3 and mtg_5\n - Resolve conflict between mtg_3 and mtg_6\n - Resolve conflict between mtg_4 and mtg_5\n - Resolve conflict between mtg_4 and mtg_6\n - Resolve conflict between mtg_5 and mtg_6\n - Reply to email email_1 from Grace Wang\n - Reply to email email_2 from Eve Johnson\n - Reply to email email_3 from Jack Wilson\n - Reply to email email_4 from Grace Wang\n - Reply to email email_5 from Jack Wilson\n\nAvailable tools: check_calendar, check_inbox, reschedule, draft_reply, delegate_task, done\n\nResolve all conflicts, reply to emails respecting user preferences, and call \"done\" when finished.\nEach tool call should be formatted as: {\"tool\": \"tool_name\", \"arguments\": {...}}",
|
| 109 |
+
"seed": 95,
|
| 110 |
+
"difficulty": "hard",
|
| 111 |
+
"n_conflicts": 15,
|
| 112 |
+
"n_emails": 5
|
| 113 |
+
},
|
| 114 |
+
{
|
| 115 |
+
"prompt": "You are an executive assistant. Your job is to manage the user's calendar and inbox efficiently.\n\nTODAY'S CALENDAR:\n[mtg_1] 4:30pm (30min) - interview with Frank Lee [priority: low]\n[mtg_2] 4:30pm (60min) - all-hands with Jack Wilson [priority: medium]\n[mtg_3] 4:30pm (30min) - team standup with Grace Wang [priority: low]\n[mtg_4] 4:30pm (60min) - client call with Bob Martinez [priority: high]\n[mtg_5] 4:30pm (60min) - strategy session with Alice Chen [priority: low]\n[mtg_6] 4:30pm (60min) - board prep with Carol Park [priority: high]\n[mtg_7] 1:30pm (30min) - sprint planning with Irene Davis [priority: low]\n[mtg_8] 12:00pm (60min) - 1:1 with Eve Johnson [priority: medium]\n\nINBOX:\n[email_1] From: David Kim | Subject: Board Presentation Draft [DEADLINE: today]\n Hi, I wanted to follow up on board presentation draft. Could you get back to me by today? Thanks, David Kim\n\n[email_2] From: Henry Brown | Subject: Product Launch Timeline\n Hi, I wanted to follow up on product launch timeline. Could you get back to me? Thanks, Henry Brown\n\n[email_3] From: Grace Wang | Subject: Board Presentation Draft\n Hi, I wanted to follow up on board presentation draft. Could you get back to me? Thanks, Grace Wang\n\n[email_4] From: David Kim | Subject: Hiring Update\n Hi, I wanted to follow up on hiring update. Could you get back to me? Thanks, David Kim\n\n[email_5] From: Eve Johnson | Subject: Client Demo Prep [DEADLINE: tomorrow]\n Hi, I wanted to follow up on client demo prep. Could you get back to me by tomorrow? Thanks, Eve Johnson\n\nSCHEDULING CONFLICTS:\nCONFLICT: mtg_1 overlaps with mtg_2\nCONFLICT: mtg_1 overlaps with mtg_3\nCONFLICT: mtg_1 overlaps with mtg_4\nCONFLICT: mtg_1 overlaps with mtg_5\nCONFLICT: mtg_1 overlaps with mtg_6\nCONFLICT: mtg_2 overlaps with mtg_3\nCONFLICT: mtg_2 overlaps with mtg_4\nCONFLICT: mtg_2 overlaps with mtg_5\nCONFLICT: mtg_2 overlaps with mtg_6\nCONFLICT: mtg_3 overlaps with mtg_4\nCONFLICT: mtg_3 overlaps with mtg_5\nCONFLICT: mtg_3 overlaps with mtg_6\nCONFLICT: mtg_4 overlaps with mtg_5\nCONFLICT: mtg_4 overlaps with mtg_6\nCONFLICT: mtg_5 overlaps with mtg_6\n\nUSER PREFERENCES:\n - Meetings with the boss always take priority\n - User prefers no meetings before 10am\n - Client meetings cannot be rescheduled\n - User always blocks 12pm-1pm for lunch\n - User dislikes back-to-back meetings\n - User needs 15-min buffer between meetings\n\nPENDING TASKS:\n - Resolve conflict between mtg_1 and mtg_2\n - Resolve conflict between mtg_1 and mtg_3\n - Resolve conflict between mtg_1 and mtg_4\n - Resolve conflict between mtg_1 and mtg_5\n - Resolve conflict between mtg_1 and mtg_6\n - Resolve conflict between mtg_2 and mtg_3\n - Resolve conflict between mtg_2 and mtg_4\n - Resolve conflict between mtg_2 and mtg_5\n - Resolve conflict between mtg_2 and mtg_6\n - Resolve conflict between mtg_3 and mtg_4\n - Resolve conflict between mtg_3 and mtg_5\n - Resolve conflict between mtg_3 and mtg_6\n - Resolve conflict between mtg_4 and mtg_5\n - Resolve conflict between mtg_4 and mtg_6\n - Resolve conflict between mtg_5 and mtg_6\n - Reply to email email_1 from David Kim\n - Reply to email email_2 from Henry Brown\n - Reply to email email_3 from Grace Wang\n - Reply to email email_4 from David Kim\n - Reply to email email_5 from Eve Johnson\n\nAvailable tools: check_calendar, check_inbox, reschedule, draft_reply, delegate_task, done\n\nResolve all conflicts, reply to emails respecting user preferences, and call \"done\" when finished.\nEach tool call should be formatted as: {\"tool\": \"tool_name\", \"arguments\": {...}}",
|
| 116 |
+
"seed": 96,
|
| 117 |
+
"difficulty": "hard",
|
| 118 |
+
"n_conflicts": 15,
|
| 119 |
+
"n_emails": 5
|
| 120 |
+
},
|
| 121 |
+
{
|
| 122 |
+
"prompt": "You are an executive assistant. Your job is to manage the user's calendar and inbox efficiently.\n\nTODAY'S CALENDAR:\n[mtg_1] 12:30pm (30min) - sprint planning with David Kim [priority: medium]\n[mtg_2] 12:30pm (60min) - all-hands with Grace Wang [priority: high]\n[mtg_3] 12:30pm (30min) - 1:1 with Frank Lee [priority: high]\n[mtg_4] 12:30pm (30min) - lunch meeting with Irene Davis [priority: high]\n[mtg_5] 12:30pm (30min) - board prep with Alice Chen [priority: high]\n[mtg_6] 12:30pm (30min) - design review with Eve Johnson [priority: low]\n[mtg_7] 12:30pm (60min) - strategy session with Henry Brown [priority: high]\n[mtg_8] 11:00am (30min) - client call with Carol Park [priority: high]\n\nINBOX:\n[email_1] From: Jack Wilson | Subject: Customer Escalation\n Hi, I wanted to follow up on customer escalation. Could you get back to me? Thanks, Jack Wilson\n\n[email_2] From: Bob Martinez | Subject: Partnership Proposal\n Hi, I wanted to follow up on partnership proposal. Could you get back to me? Thanks, Bob Martinez\n\n[email_3] From: Alice Chen | Subject: Client Demo Prep\n Hi, I wanted to follow up on client demo prep. Could you get back to me? Thanks, Alice Chen\n\n[email_4] From: Irene Davis | Subject: Hiring Update [DEADLINE: today]\n Hi, I wanted to follow up on hiring update. Could you get back to me by today? Thanks, Irene Davis\n\n[email_5] From: Irene Davis | Subject: Hiring Update [DEADLINE: today]\n Hi, I wanted to follow up on hiring update. Could you get back to me by today? Thanks, Irene Davis\n\nSCHEDULING CONFLICTS:\nCONFLICT: mtg_1 overlaps with mtg_2\nCONFLICT: mtg_1 overlaps with mtg_3\nCONFLICT: mtg_1 overlaps with mtg_4\nCONFLICT: mtg_1 overlaps with mtg_5\nCONFLICT: mtg_1 overlaps with mtg_6\nCONFLICT: mtg_1 overlaps with mtg_7\nCONFLICT: mtg_2 overlaps with mtg_3\nCONFLICT: mtg_2 overlaps with mtg_4\nCONFLICT: mtg_2 overlaps with mtg_5\nCONFLICT: mtg_2 overlaps with mtg_6\nCONFLICT: mtg_2 overlaps with mtg_7\nCONFLICT: mtg_3 overlaps with mtg_4\nCONFLICT: mtg_3 overlaps with mtg_5\nCONFLICT: mtg_3 overlaps with mtg_6\nCONFLICT: mtg_3 overlaps with mtg_7\nCONFLICT: mtg_4 overlaps with mtg_5\nCONFLICT: mtg_4 overlaps with mtg_6\nCONFLICT: mtg_4 overlaps with mtg_7\nCONFLICT: mtg_5 overlaps with mtg_6\nCONFLICT: mtg_5 overlaps with mtg_7\nCONFLICT: mtg_6 overlaps with mtg_7\n\nUSER PREFERENCES:\n - User needs 15-min buffer between meetings\n - User prefers no meetings before 10am\n - User dislikes back-to-back meetings\n - User prefers 30-min meetings over 60-min\n - User avoids meetings on Fridays\n - Meetings with the boss always take priority\n\nPENDING TASKS:\n - Resolve conflict between mtg_1 and mtg_2\n - Resolve conflict between mtg_1 and mtg_3\n - Resolve conflict between mtg_1 and mtg_4\n - Resolve conflict between mtg_1 and mtg_5\n - Resolve conflict between mtg_1 and mtg_6\n - Resolve conflict between mtg_1 and mtg_7\n - Resolve conflict between mtg_2 and mtg_3\n - Resolve conflict between mtg_2 and mtg_4\n - Resolve conflict between mtg_2 and mtg_5\n - Resolve conflict between mtg_2 and mtg_6\n - Resolve conflict between mtg_2 and mtg_7\n - Resolve conflict between mtg_3 and mtg_4\n - Resolve conflict between mtg_3 and mtg_5\n - Resolve conflict between mtg_3 and mtg_6\n - Resolve conflict between mtg_3 and mtg_7\n - Resolve conflict between mtg_4 and mtg_5\n - Resolve conflict between mtg_4 and mtg_6\n - Resolve conflict between mtg_4 and mtg_7\n - Resolve conflict between mtg_5 and mtg_6\n - Resolve conflict between mtg_5 and mtg_7\n - Resolve conflict between mtg_6 and mtg_7\n - Reply to email email_1 from Jack Wilson\n - Reply to email email_2 from Bob Martinez\n - Reply to email email_3 from Alice Chen\n - Reply to email email_4 from Irene Davis\n - Reply to email email_5 from Irene Davis\n\nAvailable tools: check_calendar, check_inbox, reschedule, draft_reply, delegate_task, done\n\nResolve all conflicts, reply to emails respecting user preferences, and call \"done\" when finished.\nEach tool call should be formatted as: {\"tool\": \"tool_name\", \"arguments\": {...}}",
|
| 123 |
+
"seed": 97,
|
| 124 |
+
"difficulty": "hard",
|
| 125 |
+
"n_conflicts": 21,
|
| 126 |
+
"n_emails": 5
|
| 127 |
+
},
|
| 128 |
+
{
|
| 129 |
+
"prompt": "You are an executive assistant. Your job is to manage the user's calendar and inbox efficiently.\n\nTODAY'S CALENDAR:\n[mtg_1] 2:00pm (60min) - design review with Frank Lee [priority: medium]\n[mtg_2] 2:00pm (30min) - interview with Alice Chen [priority: low]\n[mtg_3] 2:00pm (30min) - 1:1 with Jack Wilson [priority: low]\n[mtg_4] 2:00pm (60min) - all-hands with David Kim [priority: high]\n[mtg_5] 2:00pm (60min) - board prep with Irene Davis [priority: low]\n[mtg_6] 2:00pm (30min) - client call with Grace Wang [priority: low]\n[mtg_7] 10:30am (60min) - lunch meeting with Carol Park [priority: low]\n[mtg_8] 11:30am (30min) - strategy session with Eve Johnson [priority: medium]\n\nINBOX:\n[email_1] From: Henry Brown | Subject: Vendor Contract Renewal\n Hi, I wanted to follow up on vendor contract renewal. Could you get back to me? Thanks, Henry Brown\n\n[email_2] From: Bob Martinez | Subject: Product Launch Timeline [DEADLINE: today]\n Hi, I wanted to follow up on product launch timeline. Could you get back to me by today? Thanks, Bob Martinez\n\n[email_3] From: Alice Chen | Subject: Hiring Update [DEADLINE: tomorrow]\n Hi, I wanted to follow up on hiring update. Could you get back to me by tomorrow? Thanks, Alice Chen\n\n[email_4] From: Irene Davis | Subject: Q3 Budget Review [DEADLINE: today]\n Hi, I wanted to follow up on q3 budget review. Could you get back to me by today? Thanks, Irene Davis\n\n[email_5] From: Frank Lee | Subject: Product Launch Timeline [DEADLINE: today]\n Hi, I wanted to follow up on product launch timeline. Could you get back to me by today? Thanks, Frank Lee\n\nSCHEDULING CONFLICTS:\nCONFLICT: mtg_1 overlaps with mtg_2\nCONFLICT: mtg_1 overlaps with mtg_3\nCONFLICT: mtg_1 overlaps with mtg_4\nCONFLICT: mtg_1 overlaps with mtg_5\nCONFLICT: mtg_1 overlaps with mtg_6\nCONFLICT: mtg_2 overlaps with mtg_3\nCONFLICT: mtg_2 overlaps with mtg_4\nCONFLICT: mtg_2 overlaps with mtg_5\nCONFLICT: mtg_2 overlaps with mtg_6\nCONFLICT: mtg_3 overlaps with mtg_4\nCONFLICT: mtg_3 overlaps with mtg_5\nCONFLICT: mtg_3 overlaps with mtg_6\nCONFLICT: mtg_4 overlaps with mtg_5\nCONFLICT: mtg_4 overlaps with mtg_6\nCONFLICT: mtg_5 overlaps with mtg_6\n\nUSER PREFERENCES:\n - User always blocks 12pm-1pm for lunch\n - User prefers no meetings before 10am\n - Client meetings cannot be rescheduled\n - User prefers formal/professional tone in emails\n - User avoids meetings on Fridays\n - Meetings with the boss always take priority\n\nPENDING TASKS:\n - Resolve conflict between mtg_1 and mtg_2\n - Resolve conflict between mtg_1 and mtg_3\n - Resolve conflict between mtg_1 and mtg_4\n - Resolve conflict between mtg_1 and mtg_5\n - Resolve conflict between mtg_1 and mtg_6\n - Resolve conflict between mtg_2 and mtg_3\n - Resolve conflict between mtg_2 and mtg_4\n - Resolve conflict between mtg_2 and mtg_5\n - Resolve conflict between mtg_2 and mtg_6\n - Resolve conflict between mtg_3 and mtg_4\n - Resolve conflict between mtg_3 and mtg_5\n - Resolve conflict between mtg_3 and mtg_6\n - Resolve conflict between mtg_4 and mtg_5\n - Resolve conflict between mtg_4 and mtg_6\n - Resolve conflict between mtg_5 and mtg_6\n - Reply to email email_1 from Henry Brown\n - Reply to email email_2 from Bob Martinez\n - Reply to email email_3 from Alice Chen\n - Reply to email email_4 from Irene Davis\n - Reply to email email_5 from Frank Lee\n\nAvailable tools: check_calendar, check_inbox, reschedule, draft_reply, delegate_task, done\n\nResolve all conflicts, reply to emails respecting user preferences, and call \"done\" when finished.\nEach tool call should be formatted as: {\"tool\": \"tool_name\", \"arguments\": {...}}",
|
| 130 |
+
"seed": 98,
|
| 131 |
+
"difficulty": "hard",
|
| 132 |
+
"n_conflicts": 15,
|
| 133 |
+
"n_emails": 5
|
| 134 |
+
},
|
| 135 |
+
{
|
| 136 |
+
"prompt": "You are an executive assistant. Your job is to manage the user's calendar and inbox efficiently.\n\nTODAY'S CALENDAR:\n[mtg_1] 3:00pm (30min) - interview with Grace Wang [priority: medium]\n[mtg_2] 3:00pm (30min) - board prep with Jack Wilson [priority: high]\n[mtg_3] 3:00pm (60min) - team standup with David Kim [priority: high]\n[mtg_4] 3:00pm (60min) - sprint planning with Eve Johnson [priority: medium]\n[mtg_5] 3:00pm (30min) - design review with Bob Martinez [priority: medium]\n[mtg_6] 3:00pm (60min) - lunch meeting with Frank Lee [priority: high]\n[mtg_7] 5:00pm (30min) - all-hands with Irene Davis [priority: medium]\n[mtg_8] 4:00pm (30min) - client call with Alice Chen [priority: low]\n\nINBOX:\n[email_1] From: Carol Park | Subject: Q3 Budget Review\n Hi, I wanted to follow up on q3 budget review. Could you get back to me? Thanks, Carol Park\n\n[email_2] From: Henry Brown | Subject: Client Demo Prep [DEADLINE: today]\n Hi, I wanted to follow up on client demo prep. Could you get back to me by today? Thanks, Henry Brown\n\n[email_3] From: Irene Davis | Subject: Client Demo Prep [DEADLINE: today]\n Hi, I wanted to follow up on client demo prep. Could you get back to me by today? Thanks, Irene Davis\n\n[email_4] From: Henry Brown | Subject: Board Presentation Draft\n Hi, I wanted to follow up on board presentation draft. Could you get back to me? Thanks, Henry Brown\n\n[email_5] From: Bob Martinez | Subject: Client Demo Prep [DEADLINE: tomorrow]\n Hi, I wanted to follow up on client demo prep. Could you get back to me by tomorrow? Thanks, Bob Martinez\n\nSCHEDULING CONFLICTS:\nCONFLICT: mtg_1 overlaps with mtg_2\nCONFLICT: mtg_1 overlaps with mtg_3\nCONFLICT: mtg_1 overlaps with mtg_4\nCONFLICT: mtg_1 overlaps with mtg_5\nCONFLICT: mtg_1 overlaps with mtg_6\nCONFLICT: mtg_2 overlaps with mtg_3\nCONFLICT: mtg_2 overlaps with mtg_4\nCONFLICT: mtg_2 overlaps with mtg_5\nCONFLICT: mtg_2 overlaps with mtg_6\nCONFLICT: mtg_3 overlaps with mtg_4\nCONFLICT: mtg_3 overlaps with mtg_5\nCONFLICT: mtg_3 overlaps with mtg_6\nCONFLICT: mtg_4 overlaps with mtg_5\nCONFLICT: mtg_4 overlaps with mtg_6\nCONFLICT: mtg_5 overlaps with mtg_6\n\nUSER PREFERENCES:\n - User avoids meetings on Fridays\n - User prefers informal/casual tone in emails\n - Meetings with the boss always take priority\n - User always blocks 12pm-1pm for lunch\n - User prefers no meetings before 10am\n - Client meetings cannot be rescheduled\n\nPENDING TASKS:\n - Resolve conflict between mtg_1 and mtg_2\n - Resolve conflict between mtg_1 and mtg_3\n - Resolve conflict between mtg_1 and mtg_4\n - Resolve conflict between mtg_1 and mtg_5\n - Resolve conflict between mtg_1 and mtg_6\n - Resolve conflict between mtg_2 and mtg_3\n - Resolve conflict between mtg_2 and mtg_4\n - Resolve conflict between mtg_2 and mtg_5\n - Resolve conflict between mtg_2 and mtg_6\n - Resolve conflict between mtg_3 and mtg_4\n - Resolve conflict between mtg_3 and mtg_5\n - Resolve conflict between mtg_3 and mtg_6\n - Resolve conflict between mtg_4 and mtg_5\n - Resolve conflict between mtg_4 and mtg_6\n - Resolve conflict between mtg_5 and mtg_6\n - Reply to email email_1 from Carol Park\n - Reply to email email_2 from Henry Brown\n - Reply to email email_3 from Irene Davis\n - Reply to email email_4 from Henry Brown\n - Reply to email email_5 from Bob Martinez\n\nAvailable tools: check_calendar, check_inbox, reschedule, draft_reply, delegate_task, done\n\nResolve all conflicts, reply to emails respecting user preferences, and call \"done\" when finished.\nEach tool call should be formatted as: {\"tool\": \"tool_name\", \"arguments\": {...}}",
|
| 137 |
+
"seed": 99,
|
| 138 |
+
"difficulty": "hard",
|
| 139 |
+
"n_conflicts": 15,
|
| 140 |
+
"n_emails": 5
|
| 141 |
+
}
|
| 142 |
+
]
|
training/scenarios/train_scenarios.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
training/train_grpo.py
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""GRPO Training script for the Executive Assistant Arena.
|
| 2 |
+
|
| 3 |
+
Run on Northflank H100:
|
| 4 |
+
cd ~/chief-of-staff/exec_assistant_arena
|
| 5 |
+
PYTHONPATH=. uvicorn server.app:app --host 0.0.0.0 --port 8000 &
|
| 6 |
+
python training/train_grpo.py
|
| 7 |
+
"""
|
| 8 |
+
|
| 9 |
+
import json
|
| 10 |
+
import re
|
| 11 |
+
import os
|
| 12 |
+
import sys
|
| 13 |
+
|
| 14 |
+
import wandb
|
| 15 |
+
import torch
|
| 16 |
+
from unsloth import FastLanguageModel
|
| 17 |
+
from trl import GRPOTrainer, GRPOConfig
|
| 18 |
+
from datasets import Dataset
|
| 19 |
+
|
| 20 |
+
# Add parent dir to path so we can import the env
|
| 21 |
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
| 22 |
+
|
| 23 |
+
from exec_assistant_arena import ExecAssistantArenaEnv
|
| 24 |
+
from exec_assistant_arena.models import AssistantAction
|
| 25 |
+
|
| 26 |
+
# --- Config ---
|
| 27 |
+
MODEL_NAME = "Qwen/Qwen2.5-7B"
|
| 28 |
+
MAX_SEQ_LEN = 2048
|
| 29 |
+
LORA_R = 16
|
| 30 |
+
LORA_ALPHA = 16
|
| 31 |
+
NUM_GENERATIONS = 6
|
| 32 |
+
LEARNING_RATE = 5e-6
|
| 33 |
+
BATCH_SIZE = 2
|
| 34 |
+
MAX_COMPLETION_LENGTH = 1024
|
| 35 |
+
NUM_EPOCHS = 3
|
| 36 |
+
SAVE_STEPS = 200
|
| 37 |
+
ENV_URL = "http://localhost:8000"
|
| 38 |
+
HF_PUSH_REPO = "SidraMiconi/exec-assistant-arena-lora"
|
| 39 |
+
|
| 40 |
+
# --- Load scenarios ---
|
| 41 |
+
script_dir = os.path.dirname(os.path.abspath(__file__))
|
| 42 |
+
with open(os.path.join(script_dir, "scenarios/train_scenarios.json")) as f:
|
| 43 |
+
scenarios = json.load(f)
|
| 44 |
+
|
| 45 |
+
dataset = Dataset.from_dict({
|
| 46 |
+
"prompt": [s["prompt"] for s in scenarios],
|
| 47 |
+
})
|
| 48 |
+
|
| 49 |
+
print(f"Loaded {len(dataset)} training scenarios")
|
| 50 |
+
|
| 51 |
+
|
| 52 |
+
def parse_tool_calls(completion_text: str) -> list[AssistantAction]:
|
| 53 |
+
"""Parse model completion into a sequence of tool calls."""
|
| 54 |
+
actions = []
|
| 55 |
+
|
| 56 |
+
# Try to find JSON tool calls in the completion
|
| 57 |
+
# Pattern: {"tool": "...", "arguments": {...}}
|
| 58 |
+
pattern = r'\{[^{}]*"tool"\s*:\s*"([^"]+)"[^{}]*(?:"arguments"\s*:\s*(\{[^{}]*\}))?[^{}]*\}'
|
| 59 |
+
matches = re.finditer(pattern, completion_text)
|
| 60 |
+
|
| 61 |
+
for match in matches:
|
| 62 |
+
tool = match.group(1)
|
| 63 |
+
args_str = match.group(2)
|
| 64 |
+
args = {}
|
| 65 |
+
if args_str:
|
| 66 |
+
try:
|
| 67 |
+
args = json.loads(args_str)
|
| 68 |
+
except json.JSONDecodeError:
|
| 69 |
+
pass
|
| 70 |
+
actions.append(AssistantAction(tool=tool, arguments=args))
|
| 71 |
+
|
| 72 |
+
# If no tool calls found, treat the whole thing as a "done"
|
| 73 |
+
if not actions:
|
| 74 |
+
actions.append(AssistantAction(tool="done"))
|
| 75 |
+
|
| 76 |
+
return actions
|
| 77 |
+
|
| 78 |
+
|
| 79 |
+
def assistant_reward(completions, prompts=None, **kwargs):
|
| 80 |
+
"""Reward function: run each completion through the environment."""
|
| 81 |
+
rewards = []
|
| 82 |
+
|
| 83 |
+
for i, completion in enumerate(completions):
|
| 84 |
+
# Extract text from completion
|
| 85 |
+
if isinstance(completion, list):
|
| 86 |
+
text = "".join(
|
| 87 |
+
c.get("content", "") if isinstance(c, dict) else str(c)
|
| 88 |
+
for c in completion
|
| 89 |
+
)
|
| 90 |
+
else:
|
| 91 |
+
text = str(completion)
|
| 92 |
+
|
| 93 |
+
try:
|
| 94 |
+
with ExecAssistantArenaEnv(base_url=ENV_URL) as env:
|
| 95 |
+
# Determine scenario seed from prompt index
|
| 96 |
+
prompt_idx = i // NUM_GENERATIONS if prompts else 0
|
| 97 |
+
seed = scenarios[prompt_idx % len(scenarios)].get("seed", 0)
|
| 98 |
+
difficulty = scenarios[prompt_idx % len(scenarios)].get("difficulty", "easy")
|
| 99 |
+
|
| 100 |
+
result = env.reset(seed=seed, difficulty=difficulty)
|
| 101 |
+
actions = parse_tool_calls(text)
|
| 102 |
+
|
| 103 |
+
total_reward = 0.0
|
| 104 |
+
for action in actions:
|
| 105 |
+
result = env.step(action)
|
| 106 |
+
total_reward += (result.reward or 0.0)
|
| 107 |
+
if result.done:
|
| 108 |
+
break
|
| 109 |
+
|
| 110 |
+
# If agent didn't call "done", call it for terminal rewards
|
| 111 |
+
if not result.done:
|
| 112 |
+
result = env.step(AssistantAction(tool="done"))
|
| 113 |
+
total_reward += (result.reward or 0.0)
|
| 114 |
+
|
| 115 |
+
rewards.append(total_reward)
|
| 116 |
+
|
| 117 |
+
# Log component breakdown to W&B
|
| 118 |
+
state = env.state()
|
| 119 |
+
wandb.log({
|
| 120 |
+
"reward/total": total_reward,
|
| 121 |
+
"reward/conflicts_resolved": state.conflicts_resolved,
|
| 122 |
+
"reward/total_conflicts": state.total_conflicts,
|
| 123 |
+
"reward/conflict_rate": state.conflicts_resolved / max(1, state.total_conflicts),
|
| 124 |
+
"reward/preferences_inferred": state.preferences_inferred,
|
| 125 |
+
"reward/emails_drafted": state.emails_drafted,
|
| 126 |
+
"reward/deadlines_met": state.deadlines_met,
|
| 127 |
+
"reward/unnecessary_actions": state.unnecessary_actions,
|
| 128 |
+
"reward/late_changes_handled": state.late_changes_handled,
|
| 129 |
+
"reward/cumulative": state.cumulative_reward,
|
| 130 |
+
"meta/difficulty": difficulty,
|
| 131 |
+
"meta/n_actions_parsed": len(actions),
|
| 132 |
+
})
|
| 133 |
+
|
| 134 |
+
except Exception as e:
|
| 135 |
+
print(f"Error scoring completion {i}: {e}")
|
| 136 |
+
rewards.append(-1.0)
|
| 137 |
+
|
| 138 |
+
return rewards
|
| 139 |
+
|
| 140 |
+
|
| 141 |
+
def main():
|
| 142 |
+
wandb.init(project="exec-assistant-arena", name="grpo-qwen2.5-7b")
|
| 143 |
+
|
| 144 |
+
print(f"Loading model: {MODEL_NAME}")
|
| 145 |
+
model, tokenizer = FastLanguageModel.from_pretrained(
|
| 146 |
+
model_name=MODEL_NAME,
|
| 147 |
+
max_seq_length=MAX_SEQ_LEN,
|
| 148 |
+
load_in_4bit=True,
|
| 149 |
+
)
|
| 150 |
+
|
| 151 |
+
model = FastLanguageModel.get_peft_model(
|
| 152 |
+
model,
|
| 153 |
+
r=LORA_R,
|
| 154 |
+
lora_alpha=LORA_ALPHA,
|
| 155 |
+
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
|
| 156 |
+
)
|
| 157 |
+
|
| 158 |
+
print("Model loaded. Starting GRPO training...")
|
| 159 |
+
|
| 160 |
+
config = GRPOConfig(
|
| 161 |
+
output_dir="./checkpoints",
|
| 162 |
+
num_generations=NUM_GENERATIONS,
|
| 163 |
+
learning_rate=LEARNING_RATE,
|
| 164 |
+
per_device_train_batch_size=BATCH_SIZE,
|
| 165 |
+
max_completion_length=MAX_COMPLETION_LENGTH,
|
| 166 |
+
num_train_epochs=NUM_EPOCHS,
|
| 167 |
+
save_steps=SAVE_STEPS,
|
| 168 |
+
report_to="wandb",
|
| 169 |
+
logging_steps=10,
|
| 170 |
+
bf16=True,
|
| 171 |
+
gradient_accumulation_steps=4,
|
| 172 |
+
warmup_ratio=0.05,
|
| 173 |
+
max_grad_norm=1.0,
|
| 174 |
+
)
|
| 175 |
+
|
| 176 |
+
trainer = GRPOTrainer(
|
| 177 |
+
model=model,
|
| 178 |
+
reward_funcs=assistant_reward,
|
| 179 |
+
args=config,
|
| 180 |
+
train_dataset=dataset,
|
| 181 |
+
processing_class=tokenizer,
|
| 182 |
+
)
|
| 183 |
+
|
| 184 |
+
trainer.train()
|
| 185 |
+
|
| 186 |
+
print(f"Training complete. Pushing to {HF_PUSH_REPO}...")
|
| 187 |
+
model.push_to_hub(HF_PUSH_REPO)
|
| 188 |
+
tokenizer.push_to_hub(HF_PUSH_REPO)
|
| 189 |
+
print("Done!")
|
| 190 |
+
|
| 191 |
+
wandb.finish()
|
| 192 |
+
|
| 193 |
+
|
| 194 |
+
if __name__ == "__main__":
|
| 195 |
+
main()
|