fix(handler): fallback known gemini models on v1beta 404
This commit is contained in:
@@ -121,7 +121,7 @@ func (h *GatewayHandler) GeminiV1BetaGetModel(c *gin.Context) {
|
|||||||
googleError(c, http.StatusBadGateway, err.Error())
|
googleError(c, http.StatusBadGateway, err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if shouldFallbackGeminiModels(res) {
|
if shouldFallbackGeminiModel(modelName, res) {
|
||||||
c.JSON(http.StatusOK, gemini.FallbackModel(modelName))
|
c.JSON(http.StatusOK, gemini.FallbackModel(modelName))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -674,6 +674,16 @@ func shouldFallbackGeminiModels(res *service.UpstreamHTTPResult) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func shouldFallbackGeminiModel(modelName string, res *service.UpstreamHTTPResult) bool {
|
||||||
|
if shouldFallbackGeminiModels(res) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if res == nil || res.StatusCode != http.StatusNotFound {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return gemini.HasFallbackModel(modelName)
|
||||||
|
}
|
||||||
|
|
||||||
// extractGeminiCLISessionHash 从 Gemini CLI 请求中提取会话标识。
|
// extractGeminiCLISessionHash 从 Gemini CLI 请求中提取会话标识。
|
||||||
// 组合 x-gemini-api-privileged-user-id header 和请求体中的 tmp 目录哈希。
|
// 组合 x-gemini-api-privileged-user-id header 和请求体中的 tmp 目录哈希。
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
package handler
|
package handler
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/Wei-Shaw/sub2api/internal/service"
|
"github.com/Wei-Shaw/sub2api/internal/service"
|
||||||
@@ -141,3 +142,28 @@ func TestGeminiV1BetaHandler_GetModelAntigravityFallback(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestShouldFallbackGeminiModel_KnownFallbackOn404(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
res := &service.UpstreamHTTPResult{StatusCode: http.StatusNotFound}
|
||||||
|
require.True(t, shouldFallbackGeminiModel("gemini-3.1-pro-preview-customtools", res))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestShouldFallbackGeminiModel_UnknownModelOn404(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
res := &service.UpstreamHTTPResult{StatusCode: http.StatusNotFound}
|
||||||
|
require.False(t, shouldFallbackGeminiModel("gemini-future-model", res))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestShouldFallbackGeminiModel_DelegatesScopeFallback(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
res := &service.UpstreamHTTPResult{
|
||||||
|
StatusCode: http.StatusForbidden,
|
||||||
|
Headers: http.Header{"Www-Authenticate": []string{"Bearer error=\"insufficient_scope\""}},
|
||||||
|
Body: []byte("insufficient authentication scopes"),
|
||||||
|
}
|
||||||
|
require.True(t, shouldFallbackGeminiModel("gemini-future-model", res))
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user