调整 Gemini 模型接口路由
This commit is contained in:
@@ -40,9 +40,9 @@ type geminiUploadSession struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var geminiGenerateContentRoutePrefixes = []string{
|
var geminiGenerateContentRoutePrefixes = []string{
|
||||||
|
"/api/v1/models/",
|
||||||
"/v1beta/models/",
|
"/v1beta/models/",
|
||||||
"/v1/models/",
|
"/v1/models/",
|
||||||
"/models/",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) registerGeminiGenerateContentRoutes(mux *http.ServeMux) {
|
func (s *Server) registerGeminiGenerateContentRoutes(mux *http.ServeMux) {
|
||||||
|
|||||||
@@ -1,6 +1,14 @@
|
|||||||
package httpapi
|
package httpapi
|
||||||
|
|
||||||
import "testing"
|
import (
|
||||||
|
"io"
|
||||||
|
"log/slog"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/easyai/easyai-ai-gateway/apps/api/internal/auth"
|
||||||
|
)
|
||||||
|
|
||||||
func TestGeminiGenerateContentModelFromPath(t *testing.T) {
|
func TestGeminiGenerateContentModelFromPath(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
@@ -25,9 +33,9 @@ func TestGeminiGenerateContentModelFromPath(t *testing.T) {
|
|||||||
wantOK: true,
|
wantOK: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "bare model path",
|
name: "gateway api v1 model",
|
||||||
prefix: "/models/",
|
prefix: "/api/v1/models/",
|
||||||
requestPath: "/models/gemini-image:generateContent",
|
requestPath: "/api/v1/models/gemini-image:generateContent",
|
||||||
wantModel: "gemini-image",
|
wantModel: "gemini-image",
|
||||||
wantOK: true,
|
wantOK: true,
|
||||||
},
|
},
|
||||||
@@ -61,6 +69,39 @@ func TestGeminiGenerateContentModelFromPath(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRegisterGeminiGenerateContentRoutes(t *testing.T) {
|
||||||
|
server := &Server{
|
||||||
|
auth: auth.New("test-secret", "", ""),
|
||||||
|
logger: slog.New(slog.NewTextHandler(io.Discard, nil)),
|
||||||
|
}
|
||||||
|
mux := http.NewServeMux()
|
||||||
|
mux.HandleFunc("GET /api/v1/models", func(w http.ResponseWriter, _ *http.Request) {
|
||||||
|
w.WriteHeader(http.StatusNoContent)
|
||||||
|
})
|
||||||
|
server.registerGeminiGenerateContentRoutes(mux)
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
method string
|
||||||
|
path string
|
||||||
|
status int
|
||||||
|
}{
|
||||||
|
{method: http.MethodGet, path: "/api/v1/models", status: http.StatusNoContent},
|
||||||
|
{method: http.MethodPost, path: "/api/v1/models/gemini-image:generateContent", status: http.StatusUnauthorized},
|
||||||
|
{method: http.MethodPost, path: "/v1/models/gemini-image:generateContent", status: http.StatusUnauthorized},
|
||||||
|
{method: http.MethodPost, path: "/v1beta/models/gemini-image:generateContent", status: http.StatusUnauthorized},
|
||||||
|
{method: http.MethodPost, path: "/models/gemini-image:generateContent", status: http.StatusNotFound},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.method+" "+tt.path, func(t *testing.T) {
|
||||||
|
response := httptest.NewRecorder()
|
||||||
|
mux.ServeHTTP(response, httptest.NewRequest(tt.method, tt.path, nil))
|
||||||
|
if response.Code != tt.status {
|
||||||
|
t.Fatalf("status = %d, want %d; body=%s", response.Code, tt.status, response.Body.String())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestGeminiImageTaskBodyMapsTextOnlyToImageGenerate(t *testing.T) {
|
func TestGeminiImageTaskBodyMapsTextOnlyToImageGenerate(t *testing.T) {
|
||||||
mapping, err := geminiImageTaskBody("gemini-image", map[string]any{
|
mapping, err := geminiImageTaskBody("gemini-image", map[string]any{
|
||||||
"contents": []any{
|
"contents": []any{
|
||||||
|
|||||||
Reference in New Issue
Block a user