This guide walks you through installing τ-bench, configuring API keys, and running your first evaluation.
- uv — Python package and project manager
- Python 3.12+ (uv will download it automatically if not present)
git clone https://github.com/sierra-research/tau2-bench
cd tau2-benchuv sync # core only (text-mode: airline, retail, telecom, mock)This creates a virtual environment, installs core dependencies from the lockfile, and enables the tau2 command. The Python version is pinned via .python-version (3.12) — uv will download it automatically if needed.
Install the extras you need:
uv sync --extra voice # + voice/audio-native features
uv sync --extra knowledge # + banking_knowledge domain (retrieval pipeline)
uv sync --extra gym # + gymnasium RL interface
uv sync --extra dev # + pytest, ruff, pre-commit (required for contributing)
uv sync --extra experiments # + plotting libs for src/experiments/
uv sync --all-extras # everythingIf using voice features (--extra voice), install:
macOS:
brew install portaudio ffmpegNote: If you install without
-emode (e.g.,uv pip install .), you'll need to set theTAU2_DATA_DIRenvironment variable to point to your data directory:export TAU2_DATA_DIR=/path/to/your/tau2-bench/data
uv run tau2 check-dataThis checks that your data directory is correctly configured and all required files are present.
We use LiteLLM to manage LLM APIs, so you can use any LLM provider supported by LiteLLM.
Copy .env.example as .env and edit it to include your API keys:
cp .env.example .envIf you're using voice features, add the following to your .env file:
ELEVENLABS_API_KEY— for voice synthesisDEEPGRAM_API_KEY— for voice transcription
The voice pipeline uses ElevenLabs voices for the user simulator. The default voice IDs are Sierra-internal and won't work for external users. You need to create your own voices and configure them via environment variables in your .env file:
TAU2_VOICE_ID_MATT_DELANEY=your_voice_id_here
TAU2_VOICE_ID_LISA_BRENNER=your_voice_id_here
# ... (one per persona)See the Voice Persona Setup Guide for step-by-step instructions on creating matching voices using ElevenLabs Voice Design.
tau2 run --domain airline --agent-llm gpt-4.1 --user-llm gpt-4.1 \
--num-trials 1 --num-tasks 5Results are saved in data/simulations/.
Prerequisite: Voice mode requires custom ElevenLabs voices for the user simulator. You must set these up before running voice evaluations. See the Voice Persona Setup Guide — the automated script takes care of everything in one command.
tau2 run --domain retail --audio-native --num-tasks 1 --verbose-logsSee the Audio Native Documentation for provider configuration and all options.
tau2 run --domain banking_knowledge --retrieval-config bm25 \
--agent-llm gpt-4.1 --user-llm gpt-4.1 --num-tasks 5See the Knowledge Retrieval Documentation for retrieval configuration options.
tip: for full agent evaluation that matches the original τ-bench methodology, remove
--num-tasksto evaluate on the complete task set (thebasesplit is used by default).
Results are stored in one of two formats, chosen automatically based on modality:
Text-based simulations produce a single file containing all data:
data/simulations/<run_name>/
└── results.json # Metadata, tasks, and all simulation data
Voice simulations contain large tick-level data, so they use a directory-based format that splits simulation data into individual files for efficient checkpointing and streaming:
data/simulations/<run_name>/
├── results.json # Metadata and task definitions only
├── simulations/ # Individual simulation data files
│ ├── sim_0.json
│ ├── sim_1.json
│ └── ...
└── artifacts/ # Runtime artifacts (with --verbose-logs)
└── task_<task_id>/
└── sim_<uuid>/
├── sim_status.json # Simulation status
├── task.log # Per-task log
├── audio/
│ ├── both.wav # Full conversation audio (stereo)
│ ├── assistant_labels.txt # Audacity labels for agent speech
│ ├── user_labels.txt # Audacity labels for user speech
│ ├── assistant_tool_calls_labels.txt # Audacity labels for agent tool calls (when present)
│ └── user_tool_calls_labels.txt # Audacity labels for user tool calls (when present)
└── llm_debug/
└── *.json # LLM call logs
You can convert between formats using tau2 convert-results:
# Convert a monolithic JSON to directory format
tau2 convert-results data/simulations/my_run --to dir
# Convert a directory format back to monolithic JSON
tau2 convert-results data/simulations/my_run --to jsonBoth formats are fully supported by Results.load(), which auto-detects the format on disk.
tau2 viewThis allows you to browse simulation files, view agent performance metrics, inspect individual simulations, and view task details. Works for both standard text and audio native runs.
The framework is configured via src/tau2/config.py.
LLM call caching is disabled by default. To enable it:
- Install the
redisPython package:uv pip install redis - Make sure a Redis server is running
- Update the redis config in
config.pyif necessary - Set
LLM_CACHE_ENABLEDtoTrueinconfig.py
To remove all generated files and the virtual environment:
make clean- CLI Reference — all
tau2commands and options - Agent Developer Guide — build and evaluate your own agent
- Domain Documentation — understand the available domains
- Communication Modes — half-duplex and full-duplex orchestration
- Task Schema & Evaluation — how a task is scored, what
actions/communicate_info/reward_basisactually do - Knowledge Retrieval — retrieval pipeline setup and configuration for banking_knowledge domain
- Voice (Full-Duplex) — providers, speech complexity, and CLI options for voice evaluation
- Voice Persona Setup — create custom ElevenLabs voices for the user simulator
- Gym/RL Interface — Gymnasium-compatible environment for RL training