diff --git a/common/constants.go b/common/constants.go index 63c627bc..5bde1612 100644 --- a/common/constants.go +++ b/common/constants.go @@ -67,6 +67,7 @@ const ( ChannelTypeBaichuan ChannelTypeMinimax ChannelTypeMistral + ChannelTypeGroq ChannelTypeDummy ) @@ -101,6 +102,7 @@ var ChannelBaseURLs = []string{ "https://api.baichuan-ai.com", // 26 "https://api.minimax.chat", // 27 "https://api.mistral.ai", // 28 + "https://api.groq.com/openai", // 29 } const ( diff --git a/common/model-ratio.go b/common/model-ratio.go index ac0b37ad..9ff18ec2 100644 --- a/common/model-ratio.go +++ b/common/model-ratio.go @@ -125,6 +125,11 @@ var ModelRatio = map[string]float64{ "mistral-medium-latest": 2.7 / 1000 * USD, "mistral-large-latest": 8.0 / 1000 * USD, "mistral-embed": 0.1 / 1000 * USD, + // https://wow.groq.com/ + "llama2-70b-4096": 0.7 / 1000 * USD, + "llama2-7b-2048": 0.1 / 1000 * USD, + "mixtral-8x7b-32768": 0.27 / 1000 * USD, + "gemma-7b-it": 0.1 / 1000 * USD, } var CompletionRatio = map[string]float64{} @@ -209,7 +214,7 @@ func GetCompletionRatio(name string) float64 { return 2 } } - return 1.333333 + return 4.0 / 3.0 } if strings.HasPrefix(name, "gpt-4") { if strings.HasSuffix(name, "preview") { @@ -226,5 +231,9 @@ func GetCompletionRatio(name string) float64 { if strings.HasPrefix(name, "mistral-") { return 3 } + switch name { + case "llama2-70b-4096": + return 0.8 / 0.7 + } return 1 } diff --git a/controller/model.go b/controller/model.go index 0486634c..4c5476b4 100644 --- a/controller/model.go +++ b/controller/model.go @@ -4,11 +4,7 @@ import ( "fmt" "github.com/gin-gonic/gin" "github.com/songquanpeng/one-api/common" - "github.com/songquanpeng/one-api/relay/channel/ai360" - "github.com/songquanpeng/one-api/relay/channel/baichuan" - "github.com/songquanpeng/one-api/relay/channel/minimax" - "github.com/songquanpeng/one-api/relay/channel/mistral" - "github.com/songquanpeng/one-api/relay/channel/moonshot" + "github.com/songquanpeng/one-api/relay/channel/openai" "github.com/songquanpeng/one-api/relay/constant" "github.com/songquanpeng/one-api/relay/helper" relaymodel "github.com/songquanpeng/one-api/relay/model" @@ -83,60 +79,22 @@ func init() { }) } } - for _, modelName := range ai360.ModelList { - openAIModels = append(openAIModels, OpenAIModels{ - Id: modelName, - Object: "model", - Created: 1626777600, - OwnedBy: "360", - Permission: permission, - Root: modelName, - Parent: nil, - }) - } - for _, modelName := range moonshot.ModelList { - openAIModels = append(openAIModels, OpenAIModels{ - Id: modelName, - Object: "model", - Created: 1626777600, - OwnedBy: "moonshot", - Permission: permission, - Root: modelName, - Parent: nil, - }) - } - for _, modelName := range baichuan.ModelList { - openAIModels = append(openAIModels, OpenAIModels{ - Id: modelName, - Object: "model", - Created: 1626777600, - OwnedBy: "baichuan", - Permission: permission, - Root: modelName, - Parent: nil, - }) - } - for _, modelName := range minimax.ModelList { - openAIModels = append(openAIModels, OpenAIModels{ - Id: modelName, - Object: "model", - Created: 1626777600, - OwnedBy: "minimax", - Permission: permission, - Root: modelName, - Parent: nil, - }) - } - for _, modelName := range mistral.ModelList { - openAIModels = append(openAIModels, OpenAIModels{ - Id: modelName, - Object: "model", - Created: 1626777600, - OwnedBy: "mistralai", - Permission: permission, - Root: modelName, - Parent: nil, - }) + for _, channelType := range openai.CompatibleChannels { + if channelType == common.ChannelTypeAzure { + continue + } + channelName, channelModelList := openai.GetCompatibleChannelMeta(channelType) + for _, modelName := range channelModelList { + openAIModels = append(openAIModels, OpenAIModels{ + Id: modelName, + Object: "model", + Created: 1626777600, + OwnedBy: channelName, + Permission: permission, + Root: modelName, + Parent: nil, + }) + } } openAIModelsMap = make(map[string]OpenAIModels) for _, model := range openAIModels { diff --git a/relay/channel/groq/constants.go b/relay/channel/groq/constants.go new file mode 100644 index 00000000..fc9a9ebd --- /dev/null +++ b/relay/channel/groq/constants.go @@ -0,0 +1,10 @@ +package groq + +// https://console.groq.com/docs/models + +var ModelList = []string{ + "gemma-7b-it", + "llama2-7b-2048", + "llama2-70b-4096", + "mixtral-8x7b-32768", +} diff --git a/relay/channel/openai/adaptor.go b/relay/channel/openai/adaptor.go index 5a04a768..47594030 100644 --- a/relay/channel/openai/adaptor.go +++ b/relay/channel/openai/adaptor.go @@ -6,11 +6,7 @@ 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/baichuan" "github.com/songquanpeng/one-api/relay/channel/minimax" - "github.com/songquanpeng/one-api/relay/channel/mistral" - "github.com/songquanpeng/one-api/relay/channel/moonshot" "github.com/songquanpeng/one-api/relay/model" "github.com/songquanpeng/one-api/relay/util" "io" @@ -86,37 +82,11 @@ func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, meta *util.Rel } func (a *Adaptor) GetModelList() []string { - switch a.ChannelType { - case common.ChannelType360: - return ai360.ModelList - case common.ChannelTypeMoonshot: - return moonshot.ModelList - case common.ChannelTypeBaichuan: - return baichuan.ModelList - case common.ChannelTypeMinimax: - return minimax.ModelList - case common.ChannelTypeMistral: - return mistral.ModelList - default: - return ModelList - } + _, modelList := GetCompatibleChannelMeta(a.ChannelType) + return modelList } func (a *Adaptor) GetChannelName() string { - switch a.ChannelType { - case common.ChannelTypeAzure: - return "azure" - case common.ChannelType360: - return "360" - case common.ChannelTypeMoonshot: - return "moonshot" - case common.ChannelTypeBaichuan: - return "baichuan" - case common.ChannelTypeMinimax: - return "minimax" - case common.ChannelTypeMistral: - return "mistralai" - default: - return "openai" - } + channelName, _ := GetCompatibleChannelMeta(a.ChannelType) + return channelName } diff --git a/relay/channel/openai/compatible.go b/relay/channel/openai/compatible.go new file mode 100644 index 00000000..767eec4b --- /dev/null +++ b/relay/channel/openai/compatible.go @@ -0,0 +1,42 @@ +package openai + +import ( + "github.com/songquanpeng/one-api/common" + "github.com/songquanpeng/one-api/relay/channel/ai360" + "github.com/songquanpeng/one-api/relay/channel/baichuan" + "github.com/songquanpeng/one-api/relay/channel/groq" + "github.com/songquanpeng/one-api/relay/channel/minimax" + "github.com/songquanpeng/one-api/relay/channel/mistral" + "github.com/songquanpeng/one-api/relay/channel/moonshot" +) + +var CompatibleChannels = []int{ + common.ChannelTypeAzure, + common.ChannelType360, + common.ChannelTypeMoonshot, + common.ChannelTypeBaichuan, + common.ChannelTypeMinimax, + common.ChannelTypeMistral, + common.ChannelTypeGroq, +} + +func GetCompatibleChannelMeta(channelType int) (string, []string) { + switch channelType { + case common.ChannelTypeAzure: + return "azure", ModelList + case common.ChannelType360: + return "360", ai360.ModelList + case common.ChannelTypeMoonshot: + return "moonshot", moonshot.ModelList + case common.ChannelTypeBaichuan: + return "baichuan", baichuan.ModelList + case common.ChannelTypeMinimax: + return "minimax", minimax.ModelList + case common.ChannelTypeMistral: + return "mistralai", mistral.ModelList + case common.ChannelTypeGroq: + return "groq", groq.ModelList + default: + return "openai", ModelList + } +} diff --git a/web/berry/src/constants/ChannelConstants.js b/web/berry/src/constants/ChannelConstants.js index 31c45048..8e9fc97c 100644 --- a/web/berry/src/constants/ChannelConstants.js +++ b/web/berry/src/constants/ChannelConstants.js @@ -15,7 +15,7 @@ export const CHANNEL_OPTIONS = { key: 3, text: 'Azure OpenAI', value: 3, - color: 'orange' + color: 'secondary' }, 11: { key: 11, @@ -89,6 +89,12 @@ export const CHANNEL_OPTIONS = { value: 27, color: 'default' }, + 29: { + key: 29, + text: 'Groq', + value: 29, + color: 'default' + }, 8: { key: 8, text: '自定义渠道', diff --git a/web/berry/src/views/Channel/type/Config.js b/web/berry/src/views/Channel/type/Config.js index 4dec33de..897db189 100644 --- a/web/berry/src/views/Channel/type/Config.js +++ b/web/berry/src/views/Channel/type/Config.js @@ -163,6 +163,9 @@ const typeConfig = { }, modelGroup: "minimax", }, + 29: { + modelGroup: "groq", + }, }; export { defaultConfig, typeConfig }; diff --git a/web/default/src/constants/channel.constants.js b/web/default/src/constants/channel.constants.js index b21bb15d..f6db46c3 100644 --- a/web/default/src/constants/channel.constants.js +++ b/web/default/src/constants/channel.constants.js @@ -14,6 +14,7 @@ export const CHANNEL_OPTIONS = [ { key: 23, text: '腾讯混元', value: 23, color: 'teal' }, { key: 26, text: '百川大模型', value: 26, color: 'orange' }, { key: 27, text: 'MiniMax', value: 27, color: 'red' }, + { key: 29, text: 'Groq', value: 29, color: 'orange' }, { key: 8, text: '自定义渠道', value: 8, color: 'pink' }, { key: 22, text: '知识库:FastGPT', value: 22, color: 'blue' }, { key: 21, text: '知识库:AI Proxy', value: 21, color: 'purple' }, diff --git a/web/default/src/pages/Channel/EditChannel.js b/web/default/src/pages/Channel/EditChannel.js index 59cce0d4..fdd77be2 100644 --- a/web/default/src/pages/Channel/EditChannel.js +++ b/web/default/src/pages/Channel/EditChannel.js @@ -1,7 +1,7 @@ import React, { useEffect, useState } from 'react'; import { Button, Form, Header, Input, Message, Segment } from 'semantic-ui-react'; import { useNavigate, useParams } from 'react-router-dom'; -import { API, getChannelModels, showError, showInfo, showSuccess, verifyJSON } from '../../helpers'; +import { API, copy, getChannelModels, showError, showInfo, showSuccess, verifyJSON } from '../../helpers'; import { CHANNEL_OPTIONS } from '../../constants'; const MODEL_MAPPING_EXAMPLE = { @@ -342,6 +342,8 @@ const EditChannel = () => { required fluid multiple + search + onLabelClick={(e, { value }) => {copy(value).then()}} selection onChange={handleInputChange} value={inputs.models}