<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Orbora</title>
    <description>The latest articles on DEV Community by Orbora (@solocohere).</description>
    <link>https://dev.to/solocohere</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4235868%2F58af00c1-ca46-4eea-ae49-d78a387c3c4c.jpg</url>
      <title>DEV Community: Orbora</title>
      <link>https://dev.to/solocohere</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/solocohere"/>
    <language>en</language>
    <item>
      <title>What actually survives the OpenAI Evals shutdown, and what you have to rebuild by hand</title>
      <dc:creator>Orbora</dc:creator>
      <pubDate>Mon, 09 Nov 2026 21:21:18 +0000</pubDate>
      <link>https://dev.to/solocohere/what-actually-survives-the-openai-evals-shutdown-and-what-you-have-to-rebuild-by-hand-339f</link>
      <guid>https://dev.to/solocohere/what-actually-survives-the-openai-evals-shutdown-and-what-you-have-to-rebuild-by-hand-339f</guid>
      <description>&lt;p&gt;I spent this week moving evals off OpenAI Evals before the Nov 30 shutdown,&lt;br&gt;
and the part that surprised me was not how much work it is. It was how much&lt;br&gt;
of the work looks done when it is not.&lt;/p&gt;

&lt;p&gt;Evals went read-only on Oct 31. The dashboard and the API go away on Nov 30.&lt;br&gt;
Agent Builder and reusable prompt objects go the same day. If your baselines&lt;br&gt;
still live in the dashboard, this is the checklist I wish I had on day one.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pull the definitions through the API first, before anything else.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The export button in the dashboard gives you a JSONL of completed run&lt;br&gt;
results. That is history, not a test suite. It does not hand you back a&lt;br&gt;
runnable config, and OpenAI support has said so plainly. Not every eval type&lt;br&gt;
can export a config at all.&lt;/p&gt;

&lt;p&gt;The grader definitions live behind the API, and the API dies Nov 30. Pull&lt;br&gt;
the definitions, the datasets, and the run history now, while they still&lt;br&gt;
exist, and keep the raw JSON. Even if you rebuild everything yourself later,&lt;br&gt;
this pull is the part you cannot redo in December.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Import the JSONL for what it is: history.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Promptfoo will import the dashboard JSONL, and that is worth doing. What you&lt;br&gt;
get is a historical record of past runs, with the old items and their pass&lt;br&gt;
and fail states preserved. What you do not get is a runnable eval. No&lt;br&gt;
providers, no prompts, no assertions come across. Your new Promptfoo run is&lt;br&gt;
a separate run, and it should be. Treat the import as your audit trail, not&lt;br&gt;
your migration.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rebuild each grader by hand, and sort them before you start.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is where the real time goes, and it helps to sort graders into three&lt;br&gt;
piles before touching any of them.&lt;/p&gt;

&lt;p&gt;Straight recreates: string checks, contains and regex checks, JSON schema&lt;br&gt;
checks. These map one to one onto Promptfoo assertions, and most of an&lt;br&gt;
inventory is usually this pile.&lt;/p&gt;

&lt;p&gt;Adapted graders: model-graded rubrics that have to be re-expressed, composite&lt;br&gt;
graders that split into several assertions, thresholds that need re-tuning.&lt;br&gt;
Expect these to take the longest per grader, and expect the numbers to move&lt;br&gt;
a little. Different judge prompts and different aggregation give different&lt;br&gt;
scores, even on the same outputs.&lt;/p&gt;

&lt;p&gt;Rebuilds from scratch: multi-turn agent tests, custom code graders with side&lt;br&gt;
effects, anything that depended on OpenAI internal state. For these, the&lt;br&gt;
honest move is to re-author the intent in the new harness and establish a&lt;br&gt;
fresh baseline, not to pretend the old numbers transferred.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run the parity check, and write down every difference.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Rebuild the eval, then run it against the same model and the same data as&lt;br&gt;
your last good run on the old platform. Compare case by case, not just in&lt;br&gt;
aggregate. For each difference, write down which of these it is: a harness&lt;br&gt;
difference, a grader translation difference, or a genuine output difference.&lt;/p&gt;

&lt;p&gt;I did this on a small demo eval, ten cases, twenty one assertions, rebuilt&lt;br&gt;
in Promptfoo. Eight cases passed and two failed, and the two failures were&lt;br&gt;
deliberate bad replies I had seeded in: one promised a guaranteed instant&lt;br&gt;
refund, the other affirmed a feature that does not exist. A grader set that&lt;br&gt;
passed those would have been a failed migration. Catching them was the point.&lt;/p&gt;

&lt;p&gt;The one translation catch in that demo was a single line. A code grader&lt;br&gt;
written as a function body, &lt;code&gt;return output.length &amp;lt; 600;&lt;/code&gt;, threw an error&lt;br&gt;
until I re-expressed it as the bare expression &lt;code&gt;output.length &amp;lt; 600&lt;/code&gt;.&lt;br&gt;
Same meaning, different shape, and the failure was silent unless you read&lt;br&gt;
the per-assertion output. That is the whole migration in miniature: nothing&lt;br&gt;
here is hard in isolation, and it is all easy to miss.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Accept the new baseline in writing, to yourself if no one else.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Similarity scores will differ between harnesses. That is expected, not a&lt;br&gt;
failure. Once you have run the parity check and classified the differences,&lt;br&gt;
the new run becomes your reference baseline going forward. Future regressions&lt;br&gt;
get measured against it, not against numbers from a platform that no longer&lt;br&gt;
exists. If you do not make that decision explicitly, you will keep comparing&lt;br&gt;
against ghosts.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Do the same inventory for Agent Builder and stored prompts.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;They die the same day, and they are usually owned by the same people who&lt;br&gt;
own the evals. Agent Builder workflows do not convert cleanly into code,&lt;br&gt;
and stored prompts have no export API. Inventory them in the same pass,&lt;br&gt;
while the API is still up, or they become a second emergency on Nov 29.&lt;/p&gt;

&lt;p&gt;That is the whole list. The deadline supplies the urgency, so the work does&lt;br&gt;
not need any. Start with the API pull. Everything else can be scheduled&lt;br&gt;
after it.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>openai</category>
      <category>promptfoo</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
