Get in touch

9io.ai / Blog

OpenAI Agent Builder deprecation: how to migrate before 30 November

The OpenAI Agent Builder deprecation ends in a shutdown on 30 November 2026, and evals go read-only on 31 October. What breaks and how to migrate.

Key takeaways

  • Agent Builder, the hosted Evals platform and reusable prompt objects all shut down on 30 November 2026.
  • Existing evals become read-only on 31 October, so run final baselines and export results first.
  • ChatKit stays. Apps on a hosted workflow need their own ChatKit server, storage and auth.
  • An export is Agents SDK code to review and test, and OpenAI says behaviour may change.
  • Pin the export’s model first. The August 2025 GPT-5 snapshot is removed on 11 December 2026.

Under the OpenAI Agent Builder deprecation announced on 3 June 2026, Agent Builder shuts down on 30 November 2026. The hosted Evals platform and reusable prompt objects shut down the same day. ChatKit stays, but a ChatKit app backed by a hosted Agent Builder workflow needs a backend of its own by then. OpenAI’s migration guide offers two routes. Export the workflow as Agents SDK code and run it yourself, or rebuild it as a workspace agent in ChatGPT.12

Existing evals go read-only sooner, on 31 October, about three weeks from now, so any final baseline run on OpenAI’s platform has to happen before then.1 The export needs care too. OpenAI says it doesn’t convert the workflow graph and doesn’t guarantee that every behaviour carries over unchanged.2

Below are the dates, the changes for ChatKit apps, how to choose a route, a six-step plan with a code sketch, how to replace the evals, and where a migrated workflow can behave differently. Everything is as of 9 October 2026.

What the OpenAI Agent Builder deprecation covers, and when

OpenAI launched Agent Builder in beta on 6 October 2025 as part of AgentKit. The bundle also included ChatKit, a Connector Registry for admins, and new Evals features such as datasets, trace grading and automated prompt optimisation.3 ChatKit remains available and none of the notices mentions the Connector Registry, so AgentKit is only partly deprecated.1 If the shutdown date holds, Agent Builder will have been available for 420 days.

Date What happens What to have done by then
3 June 2026 Deprecation notices for Agent Builder, the Evals platform and reusable prompt objects. Prompt creation is de-emphasised in the platform Start the inventory
31 October 2026 Existing evals become read-only Final baseline runs on hosted evals; definitions and results exported
30 November 2026 Agent Builder shuts down. The Evals dashboard and API shut down. The v1/prompts API and reusable prompt objects shut down Every workflow running in your own code or in ChatGPT; prompts moved into your codebase
11 December 2026 The gpt-5-2025-08-07 snapshot, which the gpt-5 alias points to, is removed from the API Agents that pin gpt-5 moved to a current model

Dates as of 9 October 2026, from OpenAI’s deprecations page and the GPT-5 model page.14

The Evals notice reaches further than the dashboard. OpenAI’s guides put Datasets and the dataset-backed Prompt optimizer under the same notice, and graders documented for eval workflows are part of the same transition.561 The trace-grading guide’s Grade all step opens the evaluation dashboard, which is part of what shuts down.7

ChatKit without Agent Builder: what keeps working and what breaks

OpenAI’s ChatKit guide now describes two paths. The custom server integration runs ChatKit on your own infrastructure with the ChatKit Python SDK, connected to any agent service, including one built with the Agents SDK. The Agent Builder-hosted integration is only for existing workflows during the transition window. The guide sends new apps, and apps moving off a hosted workflow, to the custom server path.89

In a hosted app, your server creates a ChatKit session with a workflow ID, and the browser fetches a short-lived client secret from your server.810 Plan for that workflow ID to stop working at the Agent Builder shutdown on 30 November. Moving to your own server changes these parts of the app.

Hosted Agent Builder workflow Your own ChatKit server
Who runs the chat server OpenAI You
Agent logic A published workflow, by ID and optional version Agents SDK code, or your own loop
Frontend api option getClientSecret, which returns a client secret from your server url and domainKey, an optional fetch that adds your auth headers, and an uploadStrategy if users attach files
Messages and attachments Stored by OpenAI Stored by you, through a Store and an attachment store
Thread titles, uploads, history Session options; titles and history on by default, uploads off Your server code
Per-session inputs state_variables on the session Your request context
Widgets Output by Agent nodes .widget templates your server streams
Chat UI iframe Hosted by OpenAI Hosted by OpenAI

