Skip to main content

Multi-provider harness for testing whether AI agents can use product docs and tools.

Project description

Gauntlet

Gauntlet is a harness for answering a practical question:

Can real external agents learn and use your product from docs, specs, and tools alone and, if not, exactly where does adoption break?

This project does not try to simulate an idealized agent in a perfect environment. It tries to simulate the messy reality:

  • different model providers
  • different behavior styles
  • ambiguous docs
  • brittle tool contracts
  • recovery after failure
  • noisy execution traces

The result is a pipeline that can:

  1. run an agent against a product task using only the provided docs and tools
  2. record the execution automatically
  3. judge the run afterward
  4. produce a report showing what happened, where it drifted, and what to fix

What Gauntlet Is Actually Doing

Gauntlet is organized as three layers.

Layer 1: Product Context And Execution Primitives

Layer 1 is the substrate.

It knows how to:

  • load llms.txt and llms-full.txt
  • shape docs into a manifest and retrievable chunks
  • run generic execution tools like:
    • HTTP
    • CLI
    • Python code
    • Python SDK invocation

This is where the product-facing context lives.

Layer 2: Agent Execution

Layer 2 is the agent loop.

It takes:

  • a task
  • a provider/model
  • an optional persona
  • docs sources

Then it:

  • prompts the model
  • lets it call tools
  • captures step-by-step execution
  • returns a final answer or failure
  • writes a structured Layer 2 run record

This is the “can the agent do it?” layer.

Layer 3: Judgment

Layer 3 is the post-run judge.

It consumes Layer 2 run records and produces:

  • a normalized view of the run
  • extracted evidence
  • retrieved docs context
  • batch-level cross-persona context
  • a judged result
  • a single HTML + JSON report

This is the “what happened, why, and how do we improve adoption?” layer.

Why This Exists

Most product teams ask some version of:

  • “Will agents be able to use our product?”
  • “Are our docs good enough for AI agents?”
  • “If an agent fails, is it our product, our docs, or just the model?”

Gauntlet is built to make those failures attributable.

The goal is not merely pass/fail.

The goal is to separate:

  • product problems
  • docs problems
  • runtime/tooling problems
  • harness problems
  • model capability limits

Core Ideas

Personas Matter

A single clean run is not enough.

Gauntlet can run multiple built-in personas that stress different failure modes:

  • methodical: follows docs literally
  • impatient: optimizes for speed
  • chaotic: reorders and perturbs flows
  • confused: exposes clarity gaps
  • long-running: stresses session continuity
  • adversarial: pushes boundaries and validation
  • parallel: stresses concurrency and state isolation
  • recovery: intentionally fails, then tries to recover

These are not cosmetic personas. They change how the agent behaves and what kinds of product adoption failures become visible.

Docs Are First-Class Inputs

Gauntlet is designed around product docs, especially:

  • llms.txt
  • llms-full.txt

The agent is expected to use those as its operating context, and Layer 3 uses them again to judge whether the run:

  • had enough documentation
  • consulted the docs
  • followed the docs
  • or drifted away from the intended path

Every Run Becomes An Artifact

By default, gauntlet chat creates a batch folder automatically:

artifacts/gauntlet_runs/gauntlet_###/

That folder contains:

  • one Layer 2 run record per persona
  • one Layer 3 JSON report
  • one Layer 3 HTML report

So one command maps to one investigation bundle.

Installation

Gauntlet is a Python package.

python -m pip install -e .

Or just install dependencies and run with python -m.

Current package metadata is in pyproject.toml.

Environment

Gauntlet loads environment variables through Layer 1’s environment loading.

Depending on what you run, you may need some of:

  • GEMINI_API_KEY
  • OPENAI_API_KEY
  • OLLAMA_BASE_URL
  • product-specific keys such as STEEL_API_KEY

Examples:

  • Layer 2 provider calls use the provider API keys
  • product workflows may need the product key, such as Steel auth

Quick Start

Run a single task with a single persona:

python -m gauntlet.cli chat \
  --provider gemini \
  --model gemini-2.5-flash \
  --docs https://docs.steel.dev/llms.txt \
  --docs-full https://docs.steel.dev/llms-full.txt \
  "Go to ycombinator.com and take a screenshot"

Run all personas:

python -m gauntlet.cli chat \
  --provider gemini \
  --model gemini-2.5-flash \
  --docs https://docs.steel.dev/llms.txt \
  --docs-full https://docs.steel.dev/llms-full.txt \
  --persona all \
  "Go to espncricinfo and tell me latest IPL game's score"

After completion, Gauntlet prints the batch folder and Layer 3 report paths.

Common Commands

List Personas

python -m gauntlet.cli personas

Show one persona in detail:

python -m gauntlet.cli personas recovery

Run With Debug Logs

python -m gauntlet.cli chat \
  --provider gemini \
  --model gemini-2.5-flash \
  --docs https://docs.steel.dev/llms.txt \
  --docs-full https://docs.steel.dev/llms-full.txt \
  --debug \
  "Go to espncricinfo.com and scrape the page"

Override The Output Directory

