Packages
fnord
0.9.36
0.9.40
0.9.39
0.9.38
0.9.37
0.9.36
0.9.35
0.9.34
0.9.33
0.9.32
0.9.31
0.9.30
0.9.29
0.9.28
0.9.27
0.9.26
0.9.25
0.9.24
0.9.23
0.9.22
0.9.21
0.9.20
0.9.19
0.9.18
0.9.17
0.9.16
0.9.15
0.9.14
0.9.13
0.9.12
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.99
0.8.98
0.8.97
0.8.96
0.8.95
0.8.94
0.8.93
0.8.92
0.8.91
0.8.90
0.8.89
0.8.88
0.8.87
0.8.86
0.8.85
0.8.84
0.8.83
0.8.82
0.8.81
0.8.80
0.8.79
0.8.78
0.8.77
0.8.76
0.8.75
0.8.74
0.8.73
0.8.72
0.8.71
0.8.70
0.8.69
0.8.68
0.8.67
0.8.66
0.8.65
0.8.64
0.8.63
0.8.62
0.8.61
0.8.60
0.8.59
0.8.58
0.8.57
0.8.56
0.8.55
0.8.54
0.8.53
0.8.52
0.8.51
0.8.50
0.8.49
0.8.48
0.8.47
0.8.46
0.8.45
0.8.44
0.8.43
0.8.42
0.8.41
0.8.40
0.8.39
0.8.38
0.8.37
0.8.36
0.8.35
0.8.34
0.8.33
0.8.32
0.8.31
0.8.30
0.8.29
0.8.27
0.8.26
0.8.25
0.8.24
0.8.23
0.8.22
0.8.21
0.8.20
0.8.19
0.8.18
0.8.17
0.8.16
0.8.15
0.8.14
0.8.13
0.8.12
0.8.11
0.8.1
0.8.0
0.7.24
0.7.23
0.7.22
0.7.21
0.7.20
0.7.19
0.7.18
0.7.17
0.7.16
0.7.15
0.7.14
0.7.13
0.7.12
0.7.11
0.7.10
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.3
0.7.2
0.7.1
0.7.0
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.1
0.6.0
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.44
0.4.43
0.4.42
0.4.41
0.4.40
0.4.39
0.4.38
0.4.37
0.4.36
0.4.35
0.4.34
0.4.33
0.4.32
0.4.30
0.4.29
0.4.28
0.4.27
0.4.26
0.4.25
0.4.24
0.4.23
0.4.22
0.4.21
0.4.20
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.0
0.2.0
0.1.0
AI code archaeology
Current section
Files
Jump to
Current section
Files
lib/ai/model/openai.ex
defmodule AI.Model.OpenAI do
@moduledoc """
OpenAI model profiles and presets.
Provides factory functions for common presets and encodes model name,
context window, and reasoning level. Intended to be called indirectly via
AI.Model wrapper functions.
"""
@type t :: %AI.Model{
model: binary,
context: non_neg_integer,
reasoning: atom,
verbosity: atom | nil
}
# ----------------------------------------------------------------------------
# Common presets
# ----------------------------------------------------------------------------
@spec smarter() :: AI.Model.t()
def smarter(), do: gpt55(:medium)
@spec smart() :: AI.Model.t()
def smart(), do: gpt54(:low)
@spec balanced() :: AI.Model.t()
def balanced(), do: gpt54_mini(:medium)
@spec fast() :: AI.Model.t()
def fast(), do: gpt54_mini(:none)
# The Responses API exposes web search as a tool entry
# (%{type: "web_search"} in the tools array), not as a model variant. The
# legacy gpt-5-search-api SKU only worked under chat completions and is
# scheduled for removal. web_search/0 returns a normal model; callers that
# need search must also pass web_search?: true to AI.Completion.get/1 so
# the tool gets attached.
@spec web_search() :: AI.Model.t()
def web_search(), do: gpt54_nano(:none)
@spec large_context(:smart | :balanced | :fast) :: AI.Model.t()
def large_context(:smart), do: gpt41()
def large_context(:balanced), do: gpt41_mini()
def large_context(:fast), do: gpt41_nano()
# ----------------------------------------------------------------------------
# API-specific model definitions
# ----------------------------------------------------------------------------
@spec gpt55(atom) :: AI.Model.t()
def gpt55(reasoning \\ :medium), do: AI.Model.new("gpt-5.5", 1_050_000, reasoning)
@spec gpt54(atom) :: AI.Model.t()
def gpt54(reasoning \\ :medium), do: AI.Model.new("gpt-5.4", 1_050_000, reasoning)
@spec gpt54_mini(atom) :: AI.Model.t()
def gpt54_mini(reasoning \\ :medium), do: AI.Model.new("gpt-5.4-mini", 400_000, reasoning)
@spec gpt54_nano(atom) :: AI.Model.t()
def gpt54_nano(reasoning \\ :medium), do: AI.Model.new("gpt-5.4-nano", 400_000, reasoning)
@spec gpt41() :: AI.Model.t()
def gpt41(), do: AI.Model.new("gpt-4.1", 1_000_000, :none)
@spec gpt41_mini() :: AI.Model.t()
def gpt41_mini(), do: AI.Model.new("gpt-4.1-mini", 1_000_000, :none)
@spec gpt41_nano() :: AI.Model.t()
def gpt41_nano(), do: AI.Model.new("gpt-4.1-nano", 1_000_000, :none)
end