From 5954afef558600f8e30ef2c3df026a4657a88e42 Mon Sep 17 00:00:00 2001 From: easyai Date: Wed, 22 Jul 2026 04:53:42 +0800 Subject: [PATCH] =?UTF-8?q?fix(gemini):=20=E4=BF=9D=E7=95=99=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E5=B9=B3=E5=8F=B0=E7=9A=84=20API=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/api/internal/clients/clients_test.go | 37 ++++++++++++++++++++--- apps/api/internal/clients/gemini.go | 8 +++-- 2 files changed, 38 insertions(+), 7 deletions(-) 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 {