From f598b9df87a0c34a70d0150404cde213e7002891 Mon Sep 17 00:00:00 2001 From: JustSong Date: Sun, 18 Feb 2024 17:02:36 +0800 Subject: [PATCH] feat: add new SparkDesk models --- common/model-ratio.go | 4 ++ relay/channel/xunfei/constants.go | 4 ++ relay/channel/xunfei/main.go | 47 +++++++++++++++----- web/berry/src/views/Channel/type/Config.js | 8 +++- web/default/src/pages/Channel/EditChannel.js | 8 +++- 5 files changed, 58 insertions(+), 13 deletions(-) diff --git a/common/model-ratio.go b/common/model-ratio.go index d6c6fbb6..8326f143 100644 --- a/common/model-ratio.go +++ b/common/model-ratio.go @@ -112,6 +112,10 @@ var ModelRatio = map[string]float64{ "qwen-max-longcontext": 1.4286, // ¥0.02 / 1k tokens "text-embedding-v1": 0.05, // ¥0.0007 / 1k tokens "SparkDesk": 1.2858, // ¥0.018 / 1k tokens + "SparkDesk-v1.5": 1.2858, // ¥0.018 / 1k tokens + "SparkDesk-v2.0": 1.2858, // ¥0.018 / 1k tokens + "SparkDesk-v3.0": 1.2858, // ¥0.018 / 1k tokens + "SparkDesk-v3.5": 1.2858, // ¥0.018 / 1k tokens "360GPT_S2_V9": 0.8572, // ¥0.012 / 1k tokens "embedding-bert-512-v1": 0.0715, // ¥0.001 / 1k tokens "embedding_s1_v1": 0.0715, // ¥0.001 / 1k tokens diff --git a/relay/channel/xunfei/constants.go b/relay/channel/xunfei/constants.go index 41846c41..424de606 100644 --- a/relay/channel/xunfei/constants.go +++ b/relay/channel/xunfei/constants.go @@ -2,4 +2,8 @@ package xunfei var ModelList = []string{ "SparkDesk", + "SparkDesk-v1.5", + "SparkDesk-v2.0", + "SparkDesk-v3.0", + "SparkDesk-v3.5", } diff --git a/relay/channel/xunfei/main.go b/relay/channel/xunfei/main.go index 4a777075..d064b11d 100644 --- a/relay/channel/xunfei/main.go +++ b/relay/channel/xunfei/main.go @@ -127,7 +127,7 @@ func buildXunfeiAuthUrl(hostUrl string, apiKey, apiSecret string) string { } func StreamHandler(c *gin.Context, textRequest model.GeneralOpenAIRequest, appId string, apiSecret string, apiKey string) (*model.ErrorWithStatusCode, *model.Usage) { - domain, authUrl := getXunfeiAuthUrl(c, apiKey, apiSecret) + domain, authUrl := getXunfeiAuthUrl(c, apiKey, apiSecret, textRequest.Model) dataChan, stopChan, err := xunfeiMakeRequest(textRequest, domain, authUrl, appId) if err != nil { return openai.ErrorWrapper(err, "make xunfei request err", http.StatusInternalServerError), nil @@ -157,7 +157,7 @@ func StreamHandler(c *gin.Context, textRequest model.GeneralOpenAIRequest, appId } func Handler(c *gin.Context, textRequest model.GeneralOpenAIRequest, appId string, apiSecret string, apiKey string) (*model.ErrorWithStatusCode, *model.Usage) { - domain, authUrl := getXunfeiAuthUrl(c, apiKey, apiSecret) + domain, authUrl := getXunfeiAuthUrl(c, apiKey, apiSecret, textRequest.Model) dataChan, stopChan, err := xunfeiMakeRequest(textRequest, domain, authUrl, appId) if err != nil { return openai.ErrorWrapper(err, "make xunfei request err", http.StatusInternalServerError), nil @@ -242,20 +242,45 @@ func xunfeiMakeRequest(textRequest model.GeneralOpenAIRequest, domain, authUrl, return dataChan, stopChan, nil } -func getXunfeiAuthUrl(c *gin.Context, apiKey string, apiSecret string) (string, string) { +func getAPIVersion(c *gin.Context, modelName string) string { query := c.Request.URL.Query() apiVersion := query.Get("api-version") - if apiVersion == "" { - apiVersion = c.GetString(common.ConfigKeyAPIVersion) + if apiVersion != "" { + return apiVersion } - if apiVersion == "" { - apiVersion = "v1.1" - logger.SysLog("api_version not found, use default: " + apiVersion) + parts := strings.Split(modelName, "-") + if len(parts) == 2 { + apiVersion = parts[1] + return apiVersion + } - domain := "general" - if apiVersion != "v1.1" { - domain += strings.Split(apiVersion, ".")[0] + apiVersion = c.GetString(common.ConfigKeyAPIVersion) + if apiVersion != "" { + return apiVersion } + apiVersion = "v1.1" + logger.SysLog("api_version not found, using default: " + apiVersion) + return apiVersion +} + +// https://www.xfyun.cn/doc/spark/Web.html#_1-%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E +func apiVersion2domain(apiVersion string) string { + switch apiVersion { + case "v1.1": + return "general" + case "v2.1": + return "generalv2" + case "v3.1": + return "generalv3" + case "v3.5": + return "generalv3.5" + } + return "general" + apiVersion +} + +func getXunfeiAuthUrl(c *gin.Context, apiKey string, apiSecret string, modelName string) (string, string) { + apiVersion := getAPIVersion(c, modelName) + domain := apiVersion2domain(apiVersion) authUrl := buildXunfeiAuthUrl(fmt.Sprintf("wss://spark-api.xf-yun.com/%s/chat", apiVersion), apiKey, apiSecret) return domain, authUrl } diff --git a/web/berry/src/views/Channel/type/Config.js b/web/berry/src/views/Channel/type/Config.js index d270f527..462ad926 100644 --- a/web/berry/src/views/Channel/type/Config.js +++ b/web/berry/src/views/Channel/type/Config.js @@ -94,7 +94,13 @@ const typeConfig = { other: "版本号", }, input: { - models: ["SparkDesk"], + models: [ + "SparkDesk", + "SparkDesk-v1.5", + "SparkDesk-v2.0", + "SparkDesk-v3.0", + "SparkDesk-v3.5" + ], }, prompt: { key: "按照如下格式输入:APPID|APISecret|APIKey", diff --git a/web/default/src/pages/Channel/EditChannel.js b/web/default/src/pages/Channel/EditChannel.js index 3bc5b8de..c0bf260d 100644 --- a/web/default/src/pages/Channel/EditChannel.js +++ b/web/default/src/pages/Channel/EditChannel.js @@ -82,7 +82,13 @@ const EditChannel = () => { localModels = ['chatglm_turbo', 'chatglm_pro', 'chatglm_std', 'chatglm_lite']; break; case 18: - localModels = ['SparkDesk']; + localModels = [ + 'SparkDesk', + 'SparkDesk-v1.5', + 'SparkDesk-v2.0', + 'SparkDesk-v3.0', + 'SparkDesk-v3.5' + ]; break; case 19: localModels = ['360GPT_S2_V9', 'embedding-bert-512-v1', 'embedding_s1_v1', 'semantic_similarity_s1_v1'];