Migration verdict: treat this as a state-model migration, not an endpoint rename. OpenAI will shut down the Assistants API on August 26, 2026. The supported destination is the Responses API plus the Conversations API. New conversations should move first; old Threads should be backfilled only when they are still needed.
Source audit: checked against current OpenAI documentation on August 23, 2026. Track the underlying deadline on the AI Stack Change Radar and its Assistants API change record.
What breaks on August 26
Requests to the deprecated Assistants API stop being a viable production path. Applications that create or retrieve Assistants, Threads, Messages, Runs or Run Steps through the beta Assistants surface need a replacement. The important object mapping is:
| Assistants API | Replacement | Migration consequence |
|---|---|---|
| Assistant | Prompt or application configuration | Move model, instructions and tool configuration into a versioned prompt or your code/configuration layer. |
| Thread | Conversation | Store a new Conversation ID beside your own user/session key. |
| Message | Input/output item | Expect conversations to contain tool calls and tool outputs as well as messages. |
| Run | Response | Replace run polling and status handling with Responses API handling, streaming or background-mode logic as appropriate. |
| Run Step | Response item | Update tracing, audit logs and tool-call parsers to consume typed response items. |
Do not assume that preserving the same prompt text preserves the same behavior. State representation, tool-call events, retry logic, streaming events and observability all change.
Who is affected
- Applications that reference
client.beta.assistantsorclient.beta.threads. - Backends that persist
assistant_id,thread_id,run_idor Run Step IDs. - Tool integrations that submit outputs to an active Run.
- Support, compliance or analytics systems that reconstruct a session from Thread Messages.
- Queues that poll Run status or assume one active Run per Thread.
If your application already calls client.responses.create() and either passes a Conversation ID or manages state explicitly, this deadline may not affect that path.
Prerequisites
- Inventory every Assistants call. Search code, workers, notebooks and scheduled jobs for Assistants, Threads, Runs and Run Steps.
- Record the current contract. Save representative prompts, tool schemas, expected outputs, latency, token use, error rates and safety behavior.
- Separate configuration from state. Decide whether model/instructions/tools live in a versioned OpenAI Prompt or in your application.
- Add dual identifiers. Your data model needs room for both the legacy
thread_idand a newconversation_idduring rollout. - Pin a current OpenAI SDK. Upgrade in a branch and verify the Conversations and Responses methods used by your language SDK.
Exact migration steps
1. Freeze the legacy baseline
Capture at least 50 representative sessions, including tool success, tool failure, long conversations, file retrieval, malformed tool output, timeout and moderation cases. Store expected assertions rather than only screenshots.
2. Replace the Assistant with a versioned configuration
Create a reusable Prompt in the OpenAI dashboard or move the Assistant’s model, instructions and tools into source-controlled application configuration. Record the Prompt ID and version. Do not delete the Assistant yet.
3. Create a Conversation for each new session
from openai import OpenAI
import os
client = OpenAI()
conversation = client.conversations.create(
metadata={"app_session_id": "session_123"}
)
response = client.responses.create(
prompt={"id": os.environ["OPENAI_PROMPT_ID"]},
conversation=conversation.id,
input=[{
"role": "user",
"content": "Summarize the customer issue and propose the next action."
}],
)
print(response.output_text)
Persist conversation.id against your own session key. A Conversation can store messages, tool calls, tool outputs and other items, so downstream readers must not assume every item is a user or assistant message.
4. Rebuild tool execution around response items
Keep tool schemas strict and versioned. When a response asks for a function call, validate its name and arguments, run the tool with least privilege, submit the tool output using the current Responses API pattern, and continue until a terminal response is reached. Add idempotency at your tool boundary so a retry cannot repeat a payment, ticket update or destructive write.
5. Change state lookup
Replace “load Thread, append Message, create Run” with “load Conversation ID, create Response with new input.” Keep the application session key as the durable lookup key; OpenAI object IDs should be replaceable implementation details.
6. Move new traffic before old history
OpenAI explicitly says it will not provide an automated Threads-to-Conversations migration tool. Route new chats to Conversations immediately. Backfill an old Thread only when a user resumes it or when retention requirements justify the work. For each backfill, list the Thread messages in chronological order, transform supported text/image parts into Conversation items, create the Conversation, and record a one-time mapping from Thread ID to Conversation ID.
7. Update observability
Log response IDs, conversation IDs, prompt version, model, tool-call IDs, finish state, latency, input/output tokens and error class. Do not carry Run Step dashboards forward unchanged; rebase them on response items and tool events.
Code and configuration checklist
- Remove new writes to
client.beta.assistantsandclient.beta.threads. - Add
OPENAI_PROMPT_IDand, if used, a pinned prompt version to deployment configuration. - Add
conversation_idbeside—not over—thread_iduntil rollback closes. - Replace Run polling with Responses streaming, background processing or direct response handling appropriate to the workload.
- Update event parsers and audit schemas for response items.
- Make every state write and tool side effect idempotent.
Tests that must pass
- Golden behavior: required facts, refusal behavior and tool selection match approved expectations.
- Conversation continuity: a five-turn session preserves relevant facts without duplicating tool output.
- Tool contract: valid calls succeed; invalid arguments fail closed; repeated calls do not repeat side effects.
- Ordering: concurrent user messages and tool results do not corrupt state.
- Failure recovery: timeouts, 429s and 5xx responses use bounded retries and remain observable.
- Cost and latency: p50/p95 latency and token cost stay inside explicit release thresholds.
- Backfill: resumed Threads preserve the required user-visible history after selective conversion.
- Data controls: retention, deletion, access and regional-processing requirements remain satisfied.
Staged rollout
- Shadow: run Responses for internal test sessions and compare without returning its output.
- Staff canary: route employee traffic and synthetic monitors to the new path.
- One percent: enable new sessions only; keep resumed legacy Threads on Assistants.
- Ten to fifty percent: expand by tenant while watching tool errors, latency, cost and safety metrics.
- Full new-session cutover: stop creating Threads.
- Selective backfill: migrate active history only, then close the legacy path before August 26.
Rollback
Use a server-side routing flag such as assistant_backend=assistants|responses. During the canary, retain Assistant IDs, Thread IDs and the legacy code path. If a release threshold fails, stop assigning new sessions to Responses and return new sessions to the Assistants path while the API remains available. Never “roll back” by deleting Conversations or overwriting Thread mappings; keep both identifiers and mark which backend owns each session.
The rollback expires when the Assistants API shuts down. After that date, recovery means fixing forward on Responses—not re-enabling Assistants.
Replacement options and limitations
Recommended: Responses API plus Conversations API, with Prompts or application configuration replacing Assistant objects. previous_response_id can be useful for some short-lived chains, but Conversations are the closer match when the application needs a durable server-side container.
Limitations to plan for: no automated Thread migration; item types are broader than messages; a new tool loop and event model; possible output differences even with identical instructions; and a rollback window that ends at shutdown.
The useful “graveyard” lesson
The Assistants API belongs in historical context, but a separate AI tool graveyard would not help a team ship. The reusable lesson is operational: vendor-managed objects can disappear while the user’s session still matters. Keep your own durable session key, version prompts and tool contracts, isolate provider IDs, and preserve a reversible routing layer. This guide is where that history becomes an actionable migration pattern.
Official sources
- OpenAI API deprecations
- Assistants migration guide
- Conversation state
- Function calling
- Production best practices
Bottom line: create no new Threads, move new sessions to Conversations now, preserve dual identifiers during rollout, and complete the cutover before August 26.
