From 14b7089e62e85806a886d1faa3c76c95a7b4448f Mon Sep 17 00:00:00 2001 From: Equent Date: Sun, 8 Mar 2026 12:22:33 +0800 Subject: [PATCH] fix(providers): avoid /responses for namespaced compat models Only explicit OpenAI configs now opt into /responses so namespaced compatible backends stay on chat/completions without extra fallback noise. --- pkg/providers/openai_compat/provider.go | 4 ++-- pkg/providers/openai_compat/provider_test.go | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/providers/openai_compat/provider.go b/pkg/providers/openai_compat/provider.go index 3e45fbc9a..8d5858081 100644 --- a/pkg/providers/openai_compat/provider.go +++ b/pkg/providers/openai_compat/provider.go @@ -423,12 +423,12 @@ func requestTemperature(model string, options map[string]any) (float64, bool) { // shouldPreferResponses centralizes the opt-in rule so OpenAI-native configs // and gpt-5 models can try /responses first while other compat backends keep -// their existing chat/completions behavior. +// their existing chat/completions behavior even when model IDs are namespaced. func shouldPreferResponses(rawModel, normalizedModel string, preferOpenAIModels bool) bool { rawModel = strings.ToLower(strings.TrimSpace(rawModel)) normalizedModel = strings.ToLower(strings.TrimSpace(normalizedModel)) - return preferOpenAIModels || strings.HasPrefix(rawModel, "openai/") || + return preferOpenAIModels || strings.HasPrefix(rawModel, "gpt-5") || strings.HasPrefix(normalizedModel, "gpt-5") } diff --git a/pkg/providers/openai_compat/provider_test.go b/pkg/providers/openai_compat/provider_test.go index ecf9922d8..e88c0c845 100644 --- a/pkg/providers/openai_compat/provider_test.go +++ b/pkg/providers/openai_compat/provider_test.go @@ -16,7 +16,7 @@ import ( "github.com/sipeed/picoclaw/pkg/providers/protocoltypes" ) -func TestProviderChat_PrefersResponsesForOpenAIPrefixedModel(t *testing.T) { +func TestProviderChat_PrefersResponsesWhenConfigured(t *testing.T) { var paths []string var responsesBody map[string]any @@ -63,12 +63,12 @@ func TestProviderChat_PrefersResponsesForOpenAIPrefixedModel(t *testing.T) { })) defer server.Close() - p := NewProvider("key", server.URL, "") + p := NewProvider("key", server.URL, "", WithResponsesPreferred()) out, err := p.Chat( t.Context(), []Message{{Role: "user", Content: "hi"}}, nil, - "openai/gpt-4o", + "gpt-4o", map[string]any{"max_tokens": 256}, ) if err != nil { @@ -81,8 +81,8 @@ func TestProviderChat_PrefersResponsesForOpenAIPrefixedModel(t *testing.T) { if !reflect.DeepEqual(paths, []string{"/responses"}) { t.Fatalf("paths = %v, want [/responses]", paths) } - if responsesBody["model"] != "openai/gpt-4o" { - t.Fatalf("model = %v, want openai/gpt-4o", responsesBody["model"]) + if responsesBody["model"] != "gpt-4o" { + t.Fatalf("model = %v, want gpt-4o", responsesBody["model"]) } if _, ok := responsesBody["input"]; !ok { t.Fatalf("expected responses request body to contain input") @@ -496,7 +496,7 @@ func TestProviderChat_DoesNotPreferResponsesForNestedOpenAINamespace(t *testing. t.Context(), []Message{{Role: "user", Content: "hi"}}, nil, - "groq/openai/gpt-oss-120b", + "openai/gpt-oss-120b", nil, ) if err != nil {