From 451076b2bff47ffe8b9c8c7f91b24659d4061770 Mon Sep 17 00:00:00 2001 From: LordMathis Date: Thu, 24 Jul 2025 23:04:28 +0200 Subject: [PATCH] Add OpenAIProxy handler to route requests based on instance name --- server/pkg/handlers.go | 38 ++++++++++++++++++++++++++++++++++++++ server/pkg/routes.go | 1 + 2 files changed, 39 insertions(+) diff --git a/server/pkg/handlers.go b/server/pkg/handlers.go index 78c90a1..c38aff8 100644 --- a/server/pkg/handlers.go +++ b/server/pkg/handlers.go @@ -452,3 +452,41 @@ func (h *Handler) ProxyToInstance() http.HandlerFunc { proxy.ServeHTTP(w, r) } } + +// OpenAIProxy godoc +func (h *Handler) OpenAIProxy() http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + // Extract model name from request body + var requestBody map[string]any + if err := json.NewDecoder(r.Body).Decode(&requestBody); err != nil { + http.Error(w, "Invalid request body", http.StatusBadRequest) + return + } + + modelName, ok := requestBody["model"].(string) + if !ok || modelName == "" { + http.Error(w, "Model name is required", http.StatusBadRequest) + return + } + + // Route to the appropriate instance based on model name + instance, err := h.InstanceManager.GetInstance(modelName) + if err != nil { + http.Error(w, "Failed to get instance: "+err.Error(), http.StatusInternalServerError) + return + } + + if !instance.Running { + http.Error(w, "Instance is not running", http.StatusServiceUnavailable) + return + } + + proxy, err := instance.GetProxy() + if err != nil { + http.Error(w, "Failed to get proxy: "+err.Error(), http.StatusInternalServerError) + return + } + + proxy.ServeHTTP(w, r) + } +} diff --git a/server/pkg/routes.go b/server/pkg/routes.go index 707d527..a7689b9 100644 --- a/server/pkg/routes.go +++ b/server/pkg/routes.go @@ -48,6 +48,7 @@ func SetupRouter(handler *Handler) *chi.Mux { }) // OpenAI-compatible endpoints (model name in request body determines routing) + r.Post("/v1/", handler.OpenAIProxy()) // Proxy to OpenAI-compatible endpoints based on instance name in request body // r.Post("/v1/completions", handler.OpenAICompletions()) // Route based on model name in request // r.Post("/v1/chat/completions", handler.OpenAIChatCompletions()) // Route based on model name in request // r.Post("/v1/embeddings", handler.OpenAIEmbeddings()) // Route based on model name in request (if supported)