Skip to content

Evaluation and modelsGuide

OpenAI Evals shuts down: export your evals and rebuild them in CI

OpenAI is closing its Evals platform: existing evals become read-only on 31 October and the dashboard and API shut down on 30 November 2026. There is no export button. Here is how to pull every eval, run and graded result out through the API, and rebuild them as a regression suite that runs in CI against more than one provider.

By INFRO Editorial

Published

8 min read

A five-by-three grid of glass tiles on a dark ground, each holding small bar charts, with a handful of tiles lit amber and the rest dim

In short

OpenAI's Evals platform becomes read-only for existing evals on 31 October 2026 and its dashboard and API are scheduled to shut down on 30 November 2026. OpenAI points to Promptfoo as the migration path and describes recreating evals by hand, not exporting them. Before 31 October, pull eval definitions, runs, per-item results and the dataset files through the Evals and Files APIs, then rebuild each eval as a versioned config in your repository and run it in CI, against every provider you might switch to.

Key takeaways

  • OpenAI announced the Evals deprecation on 3 June 2026: existing evals become read-only on 31 October and the Evals dashboard and API are scheduled to shut down on 30 November 2026.
  • OpenAI's own migration guide recreates evals manually in Promptfoo and says it does not require an export feature; plan to export the data yourself.
  • The Evals API still lists evals, runs and per-item output items, and the Files API returns your uploaded datasets: pull all of it before evals turn read-only on 31 October.
  • Model-graded graders will not reproduce identical scores in another tool; re-validate every judge against a sample of hand-labelled items.
  • A suite that lives in your repository and runs in CI against several providers is also your model-retirement and provider-switch test.

OpenAI is closing its hosted Evals product. Existing evals become read-only on 31 October 2026, and the Evals dashboard and API are scheduled to shut down on 30 November 20261. OpenAI's recommended path is Promptfoo, and its migration guide recreates each eval by hand rather than exporting it2. If your team uses Evals as a regression gate for prompt or model changes, the work is: pull everything out through the API while it still answers, rebuild the evals as code in your repository, and run them in CI, ideally against more than one provider. This guide covers all three, for the developers doing it and for the leads deciding how much to rebuild.

The dates and what each one means

DateWhat happensWhat you can still do
3 June 2026Deprecation announced for the Evals platformEverything
31 October 2026Existing evals become read-onlyPlan on no new evals, runs or edits; OpenAI does not detail what read-only means for each API call, so export before this date
30 November 2026Evals dashboard and API scheduled to shut downNothing on the platform
OpenAI Evals timeline, from the deprecations page read 2026-10-27.

The deprecation page adds that "graders documented for eval workflows are part of this transition", and that fine-tuning timelines are covered separately1. Two other products announced the same day share the 30 November date: reusable prompt objects and the v1/prompts API, and Agent Builder1. If your evals referenced stored prompts, both halves go together; OpenAI's advice for prompts is to move their content into your application code.

The Evals guide itself now carries the same notice, and still recommends Datasets for teams new to evaluation3. Datasets is not on the deprecations page as read today.

What there is to export

An eval on the platform has four parts worth keeping: the definition (its data schema and testing_criteria, the graders), the dataset (usually a JSONL file uploaded with purpose evals), the runs (which model, which prompt template, the pass and fail counts) and the per-item results. The Evals guide's run object shows the shape: result_counts, per_model_usage, per_testing_criteria_results and a data_source that points at a file_id3.

The API reference documents every read you need45. Run them before 31 October: the deprecation page does not say which calls keep answering once evals are read-only.

DataEndpoint
Every evalGET /v1/evals
One eval's definition and gradersGET /v1/evals/{eval_id}
Its runsGET /v1/evals/{eval_id}/runs
One runGET /v1/evals/{eval_id}/runs/{run_id}
Each graded item, with datasource_item and per-grader resultsGET /v1/evals/{eval_id}/runs/{run_id}/output_items
The dataset fileGET /v1/files/{file_id}/content
Evals and Files API reads, from OpenAI's API reference.

Output items can be filtered by status (pass or fail) and paged with after and limit, and each one carries the source row (datasource_item) and a results array with each grader's name, passed and score4. That is the record you need later to check whether a rebuilt grader agrees with the old one.

An export script

The script below walks every eval, run and output item and saves them as JSON, plus the dataset files the runs point at. It uses the official Python SDK's list methods, which page automatically. It was written against the documented endpoints and not run against a live account, so try it on one eval first.

export_openai_evals.py
import json
import pathlib

from openai import OpenAI

client = OpenAI()  # uses OPENAI_API_KEY for the project that owns the evals
out = pathlib.Path("evals-export")
out.mkdir(exist_ok=True)

def dump(path: pathlib.Path, obj) -> None:
    path.parent.mkdir(parents=True, exist_ok=True)
    data = obj.model_dump() if hasattr(obj, "model_dump") else obj
    path.write_text(json.dumps(data, indent=2, default=str))