Sources: ChatKit JS and Python docs and the ChatKit API reference, as of 9 October 2026.11121013

The ChatKit JS docs list three features that only a self-hosted backend gets. Users can cancel a response, the composer gains @-mentions, a tool menu and a model picker, and your server can push effects to the client.11 On the frontend, the change is small:

// Before: ChatKit on a hosted Agent Builder workflow
const options = { api: { getClientSecret: fetchClientSecret } };

// After: ChatKit on your own server
const options = { api: { url: "/api/chatkit", domainKey: "your-domain-key", fetch: fetchWithAuth } };

The domain key comes from registering each hostname that serves the chat on OpenAI’s domain allowlist page. The ChatKit iframe checks the key with OpenAI’s API on load and refuses to load if the key is missing or invalid. OpenAI’s production guide also asks you to authenticate every request to your ChatKit endpoint and to authorise access to threads and attachments with your own user and tenant model.14

Existing conversations need a decision. The ChatKit API can list threads, filtered by user and up to 100 a page, and list the items in each thread.15 We found nothing in OpenAI’s docs about what happens to threads stored on the hosted backend after 30 November. If users expect to keep their history, export it and load it into your store before you switch.

Agents SDK or workspace agents: which route fits

OpenAI’s migration guide names two routes, and both start from the same export. The Agents SDK is for teams that build agents in code. Workspace agents in ChatGPT are for building agents in natural language and sharing them with a team.2

Agents SDK Workspace agent in ChatGPT
Built by Engineers, in Python or TypeScript People in your workspace, in natural language
Runs in Your application and infrastructure ChatGPT and Slack, in OpenAI’s cloud, on demand or on a schedule
You need Hosting, storage and auth for your users A ChatGPT Business, Enterprise or Edu workspace with access to workspace agents and permission to create them
Starting point The export, added to your codebase The export, pasted into a new workspace agent
Called from your systems Through your own API A trigger API queues a run and returns a ChatGPT link; the response can’t be read back through the API
Strict branching and loops Kept as code OpenAI warns strongly deterministic workflows may not migrate faithfully

Sources: OpenAI’s migration guide, workspace agents announcement and trigger API docs, as of 9 October 2026.21617

We’d decide by who the workflow serves. If it answers your product’s users, through ChatKit or your own API, take the Agents SDK route, because a workspace agent’s API can’t currently return its answer to your code.17 If it serves your own staff in ChatGPT or Slack and has little fixed branching, a workspace agent is less work. For that route, OpenAI’s steps are to create the agent in ChatGPT, paste the export with a short conversion prompt, review what the builder flags, configure apps and permissions, and preview it on representative inputs before creating it.2

OpenAI also released an Agents API in public beta on 10 September 2026. It runs agents on a managed Codex harness with durable sessions and optional sandboxes, and OpenAI positions it for long-running tasks.1819 The Agent Builder migration guide doesn’t list it as a route, and we’d treat it as a separate decision from this migration.

A six-step plan to migrate from Agent Builder

  1. Inventory your workflows. Search your code for workflow IDs (wf_) in ChatKit session calls, prompt object IDs (pmpt_) and Evals API calls. For each workflow, note the version your sessions run (the latest deployed one unless the call pins a version) and the state variables they pass.10 Then list its nodes, the vector stores and MCP connections behind them, and any evals attached to its Agent nodes.20 Mark whether it serves customers or staff.
  2. Export them. Open each workflow, select Code, choose Agents SDK and Python or TypeScript, and copy the complete export.2 Agent Builder autosaves drafts and publishing creates a versioned snapshot, so check that the export matches the version your sessions run.21 Commit each export unchanged, and pull eval data and ChatKit threads in the same pass.
  3. Rebuild each in the Agents SDK. Treat the export as a draft. Keep its model and settings, move instructions into versioned code, and replace hosted features node by node, as in the mapping below. Run the result inside your ChatKit server’s respond() or behind your own API.
  4. Re-create the evals elsewhere. Rebuild each eval in Promptfoo or your own harness. Before trusting it, re-grade the exported samples with the new graders and check that they reach the old verdicts.
  5. Test. Run the hosted and rebuilt workflows on the same inputs while both exist, using eval cases and samples of real traffic. Compare routes taken, tool calls, guardrail results and final answers. Grouping traces by thread ID makes runs easy to line up.22
  6. Switch over. Move the frontend to your server behind a flag, get a domain key for each production hostname, and shift traffic in steps. Keep the hosted workflow as a fallback until the numbers hold, and finish well before 30 November. Then remove workflow and prompt object IDs from your code.

