From a4a19428ae1301b580469c95c8538a410427ce4c Mon Sep 17 00:00:00 2001 From: Sergei Bronnikov Date: Fri, 17 Apr 2026 13:02:31 +0100 Subject: [PATCH 1/3] add models, exec --- internal/provider/openai/cost.go | 23 ++++++++++++++++++++ internal/server/web/proxy/middleware.go | 29 +++++++++++++------------ 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/internal/provider/openai/cost.go b/internal/provider/openai/cost.go index 6093a54..ea4b21b 100644 --- a/internal/provider/openai/cost.go +++ b/internal/provider/openai/cost.go @@ -41,6 +41,17 @@ var OpenAiPerThousandTokenCost = map[string]map[string]float64{ "chatgpt-image-latest": 0.005, "gpt-image-1-mini": 0.002, + "gpt-5.4": 0.005, + "gpt-5.4-mini": 0.00075, + "gpt-5.4-nano": 0.0002, + "gpt-5.4-pro": 0.06, + + "gpt-5.3-codex": 0.00175, + + "gpt-5.2-codex": 0.00175, + + "gpt-5.1-codex-mini": 0.00025, + "gpt-5.2-chat-latest": 0.001750, "gpt-5.1-chat-latest": 0.001250, "gpt-5.1-codex-max": 0.001250, @@ -181,6 +192,17 @@ var OpenAiPerThousandTokenCost = map[string]map[string]float64{ "gpt-image-1.5": 0.010, "chatgpt-image-latest": 0.010, + "gpt-5.4": 0.0225, + "gpt-5.4-mini": 0.0045, + "gpt-5.4-nano": 0.00125, + "gpt-5.4-pro": 0.27, + + "gpt-5.3-codex": 0.014, + + "gpt-5.2-codex": 0.014, + + "gpt-5.1-codex-mini": 0.002, + "gpt-5.2-chat-latest": 0.014000, "gpt-5.1-chat-latest": 0.010000, "gpt-5.1-codex-max": 0.010000, @@ -330,6 +352,7 @@ var AllowedTools = []string{ "file_search", "function", "computer_use_preview", + "exec_command", } type tokenCounter interface { diff --git a/internal/server/web/proxy/middleware.go b/internal/server/web/proxy/middleware.go index c6f328e..e9b26aa 100644 --- a/internal/server/web/proxy/middleware.go +++ b/internal/server/web/proxy/middleware.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "net/http" + "slices" "strconv" "strings" "time" @@ -823,20 +824,20 @@ func getMiddleware(cpm CustomProvidersManager, rm routeManager, pm PoliciesManag return } - //hasNotAllowedTools := false - //for _, tool := range responsesReq.Tools { - // if !slices.Contains(openai.AllowedTools, tool.Type) { - // hasNotAllowedTools = true - // break - // } - //} - // - //if hasNotAllowedTools { - // telemetry.Incr("bricksllm.proxy.get_middleware.tool_not_allowed", nil, 1) - // JSON(c, http.StatusForbidden, "[BricksLLM] one of the tools is not allowed") - // c.Abort() - // return - //} + hasNotAllowedTools := false + for _, tool := range responsesReq.Tools { + if !slices.Contains(openai.AllowedTools, tool.Type) { + hasNotAllowedTools = true + break + } + } + + if hasNotAllowedTools { + telemetry.Incr("bricksllm.proxy.get_middleware.tool_not_allowed", nil, 1) + JSON(c, http.StatusForbidden, "[BricksLLM] one of the tools is not allowed") + c.Abort() + return + } isCreateContainerTool := false var containerMemLimit string From 78c8cdfc6dcfedaafc7e6918831b11194fd3d55b Mon Sep 17 00:00:00 2001 From: Sergei Bronnikov Date: Fri, 17 Apr 2026 15:47:19 +0100 Subject: [PATCH 2/3] add tools --- internal/provider/openai/cost.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/internal/provider/openai/cost.go b/internal/provider/openai/cost.go index ea4b21b..ba63fe3 100644 --- a/internal/provider/openai/cost.go +++ b/internal/provider/openai/cost.go @@ -353,6 +353,10 @@ var AllowedTools = []string{ "function", "computer_use_preview", "exec_command", + "shell", + "local_shell", + "filesystem", + "patch", } type tokenCounter interface { From f09fb3c59a7eb3038bd41746d343666927c5889b Mon Sep 17 00:00:00 2001 From: Sergei Bronnikov Date: Fri, 17 Apr 2026 15:54:11 +0100 Subject: [PATCH 3/3] wip --- internal/server/web/proxy/middleware.go | 29 ++++++++++++------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/internal/server/web/proxy/middleware.go b/internal/server/web/proxy/middleware.go index e9b26aa..c6f328e 100644 --- a/internal/server/web/proxy/middleware.go +++ b/internal/server/web/proxy/middleware.go @@ -6,7 +6,6 @@ import ( "fmt" "io" "net/http" - "slices" "strconv" "strings" "time" @@ -824,20 +823,20 @@ func getMiddleware(cpm CustomProvidersManager, rm routeManager, pm PoliciesManag return } - hasNotAllowedTools := false - for _, tool := range responsesReq.Tools { - if !slices.Contains(openai.AllowedTools, tool.Type) { - hasNotAllowedTools = true - break - } - } - - if hasNotAllowedTools { - telemetry.Incr("bricksllm.proxy.get_middleware.tool_not_allowed", nil, 1) - JSON(c, http.StatusForbidden, "[BricksLLM] one of the tools is not allowed") - c.Abort() - return - } + //hasNotAllowedTools := false + //for _, tool := range responsesReq.Tools { + // if !slices.Contains(openai.AllowedTools, tool.Type) { + // hasNotAllowedTools = true + // break + // } + //} + // + //if hasNotAllowedTools { + // telemetry.Incr("bricksllm.proxy.get_middleware.tool_not_allowed", nil, 1) + // JSON(c, http.StatusForbidden, "[BricksLLM] one of the tools is not allowed") + // c.Abort() + // return + //} isCreateContainerTool := false var containerMemLimit string