GAIA: A Benchmark for General AI Assistants

Proposes real-world questions that require a set of fundamental abilities such as reasoning, multi-modality handling, web browsing, and generally tool-use proficiency. GAIA questions are conceptually simple for humans yet challenging for most advanced AIs.

Overview

This is an Inspect AI implementation of the GAIA (General AI Assistants) benchmark, consisting of 450 questions testing tool use on realistic assistant tasks (mostly web browsing).

Usage

Installation

This eval requires extra dependencies.

pip install inspect-evals[gaia]

From a checkout of this repository:

uv sync --extra gaia

Running evaluations

uv run inspect eval inspect_evals/gaia --model openai/gpt-5-nano
uv run inspect eval inspect_evals/gaia_level1 --model openai/gpt-5-nano
uv run inspect eval inspect_evals/gaia_level2 --model openai/gpt-5-nano
uv run inspect eval inspect_evals/gaia_level3 --model openai/gpt-5-nano

To run multiple tasks simultaneously use inspect eval-set:

uv run inspect eval-set inspect_evals/gaia inspect_evals/gaia_level1 inspect_evals/gaia_level2 inspect_evals/gaia_level3

You can also import tasks as normal Python objects and run them from python:

from inspect_ai import eval, eval_set
from inspect_evals.gaia import gaia, gaia_level1, gaia_level2, gaia_level3
eval(gaia)
eval_set([gaia, gaia_level1, gaia_level2, gaia_level3], log_dir='logs-run-42')

Drop uv run if you manage dependencies yourself. Log viewing (inspect view) and default-model setup are documented in the Inspect Evals README.

Options

You can control a variety of options from the command line. For example:

uv run inspect eval inspect_evals/gaia --limit 10 --sample-shuffle
uv run inspect eval inspect_evals/gaia_level1 --max-connections 10
uv run inspect eval inspect_evals/gaia_level2 --temperature 0.5

See uv run inspect eval --help for all available options.

Parameters

gaia

  • solver (Solver | Agent | None): Provide a custom solver (if not specified uses Inspect’s react agent with bash, python, and web browsing tools). (default: None)
  • input_prompt (str | None): Per sample question prompt. Should include a {file} variable (for identifying any files relevant to the task) and a {question} variable for rendering the question. (default: None)
  • max_attempts (int): Maximum number of submission attempts. Only applies when using the default solver. (default: 1)
  • subset (Literal['2023_all', '2023_level1', '2023_level2', '2023_level3']): Which GAIA subset to evaluate. (default: '2023_all')
  • split (Literal['test', 'validation']): Which split to evaluate (“validation” or “test”) (default: 'validation')
  • instance_ids (str | list[str] | None): Specific question instances to evaluated. (default: None)
  • sandbox (str | tuple[str, str] | SandboxEnvironmentSpec): Sandbox environment to use for the task. (default: ('docker', 'src/inspect_evals/gaia/compose.yaml'))

gaia_level1

  • kwargs (Any):

gaia_level2

  • kwargs (Any):

gaia_level3

  • kwargs (Any):

[!NOTE] The GAIA task uses tool calling to enable the model to execute web_browser and bash commands. Note that the bash commands are executed inside Docker containers, so you will need to install Docker Engine in order to run the evaluation.

Upon running the GAIA task, it will attempt to download the dataset from the HuggingFace hub. For this to work, you will need to gain access to the dataset (by filling out a form on the GAIA huggingface repository), and also create and set an access token. You will need to define the HF_TOKEN environment variable to access the dataset:

HF_TOKEN=<hf-token>

Dataset

The GAIA dataset contains 450 questions testing tool use on realistic assistant tasks (mostly web browsing). For example:

A paper about AI regulation that was originally submitted to arXiv.org in June 2022 shows a figure with three axes, where each axis has a label word at both ends. Which of these words is used to describe a type of society in a Physics and Society article submitted to arXiv.org on August 11, 2016?

Scoring

A simple mean is calculated over the datapoints.

Development

If you want to develop a solver for the GAIA task, import the @task from the gaia module and pass your own solver to it. For example:

from inspect_ai import eval
from inspect_ai.agent import react
from inspect_ai.tool import bash

from inspect_evals.gaia import gaia

agent = react(tools=[bash()])
task = gaia(solver=agent)

eval(task, model="openai/gpt-4o")

See the documentation on the Inspect Agents API for additional information on developing agents.

Test Split

You can evaluate against the “test” split with:

agent = react(tools=[bash()])
task = gaia(solver=agent, split="test")

eval(task, model="openai/gpt-4o")

Note that the GAIA “test” split does not come with any solutions so is not scored (rather, solutions are uploaded to the online leaderboard).

Changelog

[3-B] - 2026-08-03

  • Pin sandbox image references to immutable tags/digests, identical to what latest resolved to at pin time, so registry pushes cannot silently change the evaluation environment (#2062).

[3-A] - 2026-04-21

  • Replaced deprecated basic_agent() with react() as the default agent. This fixes a pathological case where basic_agent() would loop on repeated content_filter stops until hitting message_limit. It also changes the stall-nudge message (sent when the model stops without calling a tool) to append a reminder to call the submit tool — a one-sentence prompt addition that may bias models toward earlier submission.

[2-A] - 2026-02-16

  • Migrate version to new scheme. See #907.

[1.1.0] - 2026-01-21

  • Breaking change: Removed max_messages task parameter. The task now uses Task(message_limit=100) instead, which can be overridden via CLI --message-limit flag. Previously, the hardcoded max_messages in basic_agent would ignore the CLI flag (#905).

[1.0.1] - 2025-12-18

  • Adds backoff policy for functions that connect to huggingface servers.