After the switch, check each route’s output against what it produced before. Counting errors isn’t enough, because a counter only sees the failures that reach it. One of our pipelines reported 0 dropped while most of its output was missing.

Mapping Agent Builder nodes to Agents SDK code

Agent Builder has eleven node types.20 Most map to one SDK feature, and the logic nodes become ordinary Python.

Node What it did In the Agents SDK
Start Appended the user message to the conversation and exposed input_as_text and state variables The input list you pass to Runner.run, and a context object for state
Agent Instructions, tools, model settings, structured output Agent(instructions=..., model=..., model_settings=..., tools=..., output_type=...)
Note Comments on the canvas Code comments
File search Searched an OpenAI vector store FileSearchTool(vector_store_ids=[...])
Guardrails Pass/fail checks for PII, jailbreaks, hallucinations and misuse OpenAI’s Guardrails library, or SDK input and output guardrails
MCP OpenAI connectors or third-party MCP servers HostedMCPTool, with a connector_id and an access token for connectors, or a local MCP server class
If/else Branched on a CEL expression A Python if
While Looped on a CEL expression A Python while, with a cap on iterations
Human approval Paused for the user to approve needs_approval on a tool, then approve or reject the paused run’s interruptions and resume
Transform Reshaped data between nodes Python, or a Pydantic model
Set state Global variables for the workflow Fields on your context object

Sources: OpenAI’s node reference and the Agents SDK docs, as of 9 October 2026.202324252627

Two rows need more than a rename. Human approval moves from a step in the graph to a property of a tool call. A run that reaches a tool needing approval pauses and returns the pending calls as interruptions. You approve or reject them on a saved RunState and resume.26 Your app has to show that request to the user, for example as a ChatKit widget with actions. Connector-backed MCP tools need an access token from your code, so the OAuth flow behind the connector becomes part of your app.27

Keep the safety measures OpenAI recommended for Agent Builder workflows. Pass structured outputs between agents, keep approvals on for MCP tools, run guardrails on user input, and put untrusted text in user messages instead of developer instructions.28

A small Agent Builder flow, rebuilt in the Agents SDK

Take a routing flow. A classifier agent returns JSON, an If/else node routes on it, one agent answers with file search over a vector store, and a fallback agent handles everything else. OpenAI’s homework-helper example uses the same classify-and-route pattern.20 A minimal version, written for this post for openai-agents 0.23.1, released on 2 October 2026:29

from typing import Literal

from agents import Agent, FileSearchTool, ModelSettings, Runner, TResponseInputItem, trace
from openai.types.shared import Reasoning
from pydantic import BaseModel

# Keep the model and settings from your export for the first comparison.
MODEL = "gpt-5"
SETTINGS = ModelSettings(store=True, reasoning=Reasoning(effort="low"))


class Route(BaseModel):
    kind: Literal["product_question", "other"]


classifier = Agent(
    name="Classifier",
    instructions="Classify the latest user message. Use product_question for questions about the product.",
    model=MODEL,
    model_settings=SETTINGS,
    output_type=Route,  # the Agent node's JSON output schema
)

product_agent = Agent(
    name="Product answers",
    instructions="Answer from the product documentation. If it has no answer, say so.",
    model=MODEL,
    model_settings=SETTINGS,
    tools=[FileSearchTool(vector_store_ids=["vs_your_store"], max_num_results=5)],
)

fallback_agent = Agent(
    name="Fallback",
    instructions="Reply in two sentences and suggest contacting support.",
    model=MODEL,
    model_settings=SETTINGS,
)


