<?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: Utkarsh Raj Sutihar</title>
    <description>The latest articles on DEV Community by Utkarsh Raj Sutihar (@ursutihar).</description>
    <link>https://dev.to/ursutihar</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%2F4072146%2Fa3dae3d9-ea65-4fc3-b47c-d0eea8b5ba24.jpg</url>
      <title>DEV Community: Utkarsh Raj Sutihar</title>
      <link>https://dev.to/ursutihar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ursutihar"/>
    <language>en</language>
    <item>
      <title>The Assistants API dies in 15 days. Here is what changes, and why most teams will miss it.</title>
      <dc:creator>Utkarsh Raj Sutihar</dc:creator>
      <pubDate>Tue, 11 Aug 2026 02:14:40 +0000</pubDate>
      <link>https://dev.to/ursutihar/the-assistants-api-dies-in-15-days-here-is-what-changes-and-why-most-teams-will-miss-it-1am4</link>
      <guid>https://dev.to/ursutihar/the-assistants-api-dies-in-15-days-here-is-what-changes-and-why-most-teams-will-miss-it-1am4</guid>
      <description>&lt;p&gt;OpenAI removes the Assistants API on 26 August 2026. They announced it on 26 August 2025, so there has been a full year of notice.&lt;/p&gt;

&lt;p&gt;If your app still calls &lt;code&gt;/v1/assistants&lt;/code&gt;, &lt;code&gt;/v1/threads&lt;/code&gt; or &lt;code&gt;/v1/runs&lt;/code&gt;, it stops working that day. There is no extension. Azure OpenAI customers are on a separate clock and have until February 2027. Everyone else is not.&lt;/p&gt;

&lt;p&gt;This post has two parts. What actually changes, and some numbers on how often teams move when a vendor warns them a year ahead. The second part is not encouraging.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changes
&lt;/h2&gt;

&lt;p&gt;The mapping is simple to state and annoying to do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assistants become Prompts&lt;/li&gt;
&lt;li&gt;Threads become Conversations&lt;/li&gt;
&lt;li&gt;Runs become Responses&lt;/li&gt;
&lt;li&gt;Run steps become Items&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In code, the shape of it looks like this.&lt;/p&gt;

&lt;p&gt;Before:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;thread&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;beta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;beta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;beta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;runs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;assistant_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;asst_...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;completed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;beta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;runs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;retrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;conversation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;conversations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;responses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;conversation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;conversation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pmpt_...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check the official migration guide for exact parameter names before writing anything real. The point of the snippet above is the shape, not the syntax.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four things that make this more than a rename
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Prompts are built in the dashboard, not in code.&lt;/strong&gt; This is the one that catches people. If your app creates assistants dynamically at runtime, there is no equivalent path yet. It is the loudest complaint in OpenAI's own announcement thread and it does not have a clean answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. There is no bulk export for threads.&lt;/strong&gt; You move live conversations gradually as they come back, rather than running one migration script over a weekend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The polling loop goes away.&lt;/strong&gt; You send input items and get output items back. Nothing to poll. This part is genuinely nicer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. You have to decide where state lives.&lt;/strong&gt; Responses is client-stateful by default. You pass &lt;code&gt;previous_response_id&lt;/code&gt; to keep continuity, and the server holds that chain for 30 days. After that you rebuild from your own database, which means you need one.&lt;/p&gt;

&lt;p&gt;For a small team, this is a week of work that nobody planned for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why most teams will miss the date
&lt;/h2&gt;

&lt;p&gt;I wanted to know what actually happens when a vendor gives a year of notice. So I measured it.&lt;/p&gt;

&lt;p&gt;I pulled one week of npm download counts for 32 widely used SDKs, grouped every download by the exact version requested, and checked how old each version was. That is 355 million installs across 7,190 distinct versions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;79% of downloads were for a version at least one major behind&lt;/li&gt;
&lt;li&gt;The median version being installed is 376 days old&lt;/li&gt;
&lt;li&gt;23 of the 32 vendors have most of their traffic on an old major, not a minority of it&lt;/li&gt;
&lt;li&gt;For the &lt;code&gt;openai&lt;/code&gt; package specifically: 99% behind, at a median of about seven months&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two caveats, because they matter and somebody will raise them otherwise. CI runners re-download pinned versions constantly, so an unknown share of that 79% is machines rather than teams sitting on a backlog. And this is npm only, so other ecosystems are unmeasured.&lt;/p&gt;

&lt;p&gt;Even discounted heavily, about a year of staleness is real.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that is nobody's fault
&lt;/h2&gt;

&lt;p&gt;Upgrading a vendor SDK ships no feature, wins no customer, and appears on no roadmap. It is invisible when done and expensive when skipped, which is exactly the kind of work that slips quarter after quarter. A year of notice does not change that. It only sets the date the bill arrives.&lt;/p&gt;

&lt;p&gt;If you are still on Assistants with two weeks left, check the dashboard-only Prompts limitation first. It is the one that can block you outright rather than just cost you time.&lt;/p&gt;

&lt;p&gt;Full data, method, and every source: &lt;a href="https://apinae.dev/research/" rel="noopener noreferrer"&gt;apinae.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have already migrated, I would like to know how long it took and what broke that you did not expect.&lt;/p&gt;

</description>
      <category>openai</category>
      <category>api</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
