OpenAI recommends the Responses API for new projects and still supports Chat Completions. Chat Completions takes and returns messages; Responses takes a string or typed input items and returns an output array of typed items. Requesty translates web search across providers, while OpenAI's stored state, file search, and code interpreter stay tied to OpenAI.
What changes in the API?
OpenAI's migration guide breaks the move into three jobs: call /v1/responses, read typed output items, and decide how to carry state between turns. Most of the migration work sits in the fields.
| Part of the integration | Chat Completions | Responses |
|---|---|---|
| Endpoint | /v1/chat/completions | /v1/responses |
| Input | messages | input, as a string or typed items |
| Output | Messages | An output array of typed items |
| Text access | choices[0].message.content | The SDK's output_text helper or items in the output array |
| Structured Outputs | response_format | text.format |
| Function definition shape | name and parameters are nested under function (externally tagged) | name and parameters sit at the top level of the tool object (internally tagged) |
| Default function strictness | Non-strict | Omitting strict attempts strict mode and falls back to non-strict if the schema is incompatible |
| Function calls and results | Tool calls sit on the assistant message; results go back as tool-role messages | Function calls and their outputs are separate items, linked by call_id |
| Conversation state | Your app manages messages | Your app can manage input, use previous_response_id, or use the Conversations API |
The migration guide says the output array can contain reasoning, tool-call, and message items, so a parser cannot assume the first item is the message. A single Responses request can also call several built-in tools alongside custom functions.
Check function schemas during the move too. A function that ran in non-strict mode in Chat Completions may be handled differently when strict is omitted in Responses. Our guide to Structured Outputs across providers covers compatibility across models.
There is also a model-specific reason to consider switching. Starting with GPT-5.4, OpenAI says Chat Completions does not support tool calling with reasoning_effort values other than none.
OpenAI reports a 3% SWE-bench improvement using Responses with the same prompt and setup, plus a 40% to 80% improvement in cache utilization in internal tests. Measure the difference on your own workload before turning either figure into a savings estimate.
Which features survive a provider switch?
Endpoint support, stored continuation, and hosted tools vary by route, so check each one before switching. Our OpenAI-compatible API guide covers the checks to make.
| Feature | What carries across a route |
|---|---|
| Responses request format | Requesty serves /v1/responses alongside Chat Completions and Messages on the same base URL. Check the endpoint on any other gateway you use. |
| Stored continuation | previous_response_id depends on stored state on the backend. OpenRouter, for example, rejects non-null previous_response_id and store: true on its stateless Responses API. |
| Hosted web search | Requesty translates one web search definition for its documented native search providers across Chat Completions, Responses, and Messages. |
| File search and code interpreter | OpenAI's vector stores and code interpreter containers live in OpenAI's systems. Treat them as provider-specific and test the exact route. |
| Developer-hosted functions | The tool runs in your application. Check the function schema and strictness supported by each route. |
| Reasoning state | OpenAI says persisted reasoning can be reused only within the same model family. Incompatible reasoning is omitted when switching families. |
Sources: Requesty inference APIs, Requesty web search, OpenAI reasoning guide, and Open Responses specification.
The OpenAI Agents SDK drops previous_response_id and conversation_id when a model is routed through Chat Completions. That behavior belongs in your fallback tests.
A hosted tool runs on the provider's side. A developer-hosted function runs in your application, and Open Responses uses that distinction in its multi-provider specification.
A gateway can translate a tool definition, but a fallback still needs a backend that can do the job. In our routing platform comparison, TrueFoundry keeps a follow-up using previous_response_id on the original backend and disables cross-target fallback for that follow-up.
Web search can use one tool definition
Requesty's web search docs list OpenAI, Azure OpenAI, Anthropic, Vertex AI, xAI, and Perplexity as native search providers. Requesty translates one tool definition to each provider's format across Chat Completions, Responses, and Messages.
The example below uses the documented Responses model ID and reads the key from REQUESTY_API_KEY. The response can include web_search_call items and url_citation annotations.
import os
from openai import OpenAI
client = OpenAI(
base_url="https://router.requesty.ai/v1",
api_key=os.environ["REQUESTY_API_KEY"],
)
response = client.responses.create(
model="openai-responses/gpt-5.6-sol",
input="What are the latest releases from OpenAI?",
tools=[{"type": "web_search"}],
)
print(response.output_text)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://router.requesty.ai/v1",
apiKey: process.env.REQUESTY_API_KEY,
});
const response = await client.responses.create({
model: "openai-responses/gpt-5.6-sol",
input: "What are the latest releases from OpenAI?",
tools: [{ type: "web_search" }],
});
console.log(response.output_text);Search shows what a gateway can normalize. Our post on provider-native tools through a gateway examines that boundary in more detail.
Choose where conversation state lives
With OpenAI Responses, previous_response_id links one response to the next, so your app does not have to send the full history itself. OpenAI says prior input tokens in the chain are still billed, and the previous response's top-level instructions do not carry over. Send those instructions again on the next turn.
Storage changes the integration too. OpenAI stores Responses by default, and its data guide gives a 30 day application state retention period by default or when store is true. With Zero Data Retention enabled, store is treated as false.
OpenAI also stores Chat Completions by default for new accounts. According to its migration guide, setting store: false disables storage in either API.
For a flow that needs provider fallback, keep history in your app, set store: false, and send the needed context on each turn. For stateless reasoning flows, OpenAI's migration guide says to replay encrypted reasoning items when reasoning must continue; the model-family limit still applies when switching models.
Replaying history can increase input volume. On Requesty, cache_control breakpoints on Responses input items are translated for Anthropic models, and cache read and write tokens appear in usage. Measure cache behavior on the flow you intend to route.
What does replaying context cost?
Take a flow with 100,000 requests per month. Assume each request includes 3,000 tokens of replayed context, with no cache discount, on GPT-6.1 Sol at its November 2026 input price of $2 per million tokens (Requesty's coding benchmark).
| Replayed context | Calculation | Monthly provider input cost |
|---|---|---|
| 3,000 tokens per request | 100,000 x 3,000 tokens x $2 / million | $600 |
| 6,000 tokens per request | 100,000 x 6,000 tokens x $2 / million | $1,200 |
Context length drives this number. Doubling it adds $600 per month at the same input rate, before any cache discount and other request costs. Requesty's quickstart states that a 5% service fee is added when you top up credits, and that each request's exact cost appears in usage.cost.
Use Responses for new OpenAI projects that need its typed output or built-in tools. Keep Chat Completions for an existing flow that meets its requirements. For a flow that must switch providers, use a gateway's Responses endpoint, keep history in your app, and test the tools and schemas on every fallback route.
Before moving a flow to Responses
0 of 6 done
Frequently asked questions
- What is the difference between the Responses API and Chat Completions?
- The Responses API accepts a string or typed input items, returns typed output items, supports stored conversation state, and includes built-in tools. Chat Completions uses messages for input and output.
- Is OpenAI replacing Chat Completions with the Responses API?
- OpenAI continues to support Chat Completions and recommends the Responses API for new projects.
- Does an OpenAI-compatible API support the Responses API?
- OpenAI compatibility does not guarantee Responses API support. Check the endpoint, streaming events, state handling, schema fields, and built-in tools for each route.
- Can I use Responses API web search with models from other providers?
- Requesty translates one web search tool definition for native search providers including OpenAI, Anthropic, Vertex AI, Azure OpenAI, xAI, and Perplexity. The definition works across Chat Completions, Responses, and Messages.
- Does previous_response_id make conversation history free?
- No. OpenAI bills previous input tokens in a chained conversation as input tokens, even when you use previous_response_id.
- SEP '26
OpenAI-Compatible APIs: Meaning, Providers and Examples
An OpenAI compatible API lets you reuse your SDK, but features vary. Compare provider endpoints, tools, streaming, JSON, vision and Responses support.
- JUL '26
Do provider native tools still work through an LLM gateway?
Web search, Gemini grounding, file search, MCP, prompt caching, reasoning tokens. The most repeated gateway question of the week, answered feature by feature with what passes through, what needs a flag, and what does not.