async def run_workflow(history: list[TResponseInputItem], thread_id: str) -> str:
    """history holds the earlier turns plus the new user message."""
    with trace("Support router", group_id=thread_id):
        routed = await Runner.run(classifier, history)
        # The If/else node, written in Python instead of CEL
        if routed.final_output.kind == "product_question":
            next_agent = product_agent
        else:
            next_agent = fallback_agent
        # Pass the classifier's turn on, as exported code does after each agent node
        answer = await Runner.run(next_agent, routed.to_input_list())
    return answer.final_output

Three details carry Agent Builder’s behaviour over. output_type=Route gives the classifier a structured output, as an Agent node’s schema did, and OpenAI’s safety guide recommends structured outputs between agents because they leave no free-text channel for injected instructions.2328 to_input_list() passes the classifier’s turn to the next agent, which matches how exported code extends the conversation after each agent node.30 group_id ties every trace from one chat thread together, so you can line up a conversation’s runs when comparing versions.22

Inside a ChatKit server, respond() would load the thread’s items, convert them with simple_to_agent_input, run the classifier, then stream the second agent with Runner.run_streamed and stream_agent_response, as in OpenAI’s advanced integration example.9 Our post on cutting an assistant’s time to first word covers a self-hosted ChatKit server on the Agents SDK, including what client tool round trips cost.

The OpenAI Evals deprecation: export first, then rebuild

Existing evals become read-only on 31 October, and the dashboard and API shut down on 30 November.131 Two jobs follow. Run each eval once more while runs are still possible, so the baseline is recent, and pull everything out through the API before the shutdown.

The Evals API returns what you need. Retrieving an eval returns its testing criteria, which hold the grader definitions. Each run’s output items carry the input row, the sampled input and output with the model and settings used, and every grader’s name, pass flag and score.32 That is enough to rebuild the test set, keep the old scores as a baseline, and check that recreated graders agree with the old ones on the same outputs.

OpenAI recommends Promptfoo, which its cookbook describes as an open-source CLI and library. The migration it describes is manual. You recreate prompts, providers, test cases and assertions in a config file, with no Evals export feature involved. The cookbook warns that similarity scores may differ between systems and that recreated graders, LLM judges especially, need validating before they drive regression decisions.33 Promptfoo announced on 9 March 2026 that it had agreed to be acquired by OpenAI and would remain open source.34

Your own harness is the other option. Replay the exported input rows through the rebuilt workflow, apply the same checks, repeat each case a few times and compare per-case scores with the baseline. In either tool, call the workflow itself, through a Python provider in Promptfoo or directly in your harness, so the eval sees routing and tool calls as well as the final text.35 Our post on measuring model drift covers paired differences, error bars and pinning everything a score depends on.

Where a migrated workflow can behave differently

The export is a draft. OpenAI’s guide says some behaviour may need rebuilding by hand, and it asks you to review control flow, triggers, tools and permissions while testing. On the SDK route, runtime configuration, auth, permissions and deployment are yours to validate.2

Model and settings. Copy them exactly from the export. An Agent with no model runs on the SDK default, which the docs give as gpt-5.6-luna with reasoning effort none as of 9 October 2026.36 A public export from October 2025 pins gpt-5, and the snapshot behind that alias is removed on 11 December 2026.3041 Migrate first, measure, then change the model as a separate step with its own eval run.

Conversation history. In a chat workflow, the Start node appended each message to the conversation history.20 The October 2025 export’s entry point takes one input_as_text string and starts a fresh history from it.30 On your ChatKit server, respond() has to load earlier thread items and pass them in. OpenAI’s example loads the last 20, a window worth setting deliberately.9

Prompt objects. The SDK’s prompt parameter references prompts saved in the OpenAI platform, and those shut down on 30 November.231 Move instructions into code. OpenAI’s guide on leaving prompt objects says to keep static text first and dynamic values last, so prompt caching still works.37

The guardrails package. Agent Builder’s Guardrails are OpenAI’s open-source safety layer, which also ships as a Python library.3 On PyPI it is openai-guardrails, imported as guardrails.38 guardrails-ai is an unrelated project that installs a module with the same name, so check which one your environment has.39

Secrets. Hosted MCP tools take an authorization value.27 If an export contains one, move it into your secret store before the code reaches a repository.

A checklist for the next seven weeks

By 31 October

  • List every wf_ and pmpt_ ID in your code, and every call to the Evals API.
  • Export each workflow and commit it unchanged.
  • Run a final baseline of each hosted eval, and save its definition, runs and output items.
  • Choose a route per workflow. Anything your product’s users touch goes to the Agents SDK.

