Packages
fnord
0.9.11
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.ex
defmodule AI.Model do
defstruct [
:model,
:context,
:reasoning,
:verbosity
]
@type reasoning_level ::
:none
| :minimal
| :low
| :medium
| :high
| :default
@type verbosity_level :: :low | :medium | :high
@type speed ::
:smart
| :balanced
| :fast
@type t :: %__MODULE__{
model: String.t(),
context: non_neg_integer,
reasoning: reasoning_level,
verbosity: verbosity_level | nil
}
@spec new(String.t(), non_neg_integer) :: t
@spec new(String.t(), non_neg_integer, reasoning_level) :: t
def new(model, context, reasoning \\ :medium) do
%AI.Model{
model: model,
context: context,
reasoning: reasoning,
verbosity: nil
}
end
@spec with_reasoning(t(), reasoning_level()) :: t()
def with_reasoning(model = %__MODULE__{}, lvl) do
case lvl do
nil -> model
"" -> model
lvl when is_atom(lvl) -> %AI.Model{model | reasoning: lvl}
lvl when is_binary(lvl) -> %AI.Model{model | reasoning: String.to_existing_atom(lvl)}
end
end
@spec with_verbosity(t(), verbosity_level() | binary | nil) :: t()
def with_verbosity(model = %__MODULE__{}, lvl) do
case lvl do
nil -> model
"" -> model
lvl when is_atom(lvl) -> %AI.Model{model | verbosity: lvl}
lvl when is_binary(lvl) -> %AI.Model{model | verbosity: String.to_existing_atom(lvl)}
end
end
def smart(), do: gpt5_mini(:medium)
def smarter(), do: gpt5(:low)
def balanced(), do: gpt5_mini(:low)
def fast(), do: gpt41_nano()
def coding(), do: gpt5_mini(:medium)
def web_search(), do: gpt_4o_mini_search_preview()
def large_context(), do: large_context(:smart)
def large_context(:smart), do: gpt41()
def large_context(:balanced), do: gpt41_mini()
def large_context(:fast), do: gpt41_nano()
# ----------------------------------------------------------------------------
# OpenAI Models
# ----------------------------------------------------------------------------
def gpt5(reasoning \\ :medium), do: new("gpt-5.2", 400_000, reasoning)
def gpt5_mini(reasoning \\ :medium), do: new("gpt-5-mini", 400_000, reasoning)
def gpt5_nano(reasoning \\ :medium), do: new("gpt-5-nano", 400_000, reasoning)
def gpt41(), do: new("gpt-4.1", 1_000_000, :none)
def gpt41_mini(), do: new("gpt-4.1-mini", 1_000_000, :none)
def gpt41_nano(), do: new("gpt-4.1-nano", 1_000_000, :none)
def o4_mini(reasoning \\ :medium), do: new("o4-mini", 200_000, reasoning)
def gpt_4o_mini_search_preview(), do: new("gpt-4o-mini-search-preview", 128_000, :none)
end