From dbf278e85465dbc9c5cc87194f002452e8fa51cc Mon Sep 17 00:00:00 2001 From: toki Date: Sat, 15 Aug 2026 05:45:04 +0900 Subject: [PATCH] =?UTF-8?q?fix(openai):=20preset=20selector=20effort?= =?UTF-8?q?=EB=A5=BC=20=EA=B2=B0=EC=86=8D=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit caller body에 effort가 없어도 preset selector가 소유한 reasoning effort를 operation 요구사항에 포함해야 올바른 Responses wire를 선택할 수 있다. --- apps/edge/internal/openai/chat_handler.go | 6 +++++- .../internal/openai/provider_model_rewrite_test.go | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/apps/edge/internal/openai/chat_handler.go b/apps/edge/internal/openai/chat_handler.go index 2b78df6a..e9832ddc 100644 --- a/apps/edge/internal/openai/chat_handler.go +++ b/apps/edge/internal/openai/chat_handler.go @@ -398,7 +398,11 @@ func (s *Server) handleChatCompletionsProviderPool(w http.ResponseWriter, dc *ch if err != nil { return tunnelReq, err } - return prepareHotPathChatProviderOperation(prepared, selected, chatProviderRequirements(req)) + requirements := chatProviderRequirements(req) + if effort, ok := dc.route.Preset.Selector.Options["reasoning_effort"].(string); ok && strings.TrimSpace(effort) != "" { + requirements.Effort = strings.TrimSpace(effort) + } + return prepareHotPathChatProviderOperation(prepared, selected, requirements) } prepared, err = prepareProviderChatRequestNormalization(prepared, selected) if err != nil { diff --git a/apps/edge/internal/openai/provider_model_rewrite_test.go b/apps/edge/internal/openai/provider_model_rewrite_test.go index 00c2ea19..82f7e366 100644 --- a/apps/edge/internal/openai/provider_model_rewrite_test.go +++ b/apps/edge/internal/openai/provider_model_rewrite_test.go @@ -230,6 +230,20 @@ func TestHotPathOpenAIToolsAndEffortUseResponsesOperation(t *testing.T) { } } +func TestChatProviderRequirementsAllowPresetOwnedEffort(t *testing.T) { + requirements := chatProviderRequirements(chatCompletionRequest{Tools: []any{map[string]any{"type": "function"}}}) + if requirements.Effort != "" || !requirements.HasTools { + t.Fatalf("caller requirements=%+v", requirements) + } + presetOptions := map[string]any{"reasoning_effort": "high"} + if effort, ok := presetOptions["reasoning_effort"].(string); ok { + requirements.Effort = strings.TrimSpace(effort) + } + if requirements.Effort != "high" || !requirements.HasTools { + t.Fatalf("effective selector requirements=%+v", requirements) + } +} + func TestGeminiChatProviderHTTPToolContinuationRoundTrip(t *testing.T) { var providerRequests []map[string]any provider := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {