From 65ccfd084820c9bbb200fb83d71002f6692774a6 Mon Sep 17 00:00:00 2001 From: joey Date: Wed, 7 May 2025 16:00:35 +0800 Subject: [PATCH] feat: support model mapping chain #1033 --- relay/helper/model_mapped.go | 37 ++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/relay/helper/model_mapped.go b/relay/helper/model_mapped.go index 948c5226..9bf67c03 100644 --- a/relay/helper/model_mapped.go +++ b/relay/helper/model_mapped.go @@ -2,9 +2,11 @@ package helper import ( "encoding/json" + "errors" "fmt" - "github.com/gin-gonic/gin" "one-api/relay/common" + + "github.com/gin-gonic/gin" ) func ModelMappedHelper(c *gin.Context, info *common.RelayInfo) error { @@ -16,9 +18,36 @@ func ModelMappedHelper(c *gin.Context, info *common.RelayInfo) error { if err != nil { return fmt.Errorf("unmarshal_model_mapping_failed") } - if modelMap[info.OriginModelName] != "" { - info.UpstreamModelName = modelMap[info.OriginModelName] - info.IsModelMapped = true + + // 支持链式模型重定向,最终使用链尾的模型 + currentModel := info.OriginModelName + visitedModels := map[string]bool{ + currentModel: true, + } + for { + if mappedModel, exists := modelMap[currentModel]; exists && mappedModel != "" { + // 模型重定向循环检测,避免无限循环 + if visitedModels[mappedModel] { + if mappedModel == currentModel { + if currentModel == info.OriginModelName { + info.IsModelMapped = false + return nil + } else { + 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 } } return nil