Model, API, and feature updates
Within this model generation, gpt-5.4 is the general-purpose model for both broad tasks and coding. For more difficult problems, gpt-5.4-pro uses more compute to think longer and provide more consistent answers.
For smaller, faster variants, start with gpt-5.4-mini or gpt-5.4-nano.
To help you pick the model that best fits your use case, consider these tradeoffs:
| Variant | Best for |
|---|---|
gpt-5.4 | General-purpose work, including complex reasoning, broad world knowledge, and code-heavy or multi-step agentic tasks |
gpt-5.4-pro | Tough problems that may take longer to solve and need deeper reasoning |
gpt-5.4-mini | High-volume coding, computer use, and agent workflows that still need strong reasoning |
gpt-5.4-nano | High-throughput tasks where speed and cost matter most |
Lower reasoning effort
The reasoning.effort parameter controls how many reasoning tokens the model generates before producing a response. Earlier reasoning models like o3 supported only low, medium, and high: low favored speed and fewer tokens, while high favored more thorough reasoning.
GPT-5.2 and GPT-5.4 support none as their lowest reasoning effort for lower-latency interactions. It is the default setting for both models. If you need more thinking, slowly increase to medium and experiment with results.
With reasoning effort set to none, prompting is important. To improve the model's reasoning quality, even with the default settings, encourage it to “think” or outline its steps before answering.
Reasoning effort set to none
import OpenAI from "openai";
const openai = new OpenAI();
const response = await openai.responses.create({
model: "gpt-5.4",
input:
"Think carefully and outline your steps before answering. How much gold would it take to coat the Statue of Liberty in a 1mm layer?",
reasoning: {
effort: "none",
},
});
console.log(response);from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-5.4",
input="Think carefully and outline your steps before answering. How much gold would it take to coat the Statue of Liberty in a 1mm layer?",
reasoning={"effort": "none"},
)
print(response)package main
import (
"context"
"fmt"
"github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/responses"
"github.com/openai/openai-go/v3/shared"
)
func main() {
client := openai.NewClient()
response, err := client.Responses.New(context.Background(), responses.ResponseNewParams{
Model: "gpt-5.4",
Input: responses.ResponseNewParamsInputUnion{OfString: openai.String("Think carefully and outline your steps before answering. How much gold would it take to coat the Statue of Liberty in a 1mm layer?")},
Reasoning: shared.ReasoningParam{Effort: shared.ReasoningEffortNone},
})
if err != nil {
panic(err)
}
fmt.Println(response)
}import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.Reasoning;
import com.openai.models.ReasoningEffort;
import com.openai.models.responses.ResponseCreateParams;
ResponseCreateParams params =
ResponseCreateParams.builder()
.model("gpt-5.4")
.input("Explain the bug and propose a fix.")
.reasoning(Reasoning.builder().effort(ReasoningEffort.NONE).build())
.build();
client.responses().create(params).output().stream()
.flatMap(item -> item.message().stream())
.flatMap(message -> message.content().stream())
.flatMap(content -> content.outputText().stream())
.forEach(text -> System.out.println(text.text()));using OpenAI.Responses;
#pragma warning disable OPENAI001
string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;
ResponsesClient client = new(key);
CreateResponseOptions options = new()
{
Model = "gpt-5.4",
ReasoningOptions = new ResponseReasoningOptions
{
ReasoningEffortLevel = ResponseReasoningEffortLevel.None,
},
};
options.InputItems.Add(
ResponseItem.CreateUserMessageItem(
"Think carefully and outline your steps before answering. How much gold would it take to coat the Statue of Liberty in a 1mm layer?"
)
);
ResponseResult response = await client.CreateResponseAsync(options);
Console.WriteLine(response.GetOutputText());require "openai"
client = OpenAI::Client.new
response = client.responses.create(
model: "gpt-5.4",
reasoning: {effort: :minimal},
input: "Explain the bug and propose a fix."
)
puts(response.output_text)curl --request POST \
--url https://api.openai.com/v1/responses \
--header "Authorization: Bearer $OPENAI_API_KEY" \
--header 'Content-type: application/json' \
--data '{
"model": "gpt-5.4",
"input": "Think carefully and outline your steps before answering. How much gold would it take to coat the Statue of Liberty in a 1mm layer?",
"reasoning": {
"effort": "none"
}
}'Verbosity
Verbosity determines how many output tokens are generated. Lowering the number of tokens reduces overall latency. While the model's reasoning approach stays mostly the same, the model finds ways to answer more concisely—which can either improve or diminish answer quality, depending on your use case. Here are some scenarios for both ends of the verbosity spectrum:
- High verbosity: Use when you need the model to provide thorough explanations of documents or perform extensive code refactoring.
- Low verbosity: Best for situations where you want concise answers or focused code generation, such as SQL queries.
GPT-5 made this option configurable as one of high, medium, or low. With GPT-5.4, verbosity remains configurable and defaults to medium.
When generating code with GPT-5.4, medium and high verbosity levels yield longer, more structured code with inline explanations, while low verbosity produces shorter, more concise code with minimal commentary.
Control verbosity
import OpenAI from "openai";
const openai = new OpenAI();
const response = await openai.responses.create({
model: "gpt-5.4",
input:
"What is the answer to the ultimate question of life, the universe, and everything?",
text: {
verbosity: "low",
},
});
console.log(response);from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-5.4",
input="What is the answer to the ultimate question of life, the universe, and everything?",
text={"verbosity": "low"},
)
print(response)package main
import (
"context"
"fmt"
"github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/responses"
)
func main() {
client := openai.NewClient()
response, err := client.Responses.New(context.Background(), responses.ResponseNewParams{
Model: "gpt-5.4",
Input: responses.ResponseNewParamsInputUnion{OfString: openai.String("What is the answer to the ultimate question of life, the universe, and everything?")},
Text: responses.ResponseTextConfigParam{Verbosity: responses.ResponseTextConfigVerbosityLow},
})
if err != nil {
panic(err)
}
fmt.Println(response)
}import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.responses.ResponseCreateParams;
import com.openai.models.responses.ResponseTextConfig;
ResponseCreateParams params =
ResponseCreateParams.builder()
.model("gpt-5.4")
.input("Explain the bug and propose a fix.")
.text(ResponseTextConfig.builder().verbosity(ResponseTextConfig.Verbosity.LOW).build())
.build();
client.responses().create(params).output().stream()
.flatMap(item -> item.message().stream())
.flatMap(message -> message.content().stream())
.flatMap(content -> content.outputText().stream())
.forEach(text -> System.out.println(text.text()));require "openai"
client = OpenAI::Client.new
response = client.responses.create(
model: "gpt-5.4",
text: {verbosity: :low},
input: "Explain the bug and propose a fix."
)
puts(response.output_text)curl --request POST \
--url https://api.openai.com/v1/responses \
--header "Authorization: Bearer $OPENAI_API_KEY" \
--header 'Content-type: application/json' \
--data '{
"model": "gpt-5.4",
"input": "What is the answer to the ultimate question of life, the universe, and everything?",
"text": {
"verbosity": "low"
}
}'You can still steer verbosity through prompting after setting it to low in the API. The verbosity parameter defines a general token range at the system prompt level, but the actual output is flexible to both developer and user prompts within that range.
1M context window
1M token context window was introduced with GPT-5.4, making it easier to analyze entire codebases, long document collections, or extended agent trajectories in a single request.
We have separate standard pricing for requests under 272K and over 272K tokens, available in the pricing docs. If you use Fast mode, any prompt above 272K tokens is automatically processed at standard rates.
Long context pricing stacks with other pricing modifiers such as data residency and batch.
We have different rate limits for requests under 272K tokens and over 272K tokens; this is available on the GPT-5.4 model page.