file_ids: set[str] = set()

for ev in client.evals.list():
    base = out / ev.id
    dump(base / "eval.json", client.evals.retrieve(ev.id))
    for run in client.evals.runs.list(ev.id):
        dump(base / "runs" / run.id / "run.json", run)
        source = getattr(run.data_source, "source", None)
        if getattr(source, "type", None) == "file_id":
            file_ids.add(source.id)
        items = [item.model_dump() for item in client.evals.runs.output_items.list(run.id, eval_id=ev.id)]
        dump(base / "runs" / run.id / "output_items.json", items)

for file_id in file_ids:
    content = client.files.content(file_id)
    (out / "files").mkdir(exist_ok=True)
    (out / "files" / f"{file_id}.jsonl").write_bytes(content.read())

print(f"exported {len(file_ids)} dataset files to {out}/")

Store the export where your code lives, not in a laptop's downloads folder. The run records include report_url links into the dashboard, which is scheduled to shut down on 30 November, so the JSON is the copy that lasts.

Choosing where the evals go next

OpenAI's guide is candid about the trade: Promptfoo "does not simply reproduce the OpenAI Evals interface in another tool". Evals are defined in a config file and run with the CLI or in CI, graders become assertions and metrics, and "platform features such as dataset review and prompt iteration remain in OpenAI"2.

OptionWhat it isWhere it fitsWhere it loses
PromptfooOpen-source CLI and library; YAML config, assertions, CI output as JSON, HTML or JUnit XML6Prompt and model regression gates; the path OpenAI documentsNo platform-hosted dataset review; thresholds over a whole run need a short script6
InspectOpen-source evaluation framework from the UK AI Security Institute and Meridian Labs; tasks made of a dataset, a solver and a scorer7Agentic and multi-step evals, written in PythonMore code per eval than a YAML assertion
openai/evals repositoryThe open-source framework and benchmark registry behind the original Evals; not archived, last pushed April 20268Teams already invested in its registry formatLittle recent maintenance; you own it
Your own test runnerpytest, Vitest or similar, calling the model and assertingSmall suites with exact-match checksYou rebuild grading, reporting and judge prompts yourself
Where OpenAI Evals workloads can move, from each tool's own documentation.

For most teams with string-check and model-graded evals, the shortest path is the one OpenAI documents. Promptfoo's assertion list covers the common graders: equals, contains, regex, is-json and javascript or python for custom checks; similar, llm-rubric and g-eval for model-graded ones; and cost and latency thresholds9. Inspect is the better fit when an eval is really an agent task with tools.

Rebuild the suite so it runs in CI against several providers

The migration is a chance to fix the main weakness of a dashboard-hosted eval: it tested one provider, in one place, when someone remembered to run it.

  1. Recreate each eval from the export. Turn the dataset JSONL into test cases and each testing_criteria entry into an assertion. A string_check with eq becomes equals; a label or score model grader becomes llm-rubric with the same rubric text. The API reference lists five grader types to map: string check, text similarity, label model, score model and Python4.
  2. Validate every rebuilt grader. OpenAI warns that "similarity-based scoring may not produce identical numerical results across systems" and that recreated LLM-as-a-judge graders should be validated before you rely on them2. Run the new suite on the exported items and compare pass and fail per item with the old results. Where they disagree, read the item before you change the threshold.
  3. Set the judge model explicitly. In Promptfoo, gateway settings under providers do not configure the grader for model-graded assertions; set it separately under defaultTest.options.provider10. Pin the judge to a dated model so a judge upgrade cannot move your scores.
  4. Add providers, not just models. Promptfoo compares models by listing several providers; Anthropic models use anthropic:messages:<model>11, and the OpenAI provider takes an apiBaseUrl for any OpenAI-compatible endpoint10. Run the same tests on your current model and the two you would switch to.
  5. Fail the build on regressions. --fail-on-error fails on any test failure, -o results.junit.xml feeds CI test viewers, and --tag records the commit; a pass-rate threshold is a few lines of jq over the JSON output6.
promptfooconfig.yaml (excerpt)
prompts:
  - file://prompts/ticket-triage.txt
providers:
  - id: openai:chat:gpt-6-luna
  - id: anthropic:messages:claude-sonnet-5.5
defaultTest:
  options:
    provider: openai:chat:gpt-6-sol   # the judge, pinned separately
tests: file://evals-export/converted/ticket-triage.yaml

The arithmetic matters for one decision: whether every commit runs the full suite or only a smoke set, with the full suite nightly and before any model change.

What to ask your team this week

  • Which evals are actually used as a gate before a release, and which were one-off experiments? Migrate the first group first.
  • Who owns the export, and where will it be stored?
  • Which graders are model-graded, and have their new versions been checked against the old results?
  • Which providers will the suite run against, and does a model retirement or provider outage now have a test that runs before the switch?

