fix: ASR/VLM/TTS models not selectable in default model settings (#17024)

This commit is contained in:
euvre
2026-07-17 13:05:22 +08:00
committed by GitHub
parent 677960716e
commit d0ac79dc96
3 changed files with 63 additions and 34 deletions

View File

@@ -20,7 +20,7 @@ import "strings"
// ModelType represents the type of model as a bitmask, matching Python's
// ModelTypeBinary enum (common/constants.py).
// Bit flags (LSB->MSB): 1=chat, 2=embedding, 4=speech2text, 8=image2text, 16=rerank, 32=tts, 64=ocr.
// Bit flags (LSB->MSB): 1=chat, 2=embedding, 4=asr, 8=vision, 16=rerank, 32=tts, 64=ocr.
// A model can belong to multiple types simultaneously.
type ModelType int
@@ -91,10 +91,10 @@ func (mt ModelType) HumanReadable() []string {
parts = append(parts, "embedding")
}
if mt.Has(ModelTypeSpeech2Text) {
parts = append(parts, "speech2text")
parts = append(parts, "asr")
}
if mt.Has(ModelTypeImage2Text) {
parts = append(parts, "image2text")
parts = append(parts, "vision")
}
if mt.Has(ModelTypeRerank) {
parts = append(parts, "rerank")
@@ -115,11 +115,9 @@ func ModelTypeFromString(s string) ModelType {
return ModelTypeChat
case "embedding":
return ModelTypeEmbedding
case "speech2text":
case "asr", "speech2text":
return ModelTypeSpeech2Text
case "image2text":
return ModelTypeImage2Text
case "vision":
case "vision", "image2text":
return ModelTypeImage2Text
case "rerank":
return ModelTypeRerank

View File

@@ -1159,6 +1159,34 @@ func (m *ModelProviderService) ListTenantAddedModels(userID, ownerTenantID, mode
return nil, common.CodeServerError, err
}
// Repair records that have model_type == 0. Before the ModelTypeFromString
// fix that added "asr" support, models whose factory catalog used the
// canonical name "asr" (instead of the legacy "speech2text") were stored
// with model_type = 0. Re-derive the correct bitmask from the factory
// catalog and persist it so the model shows up in typed queries.
providerManager := dao.GetModelProviderManager()
for _, rec := range modelRecords {
if rec.ModelType != 0 {
continue
}
provInfo := providerInfoByID[rec.ProviderID]
if provInfo == nil {
continue
}
factoryModel, lookupErr := providerManager.GetModelByName(provInfo.ProviderName, rec.ModelName)
if lookupErr != nil || len(factoryModel.ModelTypes) == 0 {
continue
}
combinedType := entity.ModelType(0)
for _, t := range factoryModel.ModelTypes {
combinedType |= entity.ModelTypeFromString(t)
}
if combinedType != 0 {
rec.ModelType = int(combinedType)
_ = m.modelDAO.UpdateByID(rec.ID, map[string]interface{}{"model_type": int(combinedType)})
}
}
var targetRecords []*entity.TenantModel
if modelTypeFilterBin != 0 {
for _, rec := range modelRecords {
@@ -1171,7 +1199,6 @@ func (m *ModelProviderService) ListTenantAddedModels(userID, ownerTenantID, mode
}
// Build model rank map from factory catalog (mirrors Python's model_rank_map).
providerManager := dao.GetModelProviderManager()
modelRankMap := make(map[string]int) // key: "providerName@modelName"
factoryRankMapping := make(map[string]int)
for i := range providerManager.Providers {

View File

@@ -450,10 +450,14 @@ func ptrStringValue(s *string) string {
}
func factoryModelTypeName(modelType string) string {
if modelType == "image2text" {
switch modelType {
case "image2text":
return "vision"
case "speech2text":
return "asr"
default:
return modelType
}
return modelType
}
// GetDefaultModelName returns the full default model ID for a tenant and model type
@@ -662,32 +666,32 @@ func (s *TenantService) ListTenantDefaultModels(userID string) ([]ModelItem, err
})
}
if ownedTenant.OCRID == "" {
return result, nil
if ownedTenant.OCRID != "" {
defaultOCRModelProvider, defaultOCRModelInstance, defaultOCRModelName, defaultOCRModelEnable, err := s.GetModelInfo(ownedTenant.TenantID, ownedTenant.OCRID, "ocr")
if err == nil {
result = append(result, ModelItem{
ModelProvider: defaultOCRModelProvider,
ModelInstance: defaultOCRModelInstance,
ModelName: defaultOCRModelName,
ModelID: ptrStringValue(ownedTenant.TenantOCRID),
ModelType: "ocr",
Enable: defaultOCRModelEnable,
})
}
}
defaultOCRModelProvider, defaultOCRModelInstance, defaultOCRModelName, defaultOCRModelEnable, err := s.GetModelInfo(ownedTenant.TenantID, ownedTenant.OCRID, "ocr")
if err == nil {
result = append(result, ModelItem{
ModelProvider: defaultOCRModelProvider,
ModelInstance: defaultOCRModelInstance,
ModelName: defaultOCRModelName,
ModelID: ptrStringValue(ownedTenant.TenantOCRID),
ModelType: "ocr",
Enable: defaultOCRModelEnable,
})
}
defaultTTSModelProvider, defaultTTSModelInstance, defaultTTSModelName, defaultTTSModelEnable, err := s.GetModelInfo(ownedTenant.TenantID, ownedTenant.TTSID, "tts")
if err == nil {
result = append(result, ModelItem{
ModelProvider: defaultTTSModelProvider,
ModelInstance: defaultTTSModelInstance,
ModelName: defaultTTSModelName,
ModelID: ptrStringValue(ownedTenant.TenantTTSID),
ModelType: "tts",
Enable: defaultTTSModelEnable,
})
if ownedTenant.TTSID != "" {
defaultTTSModelProvider, defaultTTSModelInstance, defaultTTSModelName, defaultTTSModelEnable, err := s.GetModelInfo(ownedTenant.TenantID, ownedTenant.TTSID, "tts")
if err == nil {
result = append(result, ModelItem{
ModelProvider: defaultTTSModelProvider,
ModelInstance: defaultTTSModelInstance,
ModelName: defaultTTSModelName,
ModelID: ptrStringValue(ownedTenant.TenantTTSID),
ModelType: "tts",
Enable: defaultTTSModelEnable,
})
}
}
return result, nil