By default, Gauntlet creates artifacts/gauntlet_runs/gauntlet_<n>/.

If you want a different batch folder:

python -m gauntlet.cli chat \
  --provider gemini \
  --model gemini-2.5-flash \
  --docs https://docs.steel.dev/llms.txt \
  --docs-full https://docs.steel.dev/llms-full.txt \
  --run-record artifacts/my_custom_batch \
  "Go to espncricinfo and tell me latest IPL game's score"

Run Layer 3 Directly

If you already have Layer 2 run records, you can judge them directly:

python -m gauntlet.layer3.cli \
  'artifacts/gauntlet_runs/gauntlet_003/layer2_run_*.json' \
  --output-dir artifacts/judge_runs \
  --name replay_batch

Use An Optional Layer 3 Judge Model

Layer 3 defaults to a deterministic judge path. You can optionally configure a model-backed judge:

python -m gauntlet.layer3.cli \
  'artifacts/gauntlet_runs/gauntlet_003/layer2_run_*.json' \
  --output-dir artifacts/judge_runs \
  --name llm_judged_batch \
  --judge-provider gemini \
  --judge-model gemini-2.5-pro \
  --judge-fallback-deterministic

The same judge flags are available through gauntlet chat, and they will be used automatically when Layer 3 runs after Layer 2.

Output Structure

Typical batch folder:

artifacts/gauntlet_runs/gauntlet_003/
  layer2_run_default.json
  layer2_run_methodical.json
  layer2_run_impatient.json
  ...
  gauntlet_003.json
  gauntlet_003.html

Layer 2 Run Records

These contain:

  • provider/model/persona metadata
  • docs sources
  • step-by-step tool execution
  • tool results
  • final response
  • terminal failure info if present

Layer 3 Report

The Layer 3 report is the interesting part.

It includes:

  • batch summary
  • issue breakdowns
  • top recommendations
  • per-persona outcomes
  • execution timeline
  • documentation evidence
  • trace evidence
  • successful path
  • reproduction path
  • cross-agent comparison

The HTML report is intended to be human-readable. The JSON report is intended to be machine-readable.

How To Think About The Reports

A “completed” run is not automatically a good run.

Gauntlet tries to surface:

  • clean success
  • recovered success
  • suspect success
  • hard failure

What matters is whether the agent:

  • used the product correctly
  • used the docs correctly
  • produced an answer supported by evidence

The most valuable output is often not “it failed,” but:

it succeeded only after a noisy recovery path that a real external agent might never find

That is adoption signal.

Project Layout

gauntlet/
  cli.py                  # top-level CLI
  providers.py            # provider adapters
  layer1/                 # docs + tool primitives
  layer2/                 # agent execution loop
  layer3/                 # judgment and reporting
artifacts/
  gauntlet_runs/          # automatic end-to-end run bundles

Key files:

Current Status

Gauntlet is still evolving. The pipeline is real and usable, but this is not trying to hide the experimental nature of the work.

What is already real:

  • multi-provider execution
  • multi-persona runs
  • automatic Layer 2 recording
  • automatic Layer 3 reporting
  • deterministic and optional model-backed judgment paths

What still needs continued refinement:

  • docs retrieval quality
  • citation precision
  • judge quality
  • attribution quality
  • richer product-specific mission libraries

The Spirit Of The Project

Most agent evals ask:

“Did the model solve the task?”

Gauntlet asks a more useful question:

“If a serious external agent tried to adopt this product from the docs alone, where would it break, how would it break, and what should we fix first?”

That is what this repo is for.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

run_gauntlet-0.1.0.tar.gz (122.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

run_gauntlet-0.1.0-py3-none-any.whl (129.4 kB view details)

Uploaded Python 3

File details

Details for the file run_gauntlet-0.1.0.tar.gz.

File metadata

  • Download URL: run_gauntlet-0.1.0.tar.gz
  • Upload date:
  • Size: 122.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for run_gauntlet-0.1.0.tar.gz
Algorithm Hash digest
SHA256 f5c8d3efb97c7f1cff0b9066913d32aed952e731e5b8e77637bcc35e8e5ea0a2
MD5 2b223591e6904c0d60ebc76f4135a0e7
BLAKE2b-256 4079ebae6686d4883207631fb0d409e261c4df8bbebc91f53cfc15a5d0eb7980

See more details on using hashes here.

Provenance

The following attestation bundles were made for run_gauntlet-0.1.0.tar.gz:

Publisher: publish.yml on AryanJain107/gauntlet

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file run_gauntlet-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: run_gauntlet-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 129.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for run_gauntlet-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0f573da7f699f4e649314b1b43af8012eebed1ac46c177858401e6f93a06552b
MD5 943d1623a1aac4218b8f307c3d6fe699
BLAKE2b-256 14eb3a38de3e084caf0701a2bc6517e66142ef3aca56f9fece375bdd2adf3f63

See more details on using hashes here.

Provenance

The following attestation bundles were made for run_gauntlet-0.1.0-py3-none-any.whl:

Publisher: publish.yml on AryanJain107/gauntlet

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page