Skip to content

Commit c4be02f

Browse files
committed
runner: add [target].language for per-language HF dataset configs
Evaluating facebook/omnilingual-gaia2 previously meant downloading the parquet shards by hand, converting them with mt/scripts/data/parquet_to_json.py, and pointing [target].dataset_root at the result. The runner already had a HuggingFace auto-download path; the only thing missing was a language dimension. The dataset's parquet columns (scenario_id, scenario) and HF split (test) already match what download_hf_dataset() reads. The single mismatch was that the HF config name was derived from the split alone, while this dataset publishes 40 configs named {language}_{split}. [target] dataset = "facebook/omnilingual-gaia2" language = "spa_Latn" - config.py: MULTILINGUAL_SPLITS, TargetConfig.language, language-aware _normalize_splits so "all" means the four translated capabilities, and rejection of language with scenario/dataset_root or a malformed code. - hf_dataset.py: language parameter; the HF config name is prefixed while the split directory keeps its bare name, which is what _infer_result_split relies on; cache key suffixed per language. - cli.py: threaded through run-config, a new run-dataset --language, the --dry-run summary, and saved run metadata. Omitting language leaves every path byte-for-byte unchanged, including the cache directory name, so existing populated caches stay valid. Regression tests pin that. Also fixes a pre-existing bug: the split directory was created before the download, so a failed or interrupted fetch left a partial directory that the next run's cache check accepted, silently reusing an incomplete split. The handler now removes it, and catches BaseException so Ctrl-C cleans up too. Verified end to end with a pass@3 run on the published dataset: OpenClaw with a local vLLM Qwen3.6-27B agent and a gpt-oss-120b judge, multilingual judge prompts, correct per-split reporting, and language recorded in run_config.json.
1 parent 1dbfe91 commit c4be02f

11 files changed

Lines changed: 931 additions & 92 deletions

File tree

README.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ Meta Agents Research Environments (ARE) is a platform designed to evaluate AI ag
1313
Looking for the container-based Gaia2-CLI benchmark stack? Start with
1414
[gaia2-cli](gaia2-cli).
1515

