diff --git a/apps/api/internal/clients/clients_test.go b/apps/api/internal/clients/clients_test.go index 7f528fb..9f80763 100644 --- a/apps/api/internal/clients/clients_test.go +++ b/apps/api/internal/clients/clients_test.go @@ -1558,10 +1558,39 @@ func TestGeminiClientChatConvertsFunctionCallResponse(t *testing.T) { } func TestGeminiURLAcceptsVersionedBaseURL(t *testing.T) { - got := geminiURL("https://generativelanguage.googleapis.com/v1beta", "gemini-2.5-flash", "test-key") - want := "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=test-key" - if got != want { - t.Fatalf("unexpected gemini url: %s", got) + tests := []struct { + name string + baseURL string + want string + }{ + { + name: "default version", + baseURL: "https://generativelanguage.googleapis.com", + want: "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=test-key", + }, + { + name: "google beta version", + baseURL: "https://generativelanguage.googleapis.com/v1beta", + want: "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=test-key", + }, + { + name: "compatible v1 endpoint", + baseURL: "https://cloud.dataeyes.ai/v1", + want: "https://cloud.dataeyes.ai/v1/models/gemini-2.5-flash:generateContent?key=test-key", + }, + { + name: "openai suffix after version", + baseURL: "https://generativelanguage.googleapis.com/v1beta/openai", + want: "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=test-key", + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got := geminiURL(test.baseURL, "gemini-2.5-flash", "test-key") + if got != test.want { + t.Fatalf("unexpected gemini url: %s", got) + } + }) } } diff --git a/apps/api/internal/clients/gemini.go b/apps/api/internal/clients/gemini.go index 6dc86bc..31a964a 100644 --- a/apps/api/internal/clients/gemini.go +++ b/apps/api/internal/clients/gemini.go @@ -61,11 +61,13 @@ func geminiURL(baseURL string, model string, apiKey string) string { base = "https://generativelanguage.googleapis.com" } base = strings.TrimSuffix(base, "/openai") - if strings.HasSuffix(base, "/v1beta") { - base = strings.TrimSuffix(base, "/v1beta") + if !strings.HasSuffix(base, "/v1") && + !strings.HasSuffix(base, "/v1beta") && + !strings.HasSuffix(base, "/v1alpha") { + base += "/v1beta" } escapedModel := url.PathEscape(model) - return fmt.Sprintf("%s/v1beta/models/%s:generateContent?key=%s", base, escapedModel, url.QueryEscape(apiKey)) + return fmt.Sprintf("%s/models/%s:generateContent?key=%s", base, escapedModel, url.QueryEscape(apiKey)) } func geminiBody(request Request) map[string]any {