Running the suite through INFRO

INFRO is a control plane in front of the provider accounts you already hold. It is not an eval harness: it stores no datasets, runs no test cases and keeps no grader definitions, so the export and the rebuilt suite above are yours to keep.

What it adds is the multi-provider half of step 4. INFRO's /v1/chat/completions takes the request shape the OpenAI SDKs send, so a Promptfoo openai:chat provider with apiBaseUrl: https://api.infro.io/v1 and an INFRO gateway key can call openai/gpt-6-luna, anthropic/claude-sonnet-5.5 and google/gemini-3.8-flash on your own connections, each billed by its provider to you. A separate gateway key for CI keeps eval traffic in its own usage line and under its own spend limit, checked before each call. In production, eval monitors score a share of served chat answers in the background against your rubric with a decision model you connect, recorded per request and summarised per served model; that watches live traffic between releases and does not replace a regression suite run before one.

Questions readers ask

When does OpenAI Evals shut down?
OpenAI's deprecations page lists three dates: deprecation announced on 3 June 2026, existing evals becoming read-only on 31 October 2026, and the Evals dashboard and API scheduled to shut down on 30 November 2026. Graders documented for eval workflows are part of the same transition.
Can I export my evals from OpenAI?
OpenAI's migration guide recreates evals by hand and says it does not require an Evals export feature. You can still read your data through the API while it runs: GET /evals lists evals, GET /evals/{eval_id}/runs lists runs, GET /evals/{eval_id}/runs/{run_id}/output_items returns each graded item, and GET /files/{file_id}/content returns the dataset files you uploaded. OpenAI does not say which API calls keep working once evals are read-only on 31 October, so export before that date rather than counting on November.
What does OpenAI recommend instead of Evals?
OpenAI recommends Promptfoo, an open-source CLI and library, and publishes a cookbook on recreating an eval as a promptfooconfig.yaml and running it locally or in CI. Other harnesses exist, such as Inspect from the UK AI Security Institute; choose by how your evals are written and where they must run.
Will my scores be the same after migrating?
Not necessarily. OpenAI's own guide warns that similarity-based scoring may not produce identical numbers across systems and that any recreated grader, especially an LLM-as-a-judge grader, should be validated before you rely on it for regression decisions. Compare old and new scores on the same items before you trust a threshold.
Is the open-source openai/evals repository affected?
The deprecation page covers the Evals platform: the dashboard and the Evals API. The openai/evals repository on GitHub was not archived when checked on 27 October 2026, though its last push was in April 2026 and its README points to the dashboard. Treat it as a framework you would maintain yourself.

From the team that builds it

Where this shows up in INFRO

INFRO is a control plane in front of the provider accounts you already hold. The capabilities below are the parts of it this article touches, each with the documentation that defines its behaviour.

INFRO accounts are self-serve. Provider usage is billed to you by your providers; INFRO charges a software subscription and takes 0% of model spend. See plans.

Sources

Numbered in order of first citation. Each was opened and checked against the claim on the date shown.

  1. 1.Deprecations (opens in a new tab) — OpenAI. Accessed Oct 27, 2026.
  2. 2.Moving from OpenAI Evals to Promptfoo (opens in a new tab) — OpenAI. Accessed Oct 27, 2026.
  3. 3.Working with evals (opens in a new tab) — OpenAI. Accessed Oct 27, 2026.
  4. 4.Evals API reference (opens in a new tab) — OpenAI. Accessed Oct 27, 2026.
  5. 5.Files API reference (opens in a new tab) — OpenAI. Accessed Oct 27, 2026.
  6. 6.CI/CD integration (opens in a new tab) — Promptfoo. Accessed Oct 27, 2026.
  7. 7.Inspect (opens in a new tab) — UK AI Security Institute. Accessed Oct 27, 2026.
  8. 8.openai/evals (opens in a new tab) — OpenAI on GitHub. Accessed Oct 27, 2026.
  9. 9.Assertions and metrics (opens in a new tab) — Promptfoo. Accessed Oct 27, 2026.
  10. 10.OpenAI provider (opens in a new tab) — Promptfoo. Accessed Oct 27, 2026.
  11. 11.Anthropic provider (opens in a new tab) — Promptfoo. Accessed Oct 27, 2026.

About this article

Dates and migration guidance were read on 2026-10-27 from OpenAI's deprecations page, Evals guide, Evals and Files API references and the 'Moving from OpenAI Evals to Promptfoo' cookbook; Promptfoo's CI, assertion and provider documentation; the Inspect documentation from the UK AI Security Institute; and the openai/evals GitHub repository and its API record. Only tools whose documentation was opened are described. The export script is written against the documented endpoints and was not run against a live account. INFRO behaviour is described from its documentation and gateway source.

Last checked against its sources on . The next review is due by . No separate named reviewer is recorded for this article.

How articles are written, sourced and corrected is set out in the editorial standards.