Skip to main content
GAIA (General AI Assistants) is a benchmark of real-world tasks that require multi-step reasoning, web research, file inspection, and arithmetic. Tasks are grouped into three difficulty levels and evaluated by exact-match comparison to a reference answer. QitOS provides GaiaAdapter to convert GAIA dataset rows into Task objects. The canonical execution path is qit bench run, while examples/benchmarks/gaia_eval.py remains available as a thin wrapper over the same official result contract.

Setup

1

Install benchmark dependencies

2

Authenticate with HuggingFace

GAIA is a gated dataset. Request access at huggingface.co/datasets/gaia-benchmark/GAIA, then set your token:
3

Set your model API key

Loading tasks

Use GaiaAdapter to load the dataset and convert rows to Task objects:
Or use the one-line convenience loader:

Loading from a local snapshot

If you have downloaded the dataset locally, load from disk to avoid repeated HuggingFace requests:

Configuration

GaiaAdapter accepts the following parameters:
ParameterDefaultDescription
dataset_name"gaia-benchmark/GAIA"HuggingFace repo ID
annotated_dataset_name"smolagents/GAIA-annotated"Annotated variant repo ID
local_dir"data/gaia"Local snapshot directory
config_name"2023_all"Dataset config passed to load_dataset
default_subsetNoneOptional subset filter
default_max_steps24Step budget per task
include_raw_recordTrueAttach raw row to task.metadata

Running the evaluation

Start with the official CLI:
Then aggregate and inspect:
If you want the benchmark-specific reference wrapper, use examples/benchmarks/gaia_eval.py. The bundled gaia_eval.py script runs an OpenDeepResearch-style ReAct agent that uses web search, URL visiting, file reading, and command execution. Run a single task:
Run the full benchmark:
Resume an interrupted run:
Pass --gaia-use-annotated to load the smolagents/GAIA-annotated variant, which includes pre-normalized answers for faster iteration.

Agent architecture

The evaluation script builds an OpenDeepResearchGaiaAgent with the following toolset:
The agent uses a ReActTextParser expecting Thought: / Action: output format. You can swap in any AgentModule subclass and pass it to Engine.run(task) — the adapter produces standard Task objects.

Task structure

Each Task produced by GaiaAdapter contains:

Expected output

Each run appends one JSON line to the output file:
Interpreting results:
  • stop_reason: "final" — the agent produced a Final Answer.
  • stop_reason: "max_steps" — the agent hit the step budget without answering.
  • stop_reason: "exception" — a runtime error occurred; check error.
Compute accuracy by comparing prediction to reference_answer with exact-match normalization (strip whitespace, lowercase). Then inspect trace runs with qita: