feat(platform): add missing OpenAI API models (GPT-5.4, O4-mini, O3-pro, etc.)

Add 18 missing OpenAI models to the platform's LLM blocks:

- GPT-5.4 series (current flagship): gpt-5.4, gpt-5.4-mini, gpt-5.4-nano, gpt-5.4-pro
- O-series reasoning: o4-mini, o4-mini-deep-research, o3-pro, o3-deep-research
- GPT-5.3 series: gpt-5.3, gpt-5.3-codex
- Pro variants: gpt-5.2-pro, gpt-5-pro
- Codex models: gpt-5.1-codex
- Legacy: gpt-4.1-nano

Changes:
- LlmModel enum: added 18 new model entries with proper API model IDs
- MODEL_METADATA: added context window, max output tokens, and pricing tier
- block_cost_config.py: added credit costs for all new models
- codex.py: added GPT-5.3 Codex and updated default
- Updated DEFAULT_LLM_MODEL from GPT-5.2 to GPT-5.4
This commit is contained in:
Torantulino
2026-03-31 15:57:12 +01:00
parent c410be890e
commit d857b8b854
3 changed files with 101 additions and 7 deletions

View File

@@ -35,6 +35,7 @@ class CodexCallResult:
class CodexModel(str, Enum):
"""Codex-capable OpenAI models."""
GPT5_3_CODEX = "gpt-5.3-codex"
GPT5_1_CODEX = "gpt-5.1-codex"
@@ -91,7 +92,7 @@ class CodeGenerationBlock(Block):
)
model: CodexModel = SchemaField(
title="Codex Model",
default=CodexModel.GPT5_1_CODEX,
default=CodexModel.GPT5_3_CODEX,
description="Codex-optimized model served via the Responses API.",
advanced=False,
)

View File

@@ -116,20 +116,39 @@ class LlmModel(str, Enum, metaclass=LlmModelMeta):
return None
return None
# OpenAI models
O3_MINI = "o3-mini"
# OpenAI models — O-series reasoning
O4_MINI = "o4-mini"
O4_MINI_DEEP_RESEARCH = "o4-mini-deep-research"
O3 = "o3-2025-04-16"
O3_MINI = "o3-mini"
O3_PRO = "o3-pro"
O3_DEEP_RESEARCH = "o3-deep-research"
O1 = "o1"
O1_MINI = "o1-mini"
# GPT-5 models
# OpenAI models — GPT-5.4 series (current flagship)
GPT5_4 = "gpt-5.4-2026-03-05"
GPT5_4_MINI = "gpt-5.4-mini-2026-03-17"
GPT5_4_NANO = "gpt-5.4-nano-2026-03-17"
GPT5_4_PRO = "gpt-5.4-pro"
# OpenAI models — GPT-5.3 series
GPT5_3 = "gpt-5.3"
GPT5_3_CODEX = "gpt-5.3-codex"
# OpenAI models — GPT-5.2 series
GPT5_2 = "gpt-5.2-2025-12-11"
GPT5_2_PRO = "gpt-5.2-pro"
# OpenAI models — GPT-5.1 series
GPT5_1 = "gpt-5.1-2025-11-13"
GPT5_1_CODEX = "gpt-5.1-codex"
# OpenAI models — GPT-5 series
GPT5 = "gpt-5-2025-08-07"
GPT5_MINI = "gpt-5-mini-2025-08-07"
GPT5_NANO = "gpt-5-nano-2025-08-07"
GPT5_PRO = "gpt-5-pro"
GPT5_CHAT = "gpt-5-chat-latest"
# OpenAI models — GPT-4.x series
GPT41 = "gpt-4.1-2025-04-14"
GPT41_MINI = "gpt-4.1-mini-2025-04-14"
GPT41_NANO = "gpt-4.1-nano"
GPT4O_MINI = "gpt-4o-mini"
GPT4O = "gpt-4o"
GPT4_TURBO = "gpt-4-turbo"
@@ -254,23 +273,64 @@ class LlmModel(str, Enum, metaclass=LlmModelMeta):
MODEL_METADATA = {
# https://platform.openai.com/docs/models
# O-series reasoning models
LlmModel.O4_MINI: ModelMetadata(
"openai", 200000, 100000, "O4 Mini", "OpenAI", "OpenAI", 1
),
LlmModel.O4_MINI_DEEP_RESEARCH: ModelMetadata(
"openai", 200000, 100000, "O4 Mini Deep Research", "OpenAI", "OpenAI", 2
),
LlmModel.O3: ModelMetadata("openai", 200000, 100000, "O3", "OpenAI", "OpenAI", 2),
LlmModel.O3_MINI: ModelMetadata(
"openai", 200000, 100000, "O3 Mini", "OpenAI", "OpenAI", 1
), # o3-mini-2025-01-31
LlmModel.O3_PRO: ModelMetadata(
"openai", 200000, 100000, "O3 Pro", "OpenAI", "OpenAI", 3
),
LlmModel.O3_DEEP_RESEARCH: ModelMetadata(
"openai", 200000, 100000, "O3 Deep Research", "OpenAI", "OpenAI", 3
),
LlmModel.O1: ModelMetadata(
"openai", 200000, 100000, "O1", "OpenAI", "OpenAI", 3
), # o1-2024-12-17
LlmModel.O1_MINI: ModelMetadata(
"openai", 128000, 65536, "O1 Mini", "OpenAI", "OpenAI", 2
), # o1-mini-2024-09-12
# GPT-5 models
# GPT-5.4 models (current flagship, March 2026)
LlmModel.GPT5_4: ModelMetadata(
"openai", 1050000, 128000, "GPT-5.4", "OpenAI", "OpenAI", 2
),
LlmModel.GPT5_4_MINI: ModelMetadata(
"openai", 400000, 128000, "GPT-5.4 Mini", "OpenAI", "OpenAI", 1
),
LlmModel.GPT5_4_NANO: ModelMetadata(
"openai", 400000, 128000, "GPT-5.4 Nano", "OpenAI", "OpenAI", 1
),
LlmModel.GPT5_4_PRO: ModelMetadata(
"openai", 1050000, 128000, "GPT-5.4 Pro", "OpenAI", "OpenAI", 3
),
# GPT-5.3 models
LlmModel.GPT5_3: ModelMetadata(
"openai", 128000, 16384, "GPT-5.3", "OpenAI", "OpenAI", 2
),
LlmModel.GPT5_3_CODEX: ModelMetadata(
"openai", 400000, 128000, "GPT-5.3 Codex", "OpenAI", "OpenAI", 2
),
# GPT-5.2 models
LlmModel.GPT5_2: ModelMetadata(
"openai", 400000, 128000, "GPT-5.2", "OpenAI", "OpenAI", 3
),
LlmModel.GPT5_2_PRO: ModelMetadata(
"openai", 400000, 128000, "GPT-5.2 Pro", "OpenAI", "OpenAI", 3
),
# GPT-5.1 models
LlmModel.GPT5_1: ModelMetadata(
"openai", 400000, 128000, "GPT-5.1", "OpenAI", "OpenAI", 2
),
LlmModel.GPT5_1_CODEX: ModelMetadata(
"openai", 400000, 128000, "GPT-5.1 Codex", "OpenAI", "OpenAI", 2
),
# GPT-5 models
LlmModel.GPT5: ModelMetadata(
"openai", 400000, 128000, "GPT-5", "OpenAI", "OpenAI", 1
),
@@ -280,15 +340,22 @@ MODEL_METADATA = {
LlmModel.GPT5_NANO: ModelMetadata(
"openai", 400000, 128000, "GPT-5 Nano", "OpenAI", "OpenAI", 1
),
LlmModel.GPT5_PRO: ModelMetadata(
"openai", 400000, 128000, "GPT-5 Pro", "OpenAI", "OpenAI", 3
),
LlmModel.GPT5_CHAT: ModelMetadata(
"openai", 400000, 16384, "GPT-5 Chat Latest", "OpenAI", "OpenAI", 2
),
# GPT-4.x models
LlmModel.GPT41: ModelMetadata(
"openai", 1047576, 32768, "GPT-4.1", "OpenAI", "OpenAI", 1
),
LlmModel.GPT41_MINI: ModelMetadata(
"openai", 1047576, 32768, "GPT-4.1 Mini", "OpenAI", "OpenAI", 1
),
LlmModel.GPT41_NANO: ModelMetadata(
"openai", 1047576, 32768, "GPT-4.1 Nano", "OpenAI", "OpenAI", 1
),
LlmModel.GPT4O_MINI: ModelMetadata(
"openai", 128000, 16384, "GPT-4o Mini", "OpenAI", "OpenAI", 1
), # gpt-4o-mini-2024-07-18
@@ -661,7 +728,7 @@ MODEL_METADATA = {
LlmModel.V0_1_0_MD: ModelMetadata("v0", 128000, 64000, "v0 1.0 MD", "V0", "V0", 1),
}
DEFAULT_LLM_MODEL = LlmModel.GPT5_2
DEFAULT_LLM_MODEL = LlmModel.GPT5_4
for model in LlmModel:
if model not in MODEL_METADATA:

View File

@@ -60,19 +60,33 @@ from backend.integrations.credentials_store import (
# =============== Configure the cost for each LLM Model call =============== #
MODEL_COST: dict[LlmModel, int] = {
LlmModel.O4_MINI: 2,
LlmModel.O4_MINI_DEEP_RESEARCH: 5,
LlmModel.O3: 4,
LlmModel.O3_MINI: 2,
LlmModel.O3_PRO: 30,
LlmModel.O3_DEEP_RESEARCH: 15,
LlmModel.O1: 16,
LlmModel.O1_MINI: 4,
# GPT-5 models
LlmModel.GPT5_4: 5,
LlmModel.GPT5_4_MINI: 2,
LlmModel.GPT5_4_NANO: 1,
LlmModel.GPT5_4_PRO: 60,
LlmModel.GPT5_3: 5,
LlmModel.GPT5_3_CODEX: 5,
LlmModel.GPT5_2: 6,
LlmModel.GPT5_2_PRO: 60,
LlmModel.GPT5_1: 5,
LlmModel.GPT5_1_CODEX: 4,
LlmModel.GPT5: 2,
LlmModel.GPT5_MINI: 1,
LlmModel.GPT5_NANO: 1,
LlmModel.GPT5_PRO: 30,
LlmModel.GPT5_CHAT: 5,
LlmModel.GPT41: 2,
LlmModel.GPT41_MINI: 1,
LlmModel.GPT41_NANO: 1,
LlmModel.GPT4O_MINI: 1,
LlmModel.GPT4O: 3,
LlmModel.GPT4_TURBO: 10,
@@ -285,6 +299,18 @@ BLOCK_COSTS: dict[Type[Block], list[BlockCost]] = {
AITextSummarizerBlock: LLM_COST,
AIListGeneratorBlock: LLM_COST,
CodeGenerationBlock: [
BlockCost(
cost_type=BlockCostType.RUN,
cost_filter={
"model": CodexModel.GPT5_3_CODEX,
"credentials": {
"id": openai_credentials.id,
"provider": openai_credentials.provider,
"type": openai_credentials.type,
},
},
cost_amount=5,
),
BlockCost(
cost_type=BlockCostType.RUN,
cost_filter={
@@ -296,7 +322,7 @@ BLOCK_COSTS: dict[Type[Block], list[BlockCost]] = {
},
},
cost_amount=5,
)
),
],
CreateTalkingAvatarVideoBlock: [
BlockCost(