By mid-November

  • Rebuild each workflow with the export’s model and settings pinned.
  • Stand up the ChatKit server and its stores, and get a domain key for each production hostname.
  • Re-create the evals, and check that the new graders reach the old verdicts on the exported samples.
  • Move the ChatKit threads users need to keep into your store.

Before 30 November

  • Run the hosted and rebuilt versions side by side and compare routes, tool calls and answers.
  • Switch the frontend behind a flag, move traffic in steps, then remove workflow and prompt object IDs from your code.

Before 11 December

  • Move any agent pinned to gpt-5 to a current model, as its own change with its own eval run.

  1. OpenAI, “Deprecations” (notices of 3 June 2026 for reusable prompts, the Evals platform and Agent Builder, and of 11 June 2026 for GPT-5 and o3 snapshots), https://developers.openai.com/api/docs/deprecations ↩↩↩↩↩↩↩↩

  2. OpenAI, “Migrate from Agent Builder”, https://developers.openai.com/api/docs/guides/agent-builder/migrate-from-agent-builder ↩↩↩↩↩↩↩

  3. OpenAI, “Introducing AgentKit”, 6 October 2025, with an update of 3 June 2026, https://openai.com/index/introducing-agentkit/ ↩↩

  4. OpenAI, GPT-5 model page (snapshots), https://developers.openai.com/api/docs/models/gpt-5 ↩↩

  5. OpenAI, “Getting started with datasets”, https://developers.openai.com/api/docs/guides/evaluation-getting-started ↩

  6. OpenAI, “Prompt optimizer”, https://developers.openai.com/api/docs/guides/prompt-optimizer ↩

  7. OpenAI, “Trace grading”, https://developers.openai.com/api/docs/guides/trace-grading ↩

  8. OpenAI, “ChatKit”, https://developers.openai.com/api/docs/guides/chatkit ↩↩

  9. OpenAI, “Advanced integrations with ChatKit”, https://developers.openai.com/api/docs/guides/custom-chatkit ↩↩↩

  10. OpenAI API reference, “Create a ChatKit session”, https://developers.openai.com/api/reference/resources/beta/subresources/chatkit/subresources/sessions/methods/create ↩↩↩

  11. ChatKit JS docs, “Managed vs. self-hosted backend”, https://openai.github.io/chatkit-js/ ↩↩

  12. ChatKit JS API reference, “CustomApiConfig”, https://openai.github.io/chatkit-js/api/openai/chatkit-react/type-aliases/customapiconfig/ and “HostedApiConfig”, https://openai.github.io/chatkit-js/api/openai/chatkit-react/type-aliases/hostedapiconfig/ ↩

  13. ChatKit Python docs, “Build interactive responses with widgets”, https://openai.github.io/chatkit-python/guides/build-interactive-responses-with-widgets/ ↩

  14. ChatKit Python docs, “Prepare your app for production” (security and domain keys), https://openai.github.io/chatkit-python/guides/prepare-your-app-for-production/ ↩

  15. OpenAI API reference, “List ChatKit threads”, https://developers.openai.com/api/reference/resources/beta/subresources/chatkit/subresources/threads/methods/list ↩

  16. OpenAI, “Introducing workspace agents in ChatGPT”, 22 April 2026, https://openai.com/index/introducing-workspace-agents-in-chatgpt/ ↩

  17. OpenAI, “Trigger workspace agent runs”, https://developers.openai.com/workspace-agents/trigger-runs ↩↩

  18. OpenAI API changelog, entry of 10 September 2026 (Agents API public beta), https://developers.openai.com/api/docs/changelog ↩

  19. OpenAI, “Agents” (comparison of agent runtimes), https://developers.openai.com/api/docs/guides/agents ↩

  20. OpenAI, “Node reference”, https://developers.openai.com/api/docs/guides/node-reference ↩↩↩↩↩

  21. OpenAI, “Agent Builder”, https://developers.openai.com/api/docs/guides/agent-builder ↩

  22. OpenAI Agents SDK for Python, “Tracing”, https://openai.github.io/openai-agents-python/tracing/ ↩↩

  23. OpenAI Agents SDK for Python, “Agents” (output types and prompt templates), https://openai.github.io/openai-agents-python/agents/ ↩↩↩

  24. OpenAI Agents SDK for Python, “Tools”, https://openai.github.io/openai-agents-python/tools/ ↩

  25. OpenAI Agents SDK for Python, “Guardrails”, https://openai.github.io/openai-agents-python/guardrails/ ↩

  26. OpenAI Agents SDK for Python, “Human-in-the-loop”, https://openai.github.io/openai-agents-python/human_in_the_loop/ ↩↩

  27. OpenAI Agents SDK for Python, “Model context protocol (MCP)” (hosted MCP and connectors), https://openai.github.io/openai-agents-python/mcp/ ↩↩↩

  28. OpenAI, “Safety in building agents”, https://developers.openai.com/api/docs/guides/agent-builder-safety ↩↩

  29. PyPI, release history of openai-agents, https://pypi.org/project/openai-agents/#history ↩

  30. An Agent Builder export published on GitHub, 14 October 2025, https://github.com/fetchai/innovation-lab-examples/blob/main/flight-tracker-openai-workflow-agent/workflow.py ↩↩↩

  31. OpenAI, “Working with evals”, https://developers.openai.com/api/docs/guides/evals ↩

  32. OpenAI API reference, “Evals” (evals, runs and run output items), https://developers.openai.com/api/reference/resources/evals ↩

  33. OpenAI Cookbook, “Moving from OpenAI Evals to Promptfoo”, 3 June 2026, https://developers.openai.com/cookbook/examples/evaluation/moving-from-openai-evals-to-promptfoo ↩

  34. Promptfoo, “Promptfoo is joining OpenAI”, 9 March 2026, https://www.promptfoo.dev/blog/promptfoo-joining-openai/ ↩

  35. Promptfoo docs, “Python Provider”, https://www.promptfoo.dev/docs/providers/python/ ↩

  36. OpenAI Agents SDK for Python, “Models” (default model), https://openai.github.io/openai-agents-python/models/ ↩

  37. OpenAI, “Migrate from prompt objects”, https://developers.openai.com/api/docs/guides/prompting/migrate-from-prompt-object ↩

  38. OpenAI Guardrails for Python, “Quickstart”, https://openai.github.io/openai-guardrails-python/quickstart/ ↩

  39. Guardrails AI, pyproject.toml (package guardrails-ai, module guardrails), https://github.com/guardrails-ai/guardrails/blob/main/pyproject.toml ↩

