This is the main interface to OpenAI's models,
using the responses API. You can use this to access OpenAI's latest
models and features like image generation and web search. If you need to use
an OpenAI-compatible API from another provider, or the chat completions
API with OpenAI,use chat_openai_compatible() instead.
Note that a ChatGPT Plus membership does not grant access to the API. You will need to sign up for a developer account (and pay for it) at the developer platform.
Usage
chat_openai(
system_prompt = NULL,
base_url = "https://api.openai.com/v1",
api_key = NULL,
credentials = NULL,
model = NULL,
params = NULL,
api_args = list(),
api_headers = character(),
service_tier = c("auto", "default", "flex", "priority"),
echo = c("none", "output", "all")
)
models_openai(
base_url = "https://api.openai.com/v1",
api_key = NULL,
credentials = NULL
)Arguments
- system_prompt
A system prompt to set the behavior of the assistant.
- base_url
The base URL to the API endpoint.
- api_key
- credentials
Override the default credentials. You generally should not need this argument; instead set the
OPENAI_API_KEYenvironment variable. The best place to set this is in.Renviron, which you can easily edit by callingusethis::edit_r_environ().If you do need additional control, this argument takes a zero-argument function that returns either a string (the API key), or a named list (added as additional headers to every request).
- model
The model to use for the chat (defaults to "gpt-5.4"). We regularly update the default, so we strongly recommend explicitly specifying a model for anything other than casual use. Use
models_openai()to see all options.- params
Common model parameters, usually created by
params().- api_args
Named list of arbitrary extra arguments appended to the body of every chat API call. Combined with the body object generated by ellmer with
modifyList().- api_headers
Named character vector of arbitrary extra headers appended to every chat API call.
- service_tier
Request a specific service tier. There are four options:
"auto"(default): uses the service tier configured in Project settings."default": standard pricing and performance."flex": slower and cheaper."priority": faster and more expensive.
- echo
One of the following options:
none: don't emit any output (default when running in a function).output: echo text and tool-calling output as it streams in (default when running at the console).all: echo all input and output.
Note this only affects the
chat()method.
Value
A Chat object.
See also
Other chatbots:
chat_anthropic(),
chat_aws_bedrock(),
chat_azure_openai(),
chat_cloudflare(),
chat_databricks(),
chat_deepseek(),
chat_github(),
chat_google_gemini(),
chat_groq(),
chat_huggingface(),
chat_lmstudio(),
chat_mistral(),
chat_ollama(),
chat_openai_compatible(),
chat_openrouter(),
chat_perplexity(),
chat_portkey(),
chat_posit()
Examples
chat <- chat_openai()
#> Using model = "gpt-5.4".
chat$chat("
What is the difference between a tibble and a data frame?
Answer with a bulleted list
")
#> - **Both store tabular data in R**, but a **tibble** is a modern version of a
#> **data frame**, provided by the **tibble** package and commonly used in the
#> **tidyverse**.
#>
#> - **Printing behavior**
#> - **Data frame:** prints the whole object by default.
#> - **Tibble:** prints only the first 10 rows and columns that fit on screen,
#> making large datasets easier to inspect.
#>
#> - **Subsetting behavior**
#> - **Data frame:** may simplify results, for example returning a vector
#> instead of a one-column data frame.
#> - **Tibble:** is more strict and usually preserves the data structure.
#>
#> - **Column names**
#> - **Data frame:** may change column names to make them syntactically valid
#> unless told not to.
#> - **Tibble:** keeps column names more faithfully.
#>
#> - **Type handling**
#> - **Data frame:** older versions of R sometimes converted character columns
#> to factors automatically.
#> - **Tibble:** does not do automatic character-to-factor conversion.
#>
#> - **Partial matching**
#> - **Data frame:** can allow partial matching in some cases.
#> - **Tibble:** does not allow partial matching, which helps avoid mistakes.
#>
#> - **Input flexibility**
#> - **Data frame:** works well with base R functions.
#> - **Tibble:** is designed to work smoothly with tidyverse tools like `dplyr`
#> and `ggplot2`.
#>
#> - **Summary**
#> - Use a **data frame** for base R compatibility.
#> - Use a **tibble** when you want cleaner printing, stricter behavior, and
#> tidyverse-friendly workflows.
chat$chat("Tell me three funny jokes about statisticians")
#> - Why did the statistician bring a ladder to work?
#> - Because the data had too many high points.
#>
#> - A statistician drowned crossing a river that was, on average, 3 feet deep.
#> - Moral: always check the distribution.
#>
#> - Statisticians do it with significance.
#> - But only if `p < 0.05`.