16+
17+
> **New:** [facebook/omnilingual-gaia2](https://huggingface.co/datasets/facebook/omnilingual-gaia2), a
18+
> multilingual extension of Gaia2! See [Omnilingual-Gaia2](#omnilingual-gaia2) below.
19+
1620
## Table of Contents
1721

1822
- [Background](#background)
@@ -39,6 +43,7 @@ ARE addresses critical gaps in AI agent evaluation by providing:
3943
| **[Quick Start](https://facebookresearch.github.io/meta-agents-research-environments/quickstart.html)** | Get up and running with your first scenario in just a few minutes with step-by-step instructions. |
4044
| **[Gaia2 Evaluation](https://facebookresearch.github.io/meta-agents-research-environments/user_guide/gaia2_evaluation.html)** | Build and evaluate your agents on the Gaia2 benchmark, a comprehensive suite of 800 dynamic scenarios across 10 universes. |
4145
| **[Gaia2 Blog Post](https://huggingface.co/blog/gaia2)** | Learn more about Gaia2 on the Hugging Face blog. |
46+
| **[Omnilingual-Gaia2](https://huggingface.co/datasets/facebook/omnilingual-gaia2)** | Multilingual translation of Gaia2, for evaluating agents beyond English. Translation pipeline in [gaia2-cli/mt](gaia2-cli/mt/README.md). |
4247
| **[Paper](https://ai.meta.com/research/publications/are-scaling-up-agent-environments-and-evaluations/)** | Read the research paper detailing the Gaia2 benchmark and evaluation methodology. |
4348
| **[Demo](https://huggingface.co/spaces/meta-agents-research-environments/demo)** | [Try the ARE Demo on Hugging Face](https://huggingface.co/spaces/meta-agents-research-environments/demo) — Play around with the agent platform directly in your browser, no installation required! |
4449
| **[Gaia2 Leaderboard](https://huggingface.co/spaces/meta-agents-research-environments/leaderboard)** | Check the self-published results from Gaia2 Benchmark runs. |
@@ -158,6 +163,41 @@ are-benchmark gaia2-run --hf meta-agents-research-environments/gaia2 \
158163
--hf_upload my-org/gaia2-results
159164
```
160165

166+
### Omnilingual-Gaia2
167+
168+
[facebook/omnilingual-gaia2](https://huggingface.co/datasets/facebook/omnilingual-gaia2) is a
169+
multilingual extension of Gaia2 — 10 languages across the `execution`, `search`,
170+
`ambiguity` and `adaptability` splits. The gaia2-cli runner downloads and caches it for
171+
you: set `[target].language` to pick the language, and
172+
`[judge].prompt_version = "omnilingual-gaia2"` to enable the multilingual judge prompts,
173+
without which a correct non-English answer is often scored as a miss.
174+
175+
```bash
176+
# Copy the annotated template, then edit the language, models and endpoints
177+
cp gaia2-cli/runner/examples/openclaw_qwen_omnilingual_gaia2_pass3.toml ./my_omnilingual_run.toml
178+
179+
# Validate the config and resolve the scenario selection without launching
180+
export OPENAI_COMPAT_API_KEY="your-api-key"
181+
gaia2-runner run-config --config ./my_omnilingual_run.toml --dry-run
182+
183+
# Run the evaluation
184+
gaia2-runner run-config --config ./my_omnilingual_run.toml
185+
```
186+
187+
The relevant part of the template:
188+
189+
```toml
190+
[target]
191+
dataset = "facebook/omnilingual-gaia2"
192+
language = "spa_Latn" # or cmn_Hans, deu_Latn, fra_Latn, ...
193+
194+
[judge]
195+
prompt_version = "omnilingual-gaia2"
196+
```
197+
198+
To translate Gaia2 into another language yourself, see
199+
[gaia2-cli/mt](gaia2-cli/mt/README.md).
200+
161201
## API
162202

163203
### Core Concepts

gaia2-cli/mt/README.md

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,34 @@ names must match the server's `--served-model-name`.
7373

7474
## Evaluate
7575

76-
Point the runner at the translated `dataset_root` and select the Omnilingual-GAIA2 judge
77-
prompts via `[judge].prompt_version`:
76+
Either way, select the Omnilingual-GAIA2 judge prompts via
77+
`[judge].prompt_version = "omnilingual-gaia2"`, then:
7878

7979
```bash
8080
gaia2-runner run-config \
81-
--config gaia2-cli/runner/examples/omnilingual_gaia2.toml
81+
--config gaia2-cli/runner/examples/openclaw_qwen_omnilingual_gaia2_pass3.toml
8282
```
8383

84-
See [`runner/examples/omnilingual_gaia2.toml`](../runner/examples/omnilingual_gaia2.toml).
84+
For the **published** dataset there is nothing to download by hand — set
85+
`[target].language` and the runner fetches and caches the per-language HuggingFace
86+
config itself:
87+
88+
```toml
89+
[target]
90+
dataset = "facebook/omnilingual-gaia2"
91+
language = "spa_Latn"
92+
```
93+
94+
For a corpus **you** just translated with the pipeline above, point at its output
95+
directory instead:
96+
97+
```toml
98+
[target]
99+
dataset_root = "/path/to/omnilingual-gaia2/spa_Latn/data"
100+
splits = ["execution", "search", "ambiguity", "adaptability"]
101+
```
102+
103+
See [`runner/examples/openclaw_qwen_omnilingual_gaia2_pass3.toml`](../runner/examples/openclaw_qwen_omnilingual_gaia2_pass3.toml).
85104

86105
## Data converters
87106

gaia2-cli/runner/README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,12 @@ Target selection supports:
195195
- `scenario = "/path/to/scenario.json"` for one scenario
196196
- `dataset = "org/name"` to load from HuggingFace (auto-downloads and caches)
197197
- `dataset_root = "..."` to load from a local directory of scenario JSONs
198-
- Combine with `splits = "search"`, `splits = ["search", "time"]`, or `splits = "all"`
198+
- `language = "spa_Latn"` for datasets published with one config per language
199+
(e.g. `facebook/omnilingual-gaia2`); the runner loads the `{language}_{split}`
200+
config and caches each language separately. Only valid with `dataset`.
201+
- Combine with `splits = "search"`, `splits = ["search", "time"]`, or `splits = "all"`.
202+
With `language`, `"all"` means the four translated capabilities — `execution`,
203+
`search`, `ambiguity`, `adaptability` — as there is no translated `time` split.
199204
- `subset = "/path/to/subset.json"` to limit runs to a manifest
200205

201206
For dataset targets, the runner preserves split subdirectories in the output
@@ -224,6 +229,7 @@ Curated examples:
224229
- `runner/examples/openclaw_sonnet_gaia2_pass1.toml` — OpenClaw + direct Anthropic Sonnet 4.6, public HuggingFace dataset, pass@1
225230
- `runner/examples/openclaw_google_gaia2_pass1.toml` — OpenClaw + direct Google AI Studio Gemini 3.1 Pro Preview, public HuggingFace dataset, pass@1
226231
- `runner/examples/openclaw_gpt54_gaia2_pass1.toml` — OpenClaw + direct OpenAI GPT-5.4, public HuggingFace dataset, pass@1
232+
- `runner/examples/openclaw_qwen_omnilingual_gaia2_pass3.toml` — Omnilingual-GAIA2: the published multilingual dataset via `language`, OpenClaw + locally served Qwen3.6-27B, `gpt-oss-120b` judge on a second endpoint, multilingual judge prompts, pass@3
227233
- `runner/examples/template_hermes_openai_compat.toml` — generic Hermes template for custom OpenAI chat-completions-compatible endpoints
228234
- `runner/examples/template_openclaw_openai_compat.toml` — generic OpenClaw template for custom OpenAI chat-completions-compatible endpoints
229235

gaia2-cli/runner/examples/omnilingual_gaia2.toml

Lines changed: 0 additions & 51 deletions
This file was deleted.
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# Template: Omnilingual-GAIA2 configuration.
2+
#
3+
# Two things distinguish this from the other templates:
4+
# - `[target].language` selects the per-language HuggingFace config, so the
5+
# runner downloads and caches the translated scenarios itself;
6+
# - `[judge].prompt_version` selects the multilingual judge prompt overrides,
7+
# without which a correct non-English answer is routinely scored as a miss.
8+
#
9+
# This template uses locally served models via vllm, serve the model before running, e.g.:
10+
# vllm serve Qwen/Qwen3.6-27B --port 8000
11+
#
12+
# Then edit the model name(s) and base URL(s) to match your deployment.
13+
# This has been tested end-to-end with vllm 0.25.1
14+
15+
[target]
16+
dataset = "facebook/omnilingual-gaia2"
17+
# One of: cmn_Hans, deu_Latn, fra_Latn, hin_Deva, ind_Latn, ita_Latn, jpn_Jpan, por_Latn, spa_Latn, tur_Latn.
18+
# Downloads to ~/.cache/gaia2/hf_datasets/, keyed per language (override the location with $GAIA2_HF_CACHE).
19+
# Omitting `splits` (or setting "all") runs the four translated capabilities: execution, search, ambiguity, adaptability.
20+
language = "spa_Latn"
21+
splits = ["execution"]
22+
23+
# Smoke test; remove for the full benchmark.
24+
limit = 1
25+
26+
27+
[agent]
28+
image = "localhost/gaia2-oc:latest"
29+
provider = "openai-compat"
30+
model = "Qwen/Qwen3.6-27B"
31+
# Containers run with --network=host, so localhost here is the same host the model server is bound to.
32+
base_url = "http://localhost:8000/v1"
33+
# vLLM ignores the value but requires the header. Use `api_key_env` instead for endpoints that authenticate.
34+
api_key = "EMPTY"
35+
# Thinking enabled, as the paper does for open-weight agents.
36+
thinking = "high"
37+
38+
[judge]
39+
provider = "openai-compat"
40+
# A second server, so judge throughput is independent of agent rollouts:
41+
# vllm serve openai/gpt-oss-120b --port 8001 --served-model-name gpt-oss-120b
42+
#
43+
# `--served-model-name` matters here.
44+
# The judge goes through litellm, which treats a leading `openai/`
45+
# as a provider-routing prefix and strips it before sending.
46+
# A served name of `openai/gpt-oss-120b` therefore goes out as
47+
# `gpt-oss-120b` and the server answers 404.
48+
# The awkward alternative is `model = "openai/openai/gpt-oss-120b"`
49+
model = "openai/openai/gpt-oss-120b"
50+
base_url = "http://localhost:8001/v1"
51+
api_key = "EMPTY"
52+
# Multilingual checker prompts. Omit for the stock gaia2-core prompts.
53+
prompt_version = "omnilingual-gaia2"
54+
# gpt-oss-120b with `low` reasoning is the calibrated reference judge config.
55+
# `extra_body` is forwarded verbatim to litellm, so this lands as a top-level vllm request field.
56+
extra_body = { reasoning_effort = "low" }
57+
58+
[run]
59+
timeout = 1200
60+
health_timeout = 180
61+
# Agent and judge have their own servers here, so this is bounded by the agent
62+
# server's throughput. Raise it while watching that server's queue depth.
63+
concurrency = 4
64+
# Long non-Latin rollouts idle between tool calls; the 300s default cuts them
65+
# off and records them as infra errors.
66+
idle_timeout = 600.0
67+
# pass@3 is the headline metric; drop to 1 while iterating to cut cost 3x.
68+
pass_at = 3
69+
# Relative paths resolve against this config file
70+
output_dir = "$HOME/omnilingual_gaia2/results/Qwen3.6-27B__openclaw/spa_Latn"
71+
log_level = "INFO"

0 commit comments

Comments
 (0)