Frequently asked questions

When does OpenAI Agent Builder shut down?

On 30 November 2026. OpenAI announced the deprecation on 3 June 2026. It recommends the Agents SDK for workflows that stay in code and workspace agents in ChatGPT for natural-language use cases.

Is AgentKit deprecated?

Partly. Agent Builder and the Evals platform, including Datasets and the dataset-backed Prompt optimizer, shut down on 30 November 2026. ChatKit remains available, and OpenAI’s deprecation notices don’t mention the Connector Registry.

Can I use ChatKit without Agent Builder?

Yes. Run your own ChatKit server with the ChatKit Python SDK, connect it to an agent built with the Agents SDK, and point the frontend at it with a URL and a domain key. Hosted Agent Builder workflows only work during the transition window.

What happens to OpenAI Evals?

Existing evals become read-only on 31 October 2026, and the Evals dashboard and API shut down on 30 November 2026. OpenAI recommends Promptfoo, an open-source eval tool, and its guide recreates each eval by hand.

How do I migrate from Agent Builder to the Agents SDK?

In Agent Builder, select Code, choose Agents SDK and Python or TypeScript, and copy the complete export. Add it to your application, install the matching SDK and test it against the hosted workflow. OpenAI says the export doesn’t convert the graph or guarantee identical behaviour.

Can I turn an Agent Builder workflow into a ChatGPT workspace agent?

Yes, with a ChatGPT Business, Enterprise or Edu workspace and permission to create agents. Paste the export into a new workspace agent and review what the builder flags. OpenAI warns that strongly deterministic workflows may not migrate faithfully.

Work with us

Building something like this?

9io is a small team of senior engineers with a fractional CTO, and we work by the hour. Send us a note about your product. The reply comes from the person who'd do the work.