package helper import ( "errors" "fmt" rootcommon "github.com/QuantumNous/new-api/common" relaycommon "github.com/QuantumNous/new-api/relay/common" "github.com/QuantumNous/new-api/relaykit/dto" hostreasoning "github.com/QuantumNous/new-api/setting/reasoning" "github.com/gin-gonic/gin" ) func ModelMappedHelper(c *gin.Context, info *relaycommon.RelayInfo, request dto.Request) error { if info.ChannelMeta == nil { info.ChannelMeta = &relaycommon.ChannelMeta{} } // map model name modelMapping := c.GetString("model_mapping") if modelMapping != "" && modelMapping != "{}" { modelMap := make(map[string]string) err := rootcommon.Unmarshal([]byte(modelMapping), &modelMap) if err != nil { return fmt.Errorf("unmarshal_model_mapping_failed") } // 支持链式模型重定向,最终使用链尾的模型 currentModel := info.OriginModelName visitedModels := map[string]bool{ currentModel: true, } for { mappedModel, exists := modelMap[currentModel] baseModel := hostreasoning.BaseModelName(currentModel) if (!exists || mappedModel == "") && baseModel != currentModel { mappedModel, exists = modelMap[baseModel] } if exists && mappedModel != "" { // 模型重定向循环检测,避免无限循环 if visitedModels[mappedModel] { if mappedModel == currentModel { if currentModel == info.OriginModelName { info.IsModelMapped = false return nil } info.IsModelMapped = true break } return errors.New("model_mapping_contains_cycle") } visitedModels[mappedModel] = true currentModel = mappedModel info.IsModelMapped = true } else { break } } if info.IsModelMapped { info.UpstreamModelName = currentModel } } if err := mapImageGenerationResolution(info, request); err != nil { return err } if request != nil { request.SetModelName(info.UpstreamModelName) } return nil }