fix: select provider AFTER routing resolves model groups
CI / Lint (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Build (push) Has been cancelled

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.
This commit is contained in:
2026-05-07 13:54:42 -04:00
parent 330eaa57d1
commit 4aea7a3b4c
+8 -32
View File
@@ -533,38 +533,7 @@ func (s *Server) handleChatCompletions(c *gin.Context) {
return return
} }
// Select provider based on model name // Strip common prefixes and prepare model ID
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
modelID := req.Model modelID := req.Model
prefixes := []string{"gemini/", "google/", "openai/", "deepseek/", "moonshot/", "grok/", "ollama/"} prefixes := []string{"gemini/", "google/", "openai/", "deepseek/", "moonshot/", "grok/", "ollama/"}
for _, p := range prefixes { 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) 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 // Convert ChatCompletionRequest to UnifiedRequest
unifiedReq := &models.UnifiedRequest{ unifiedReq := &models.UnifiedRequest{
Model: modelID, Model: modelID,