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.
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user