[providers.openai]
display_name = "OpenAI"
adapter = "openai"
api_key_url = "https://platform.openai.com/api-keys"
base_url = "https://api.openai.com/v1"
priority = 90

[providers.openai.auth]
credentials = ["env:OPENAI_API_KEY", "vault:OPENAI_API_KEY", "vault:OPENAI_CODEX"]

[providers.openai.models."gpt-5.6-sol"]
display_name = "GPT-5.6 Sol"
family = "gpt-5"
training = "2026-02-16"
knowledge_cutoff = "February 16, 2026"
default = true
aliases = ["sol", "gpt-sol", "gpt56-sol", "gpt-56-sol", "gpt-5.6", "gpt56", "gpt-56"]
# Codex drives the 5.6 models with a much narrower tool set than the other
# OpenAI models. Set per model so the rest of this provider keeps "openai".
agent_profile = "gpt56"

[providers.openai.models."gpt-5.6-sol".limits]
context_window = 272000
max_output = 128000

[providers.openai.models."gpt-5.6-sol".features]
tools = true
vision = true
reasoning = true
reasoning_effort = "levels"
prompt_cache = true

[providers.openai.models."gpt-5.6-sol".costs]
input_cost_per_mtok = 5.0
output_cost_per_mtok = 30.0
cache_input_cost_per_mtok = 0.5

[providers.openai.models."gpt-5.6-terra"]
display_name = "GPT-5.6 Terra"
family = "gpt-5"
training = "2026-02-16"
knowledge_cutoff = "February 16, 2026"
aliases = ["terra", "gpt-terra", "gpt56-terra", "gpt-56-terra"]
agent_profile = "gpt56"

[providers.openai.models."gpt-5.6-terra".limits]
context_window = 272000
max_output = 128000

[providers.openai.models."gpt-5.6-terra".features]
tools = true
vision = true
reasoning = true
reasoning_effort = "levels"
prompt_cache = true

[providers.openai.models."gpt-5.6-terra".costs]
input_cost_per_mtok = 2.5
output_cost_per_mtok = 15.0
cache_input_cost_per_mtok = 0.25

[providers.openai.models."gpt-5.6-luna"]
display_name = "GPT-5.6 Luna"
family = "gpt-5"
training = "2026-02-16"
knowledge_cutoff = "February 16, 2026"
aliases = ["luna", "gpt-luna", "gpt56-luna", "gpt-56-luna"]
agent_profile = "gpt56"

[providers.openai.models."gpt-5.6-luna".limits]
context_window = 272000
max_output = 128000

[providers.openai.models."gpt-5.6-luna".features]
tools = true
vision = true
reasoning = true
reasoning_effort = "levels"
prompt_cache = true

[providers.openai.models."gpt-5.6-luna".costs]
input_cost_per_mtok = 1.0
output_cost_per_mtok = 6.0
cache_input_cost_per_mtok = 0.1

[providers.openai.models."gpt-5.4"]
display_name = "GPT-5.4"
family = "gpt-5"
training = "2025-08-31"
knowledge_cutoff = "April 2025"
estimated_output_tps = 70
aliases = ["gpt54", "gpt-54", "gpt-5.2", "gpt5", "gpt-5.3-codex", "codex"]

[providers.openai.models."gpt-5.4".limits]
context_window = 272000
max_output = 128000

[providers.openai.models."gpt-5.4".features]
tools = true
vision = true
reasoning = true
reasoning_effort = "levels"

[providers.openai.models."gpt-5.4".costs]
input_cost_per_mtok = 2.5
output_cost_per_mtok = 15.0
cache_input_cost_per_mtok = 0.25

[providers.openai.models."gpt-5.5"]
display_name = "GPT-5.5"
family = "gpt-5"
training = "2025-12-01"
knowledge_cutoff = "December 2025"
estimated_output_tps = 70
aliases = ["gpt55", "gpt-55"]

[providers.openai.models."gpt-5.5".limits]
context_window = 272000
max_output = 128000

[providers.openai.models."gpt-5.5".features]
tools = true
vision = true
reasoning = true
reasoning_effort = "levels"

[providers.openai.models."gpt-5.5".costs]
input_cost_per_mtok = 5.0
output_cost_per_mtok = 30.0
cache_input_cost_per_mtok = 0.5

[providers.openai.models."gpt-5.5-pro"]
display_name = "GPT-5.5 Pro"
family = "gpt-5"
training = "2025-12-01"
knowledge_cutoff = "December 2025"
estimated_output_tps = 20
aliases = ["gpt55-pro", "gpt-55-pro"]

[providers.openai.models."gpt-5.5-pro".limits]
context_window = 1050000
max_output = 128000

[providers.openai.models."gpt-5.5-pro".features]
tools = true
vision = true
reasoning = true
reasoning_effort = "levels"

[providers.openai.models."gpt-5.5-pro".costs]
input_cost_per_mtok = 30.0
output_cost_per_mtok = 180.0
cache_input_cost_per_mtok = 3.0

[providers.openai.models."gpt-5.4-pro"]
display_name = "GPT-5.4 Pro"
family = "gpt-5"
training = "2025-08-31"
knowledge_cutoff = "April 2025"
estimated_output_tps = 20
aliases = ["gpt54-pro", "gpt-54-pro"]

[providers.openai.models."gpt-5.4-pro".limits]
context_window = 1047576
max_output = 128000

[providers.openai.models."gpt-5.4-pro".features]
tools = true
vision = true
reasoning = true
reasoning_effort = "levels"

[providers.openai.models."gpt-5.4-pro".costs]
input_cost_per_mtok = 30.0
output_cost_per_mtok = 180.0
cache_input_cost_per_mtok = 3.0

[providers.openai.models."gpt-5.4-mini"]
display_name = "GPT-5.4 Mini"
family = "gpt-5"
training = "2025-08-31"
knowledge_cutoff = "April 2025"
estimated_output_tps = 140
aliases = ["gpt54-mini", "gpt-54-mini", "gpt-5.3-codex-spark", "codex-spark"]
probe = true
small_default = true

[providers.openai.models."gpt-5.4-mini".limits]
context_window = 272000
max_output = 128000

[providers.openai.models."gpt-5.4-mini".features]
tools = true
vision = true
reasoning = true
reasoning_effort = "levels"

[providers.openai.models."gpt-5.4-mini".costs]
input_cost_per_mtok = 0.75
output_cost_per_mtok = 4.5
cache_input_cost_per_mtok = 0.075
