From 2acc2f50170ad03be1c7e49922b410ad9a90da71 Mon Sep 17 00:00:00 2001 From: JustSong Date: Sun, 18 Feb 2024 16:17:19 +0800 Subject: [PATCH] feat: support moonshot now (close #804) --- README.md | 3 ++ common/constants.go | 2 + common/model-ratio.go | 4 ++ controller/channel-test.go | 1 + controller/model.go | 49 +++++++------------ relay/channel/ai360/constants.go | 8 +++ relay/channel/aiproxy/adaptor.go | 4 ++ relay/channel/ali/adaptor.go | 4 ++ relay/channel/anthropic/adaptor.go | 4 ++ relay/channel/baidu/adaptor.go | 4 ++ relay/channel/gemini/adaptor.go | 4 ++ relay/channel/interface.go | 1 + relay/channel/moonshot/constants.go | 7 +++ relay/channel/openai/adaptor.go | 27 +++++++++- relay/channel/palm/adaptor.go | 4 ++ relay/channel/tencent/adaptor.go | 4 ++ relay/channel/xunfei/adaptor.go | 4 ++ relay/channel/zhipu/adaptor.go | 4 ++ web/berry/src/constants/ChannelConstants.js | 6 +++ .../src/constants/channel.constants.js | 1 + web/default/src/pages/Channel/EditChannel.js | 3 ++ 21 files changed, 114 insertions(+), 34 deletions(-) create mode 100644 relay/channel/ai360/constants.go create mode 100644 relay/channel/moonshot/constants.go diff --git a/README.md b/README.md index ff5e07d4..ff1fffd2 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,9 @@ _✨ 通过标准的 OpenAI API 格式访问所有的大模型,开箱即用 + [x] [智谱 ChatGLM 系列模型](https://bigmodel.cn) + [x] [360 智脑](https://ai.360.cn) + [x] [腾讯混元大模型](https://cloud.tencent.com/document/product/1729) + + [x] [Moonshot AI](https://platform.moonshot.cn/) + + [ ] [字节云雀大模型](https://www.volcengine.com/product/ark) (WIP) + + [ ] [MINIMAX](https://api.minimax.chat/) (WIP) 2. 支持配置镜像以及众多[第三方代理服务](https://iamazing.cn/page/openai-api-third-party-services)。 3. 支持通过**负载均衡**的方式访问多个渠道。 4. 支持 **stream 模式**,可以通过流式传输实现打字机效果。 diff --git a/common/constants.go b/common/constants.go index 31036685..ccaa3560 100644 --- a/common/constants.go +++ b/common/constants.go @@ -63,6 +63,7 @@ const ( ChannelTypeFastGPT = 22 ChannelTypeTencent = 23 ChannelTypeGemini = 24 + ChannelTypeMoonshot = 25 ) var ChannelBaseURLs = []string{ @@ -91,6 +92,7 @@ var ChannelBaseURLs = []string{ "https://fastgpt.run/api/openapi", // 22 "https://hunyuan.cloud.tencent.com", // 23 "https://generativelanguage.googleapis.com", // 24 + "https://api.moonshot.cn", // 25 } const ( diff --git a/common/model-ratio.go b/common/model-ratio.go index 81559be5..d6c6fbb6 100644 --- a/common/model-ratio.go +++ b/common/model-ratio.go @@ -119,6 +119,10 @@ var ModelRatio = map[string]float64{ "hunyuan": 7.143, // ¥0.1 / 1k tokens // https://cloud.tencent.com/document/product/1729/97731#e0e6be58-60c8-469f-bdeb-6c264ce3b4d0 "ChatStd": 0.01 * RMB, "ChatPro": 0.1 * RMB, + // https://platform.moonshot.cn/pricing + "moonshot-v1-8k": 0.012 * RMB, + "moonshot-v1-32k": 0.024 * RMB, + "moonshot-v1-128k": 0.06 * RMB, } func ModelRatio2JSONString() string { diff --git a/controller/channel-test.go b/controller/channel-test.go index 8b2bb40d..b498f4f1 100644 --- a/controller/channel-test.go +++ b/controller/channel-test.go @@ -57,6 +57,7 @@ func testChannel(channel *model.Channel) (err error, openaiErr *relaymodel.Error if adaptor == nil { return fmt.Errorf("invalid api type: %d, adaptor is nil", apiType), nil } + adaptor.Init(meta) modelName := adaptor.GetModelList()[0] request := buildTestRequest() request.Model = modelName diff --git a/controller/model.go b/controller/model.go index 6ad21eda..dbaed71a 100644 --- a/controller/model.go +++ b/controller/model.go @@ -3,6 +3,8 @@ package controller import ( "fmt" "github.com/gin-gonic/gin" + "github.com/songquanpeng/one-api/relay/channel/ai360" + "github.com/songquanpeng/one-api/relay/channel/moonshot" "github.com/songquanpeng/one-api/relay/constant" "github.com/songquanpeng/one-api/relay/helper" relaymodel "github.com/songquanpeng/one-api/relay/model" @@ -71,45 +73,28 @@ func init() { }) } } - // extra - openAIModels = append(openAIModels, []OpenAIModels{ - { - Id: "360GPT_S2_V9", + for _, modelName := range ai360.ModelList { + openAIModels = append(openAIModels, OpenAIModels{ + Id: modelName, Object: "model", - Created: 1677649963, + Created: 1626777600, OwnedBy: "360", Permission: permission, - Root: "360GPT_S2_V9", + Root: modelName, Parent: nil, - }, - { - Id: "embedding-bert-512-v1", + }) + } + for _, modelName := range moonshot.ModelList { + openAIModels = append(openAIModels, OpenAIModels{ + Id: modelName, Object: "model", - Created: 1677649963, - OwnedBy: "360", + Created: 1626777600, + OwnedBy: "moonshot", Permission: permission, - Root: "embedding-bert-512-v1", + Root: modelName, Parent: nil, - }, - { - Id: "embedding_s1_v1", - Object: "model", - Created: 1677649963, - OwnedBy: "360", - Permission: permission, - Root: "embedding_s1_v1", - Parent: nil, - }, - { - Id: "semantic_similarity_s1_v1", - Object: "model", - Created: 1677649963, - OwnedBy: "360", - Permission: permission, - Root: "semantic_similarity_s1_v1", - Parent: nil, - }, - }...) + }) + } openAIModelsMap = make(map[string]OpenAIModels) for _, model := range openAIModels { openAIModelsMap[model.Id] = model diff --git a/relay/channel/ai360/constants.go b/relay/channel/ai360/constants.go new file mode 100644 index 00000000..cfc3cb28 --- /dev/null +++ b/relay/channel/ai360/constants.go @@ -0,0 +1,8 @@ +package ai360 + +var ModelList = []string{ + "360GPT_S2_V9", + "embedding-bert-512-v1", + "embedding_s1_v1", + "semantic_similarity_s1_v1", +} diff --git a/relay/channel/aiproxy/adaptor.go b/relay/channel/aiproxy/adaptor.go index 34fd62f5..2b4e3022 100644 --- a/relay/channel/aiproxy/adaptor.go +++ b/relay/channel/aiproxy/adaptor.go @@ -15,6 +15,10 @@ import ( type Adaptor struct { } +func (a *Adaptor) Init(meta *util.RelayMeta) { + +} + func (a *Adaptor) GetRequestURL(meta *util.RelayMeta) (string, error) { return fmt.Sprintf("%s/api/library/ask", meta.BaseURL), nil } diff --git a/relay/channel/ali/adaptor.go b/relay/channel/ali/adaptor.go index f69c607e..6c6f433e 100644 --- a/relay/channel/ali/adaptor.go +++ b/relay/channel/ali/adaptor.go @@ -18,6 +18,10 @@ import ( type Adaptor struct { } +func (a *Adaptor) Init(meta *util.RelayMeta) { + +} + func (a *Adaptor) GetRequestURL(meta *util.RelayMeta) (string, error) { fullRequestURL := fmt.Sprintf("%s/api/v1/services/aigc/text-generation/generation", meta.BaseURL) if meta.Mode == constant.RelayModeEmbeddings { diff --git a/relay/channel/anthropic/adaptor.go b/relay/channel/anthropic/adaptor.go index b95516a8..4b873715 100644 --- a/relay/channel/anthropic/adaptor.go +++ b/relay/channel/anthropic/adaptor.go @@ -15,6 +15,10 @@ import ( type Adaptor struct { } +func (a *Adaptor) Init(meta *util.RelayMeta) { + +} + func (a *Adaptor) GetRequestURL(meta *util.RelayMeta) (string, error) { return fmt.Sprintf("%s/v1/complete", meta.BaseURL), nil } diff --git a/relay/channel/baidu/adaptor.go b/relay/channel/baidu/adaptor.go index afaf2393..d2d06ce0 100644 --- a/relay/channel/baidu/adaptor.go +++ b/relay/channel/baidu/adaptor.go @@ -14,6 +14,10 @@ import ( type Adaptor struct { } +func (a *Adaptor) Init(meta *util.RelayMeta) { + +} + func (a *Adaptor) GetRequestURL(meta *util.RelayMeta) (string, error) { // https://cloud.baidu.com/doc/WENXINWORKSHOP/s/clntwmv7t var fullRequestURL string diff --git a/relay/channel/gemini/adaptor.go b/relay/channel/gemini/adaptor.go index ef2935fd..f3305e5d 100644 --- a/relay/channel/gemini/adaptor.go +++ b/relay/channel/gemini/adaptor.go @@ -16,6 +16,10 @@ import ( type Adaptor struct { } +func (a *Adaptor) Init(meta *util.RelayMeta) { + +} + func (a *Adaptor) GetRequestURL(meta *util.RelayMeta) (string, error) { version := helper.AssignOrDefault(meta.APIVersion, "v1") action := "generateContent" diff --git a/relay/channel/interface.go b/relay/channel/interface.go index 2ecf2677..e25db83f 100644 --- a/relay/channel/interface.go +++ b/relay/channel/interface.go @@ -9,6 +9,7 @@ import ( ) type Adaptor interface { + Init(meta *util.RelayMeta) GetRequestURL(meta *util.RelayMeta) (string, error) SetupRequestHeader(c *gin.Context, req *http.Request, meta *util.RelayMeta) error ConvertRequest(c *gin.Context, relayMode int, request *model.GeneralOpenAIRequest) (any, error) diff --git a/relay/channel/moonshot/constants.go b/relay/channel/moonshot/constants.go new file mode 100644 index 00000000..1b86f0fa --- /dev/null +++ b/relay/channel/moonshot/constants.go @@ -0,0 +1,7 @@ +package moonshot + +var ModelList = []string{ + "moonshot-v1-8k", + "moonshot-v1-32k", + "moonshot-v1-128k", +} diff --git a/relay/channel/openai/adaptor.go b/relay/channel/openai/adaptor.go index 9af2e5c1..1313e317 100644 --- a/relay/channel/openai/adaptor.go +++ b/relay/channel/openai/adaptor.go @@ -6,6 +6,8 @@ import ( "github.com/gin-gonic/gin" "github.com/songquanpeng/one-api/common" "github.com/songquanpeng/one-api/relay/channel" + "github.com/songquanpeng/one-api/relay/channel/ai360" + "github.com/songquanpeng/one-api/relay/channel/moonshot" "github.com/songquanpeng/one-api/relay/model" "github.com/songquanpeng/one-api/relay/util" "io" @@ -14,6 +16,11 @@ import ( ) type Adaptor struct { + ChannelType int +} + +func (a *Adaptor) Init(meta *util.RelayMeta) { + a.ChannelType = meta.ChannelType } func (a *Adaptor) GetRequestURL(meta *util.RelayMeta) (string, error) { @@ -72,9 +79,25 @@ func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, meta *util.Rel } func (a *Adaptor) GetModelList() []string { - return ModelList + switch a.ChannelType { + case common.ChannelType360: + return ai360.ModelList + case common.ChannelTypeMoonshot: + return moonshot.ModelList + default: + return ModelList + } } func (a *Adaptor) GetChannelName() string { - return "openai" + switch a.ChannelType { + case common.ChannelTypeAzure: + return "azure" + case common.ChannelType360: + return "360" + case common.ChannelTypeMoonshot: + return "moonshot" + default: + return "openai" + } } diff --git a/relay/channel/palm/adaptor.go b/relay/channel/palm/adaptor.go index dfba56ff..efd0620c 100644 --- a/relay/channel/palm/adaptor.go +++ b/relay/channel/palm/adaptor.go @@ -15,6 +15,10 @@ import ( type Adaptor struct { } +func (a *Adaptor) Init(meta *util.RelayMeta) { + +} + func (a *Adaptor) GetRequestURL(meta *util.RelayMeta) (string, error) { return fmt.Sprintf("%s/v1beta2/models/chat-bison-001:generateMessage", meta.BaseURL), nil } diff --git a/relay/channel/tencent/adaptor.go b/relay/channel/tencent/adaptor.go index 4e99b3f0..f348674e 100644 --- a/relay/channel/tencent/adaptor.go +++ b/relay/channel/tencent/adaptor.go @@ -19,6 +19,10 @@ type Adaptor struct { Sign string } +func (a *Adaptor) Init(meta *util.RelayMeta) { + +} + func (a *Adaptor) GetRequestURL(meta *util.RelayMeta) (string, error) { return fmt.Sprintf("%s/hyllm/v1/chat/completions", meta.BaseURL), nil } diff --git a/relay/channel/xunfei/adaptor.go b/relay/channel/xunfei/adaptor.go index 8683fcf3..92d9d7d6 100644 --- a/relay/channel/xunfei/adaptor.go +++ b/relay/channel/xunfei/adaptor.go @@ -16,6 +16,10 @@ type Adaptor struct { request *model.GeneralOpenAIRequest } +func (a *Adaptor) Init(meta *util.RelayMeta) { + +} + func (a *Adaptor) GetRequestURL(meta *util.RelayMeta) (string, error) { return "", nil } diff --git a/relay/channel/zhipu/adaptor.go b/relay/channel/zhipu/adaptor.go index 3afbe5c6..7a822853 100644 --- a/relay/channel/zhipu/adaptor.go +++ b/relay/channel/zhipu/adaptor.go @@ -14,6 +14,10 @@ import ( type Adaptor struct { } +func (a *Adaptor) Init(meta *util.RelayMeta) { + +} + func (a *Adaptor) GetRequestURL(meta *util.RelayMeta) (string, error) { method := "invoke" if meta.IsStream { diff --git a/web/berry/src/constants/ChannelConstants.js b/web/berry/src/constants/ChannelConstants.js index 3ce27838..aeff5190 100644 --- a/web/berry/src/constants/ChannelConstants.js +++ b/web/berry/src/constants/ChannelConstants.js @@ -59,6 +59,12 @@ export const CHANNEL_OPTIONS = { value: 19, color: 'default' }, + 25: { + key: 25, + text: 'Moonshot AI', + value: 19, + color: 'default' + }, 23: { key: 23, text: '腾讯混元', diff --git a/web/default/src/constants/channel.constants.js b/web/default/src/constants/channel.constants.js index 264dbefb..16da1b97 100644 --- a/web/default/src/constants/channel.constants.js +++ b/web/default/src/constants/channel.constants.js @@ -9,6 +9,7 @@ export const CHANNEL_OPTIONS = [ { key: 18, text: '讯飞星火认知', value: 18, color: 'blue' }, { key: 16, text: '智谱 ChatGLM', value: 16, color: 'violet' }, { key: 19, text: '360 智脑', value: 19, color: 'blue' }, + { key: 25, text: 'Moonshot AI', value: 25, color: 'black' }, { key: 23, text: '腾讯混元', value: 23, color: 'teal' }, { key: 8, text: '自定义渠道', value: 8, color: 'pink' }, { key: 22, text: '知识库:FastGPT', value: 22, color: 'blue' }, diff --git a/web/default/src/pages/Channel/EditChannel.js b/web/default/src/pages/Channel/EditChannel.js index 0d4e114d..3bc5b8de 100644 --- a/web/default/src/pages/Channel/EditChannel.js +++ b/web/default/src/pages/Channel/EditChannel.js @@ -93,6 +93,9 @@ const EditChannel = () => { case 24: localModels = ['gemini-pro', 'gemini-pro-vision']; break; + case 25: + localModels = ['moonshot-v1-8k', 'moonshot-v1-32k', 'moonshot-v1-128k']; + break; } setInputs((inputs) => ({ ...inputs, models: localModels })); }