From 4aea7a3b4c0e25be5e8fa355dec0b73f72351fe7 Mon Sep 17 00:00:00 2001 From: hobokenchicken Date: Thu, 7 May 2026 13:54:42 -0400 Subject: [PATCH] fix: select provider AFTER routing resolves model groups Previously, provider selection happened on the raw client-requested model name (e.g. 'dispatcher') which defaulted to OpenAI. After routing resolved it to 'deepseek-v4-flash', the provider was never re-selected. Now prefix-stripping + routing runs first, then selectProvider() picks the correct provider based on the resolved concrete model. --- internal/server/server.go | 40 ++++++++------------------------------- 1 file changed, 8 insertions(+), 32 deletions(-) diff --git a/internal/server/server.go b/internal/server/server.go index c4c0d711..68bb8394 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -533,38 +533,7 @@ func (s *Server) handleChatCompletions(c *gin.Context) { return } - // Select provider based on model name - providerName := "openai" // default - modelLower := strings.ToLower(req.Model) - if strings.HasPrefix(modelLower, "gemini/") || strings.Contains(modelLower, "gemini") || strings.HasPrefix(modelLower, "google/") { - providerName = "gemini" - } else if strings.HasPrefix(modelLower, "deepseek/") || (strings.Contains(modelLower, "deepseek") && !strings.Contains(modelLower, "ollama")) { - // Only use deepseek provider if it's not explicitly tagged for ollama - providerName = "deepseek" - } else if strings.HasPrefix(modelLower, "moonshot/") || strings.Contains(modelLower, "kimi") || strings.Contains(modelLower, "moonshot") { - providerName = "moonshot" - } else if strings.HasPrefix(modelLower, "grok/") || strings.Contains(modelLower, "grok") { - providerName = "grok" - } else if strings.HasPrefix(modelLower, "ollama/") || - strings.Contains(modelLower, "glm-") || - strings.Contains(modelLower, "qwen") || - strings.Contains(modelLower, "gemma") || - strings.Contains(modelLower, "llama") || - strings.Contains(modelLower, "mistral") || - strings.Contains(modelLower, "phi") || - strings.Contains(modelLower, "yi") || - strings.Contains(modelLower, "codellama") || - strings.Contains(modelLower, "command-r") { - providerName = "ollama" - } - - provider, ok := s.providers[providerName] - if !ok { - c.JSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("Provider %s not enabled or supported", providerName)}) - return - } - - // Strip common prefixes + // Strip common prefixes and prepare model ID modelID := req.Model prefixes := []string{"gemini/", "google/", "openai/", "deepseek/", "moonshot/", "grok/", "ollama/"} for _, p := range prefixes { @@ -590,6 +559,13 @@ func (s *Server) handleChatCompletions(c *gin.Context) { log.Printf("[ROUTER] %s (%s: %s)", modelID, decision.Strategy, decision.Reason) } + // Select provider based on the resolved model name + provider, providerName, err := s.selectProvider(modelID) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + // Convert ChatCompletionRequest to UnifiedRequest unifiedReq := &models.UnifiedRequest{ Model: modelID,