Skip to content

OpenAI provides a number of chat-based models, mostly under the ChatGPT brand. 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 = openai_key(),
  model = NULL,
  params = NULL,
  seed = lifecycle::deprecated(),
  api_args = list(),
  echo = c("none", "output", "all")
)

models_openai(base_url = "https://api.openai.com/v1", api_key = openai_key())

Arguments

system_prompt

A system prompt to set the behavior of the assistant.

base_url

The base URL to the endpoint; the default uses OpenAI.

api_key

API key to use for authentication.

You generally should not supply this directly, but instead set the OPENAI_API_KEY environment variable. The best place to set this is in .Renviron, which you can easily edit by calling usethis::edit_r_environ().

model

The model to use for the chat (defaults to "gpt-4.1"). 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().

seed

Optional integer seed that ChatGPT uses to try and make output more reproducible.

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().

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.

Examples

chat <- chat_openai()
#> Using model = "gpt-4.1".
chat$chat("
  What is the difference between a tibble and a data frame?
  Answer with a bulleted list
")
#> - **Printing**:  
#>   - *Tibble*: Prints only the first 10 rows and as many columns as fit
#> on the screen, making output more readable.  
#>   - *Data frame*: Prints the entire data set, which can overwhelm the 
#> console with large datasets.
#> 
#> - **Column types**:  
#>   - *Tibble*: Keeps column types consistent (e.g., never converts 
#> strings to factors automatically).  
#>   - *Data frame*: Converts character vectors to factors by default 
#> unless `stringsAsFactors = FALSE` is specified.
#> 
#> - **Subsetting**:  
#>   - *Tibble*: Always returns a tibble when subsetting, even if there 
#> is only one column.  
#>   - *Data frame*: May return a vector or a data frame depending on how
#> you subset, which can lead to inconsistent results.
#> 
#> - **Column names**:  
#>   - *Tibble*: Allows non-syntactic names (e.g., names with spaces or 
#> starting with numbers) without modification.  
#>   - *Data frame*: Modifies column names to be syntactically valid in R
#> (e.g., replaces spaces with dots).
#> 
#> - **Recycling rules**:  
#>   - *Tibble*: Stricter recycling rules—only allows recycling of length
#> 1 vectors when adding new columns.  
#>   - *Data frame*: More permissive and may recycle vectors of other 
#> lengths, which can cause unintended results.
#> 
#> - **Package**:  
#>   - *Tibble*: Provided by the **tibble** package (part of the 
#> tidyverse).  
#>   - *Data frame*: Base R data structure.
#> 
#> - **Row names**:  
#>   - *Tibble*: Does not have row names.  
#>   - *Data frame*: Can have row names.

chat$chat("Tell me three funny jokes about statisticians")
#> Sure! Here are three funny jokes about statisticians:
#> 
#> 1.  
#> Why did the statistician bring a ladder to the bar?  
#> Because he heard the drinks were on the house!
#> 
#> 2.  
#> A statistician can have their head in an oven and their feet in a 
#> freezer, and they'll say, "On average, I'm comfortable."
#> 
#> 3.  
#> How do you tell the difference between a mathematician and a 
#> statistician?  
#> If you ask them to jump out of an airplane, the statistician will say,
#> "What's the sample size?"