diff --git a/README.md b/README.md index a92142ae..69bb10ef 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,7 @@ _✨ 通过标准的 OpenAI API 格式访问所有的大模型,开箱即用 + [x] [OpenAI ChatGPT 系列模型](https://platform.openai.com/docs/guides/gpt/chat-completions-api)(支持 [Azure OpenAI API](https://learn.microsoft.com/en-us/azure/ai-services/openai/reference)) + [x] [Anthropic Claude 系列模型](https://anthropic.com) + [x] [Google PaLM2/Gemini 系列模型](https://developers.generativeai.google) + + [x] [Mistral 系列模型](https://mistral.ai/) + [x] [百度文心一言系列模型](https://cloud.baidu.com/doc/WENXINWORKSHOP/index.html) + [x] [阿里通义千问系列模型](https://help.aliyun.com/document_detail/2400395.html) + [x] [讯飞星火认知大模型](https://www.xfyun.cn/doc/spark/Web.html) diff --git a/common/constants.go b/common/constants.go index f67dc146..ac901139 100644 --- a/common/constants.go +++ b/common/constants.go @@ -66,6 +66,7 @@ const ( ChannelTypeMoonshot = 25 ChannelTypeBaichuan = 26 ChannelTypeMinimax = 27 + ChannelTypeMistral = 28 ) var ChannelBaseURLs = []string{ @@ -97,6 +98,7 @@ var ChannelBaseURLs = []string{ "https://api.moonshot.cn", // 25 "https://api.baichuan-ai.com", // 26 "https://api.minimax.chat", // 27 + "https://api.mistral.ai", // 28 } const ( diff --git a/common/model-ratio.go b/common/model-ratio.go index ab0ad748..2e66ac0d 100644 --- a/common/model-ratio.go +++ b/common/model-ratio.go @@ -17,7 +17,6 @@ const ( // https://platform.openai.com/docs/models/model-endpoint-compatibility // https://cloud.baidu.com/doc/WENXINWORKSHOP/s/Blfmc9dlf // https://openai.com/pricing -// TODO: when a new api is enabled, check the pricing here // 1 === $0.002 / 1K tokens // 1 === ¥0.014 / 1k tokens var ModelRatio = map[string]float64{ @@ -116,15 +115,29 @@ var ModelRatio = map[string]float64{ "abab6-chat": 0.1 * RMB, "abab5.5-chat": 0.015 * RMB, "abab5.5s-chat": 0.005 * RMB, + // https://docs.mistral.ai/platform/pricing/ + "open-mistral-7b": 0.25 / 1000 * USD, + "open-mixtral-8x7b": 0.7 / 1000 * USD, + "mistral-small-latest": 2.0 / 1000 * USD, + "mistral-medium-latest": 2.7 / 1000 * USD, + "mistral-large-latest": 8.0 / 1000 * USD, + "mistral-embed": 0.1 / 1000 * USD, } +var CompletionRatio = map[string]float64{} + var DefaultModelRatio map[string]float64 +var DefaultCompletionRatio map[string]float64 func init() { DefaultModelRatio = make(map[string]float64) for k, v := range ModelRatio { DefaultModelRatio[k] = v } + DefaultCompletionRatio = make(map[string]float64) + for k, v := range CompletionRatio { + DefaultCompletionRatio[k] = v + } } func ModelRatio2JSONString() string { @@ -155,8 +168,6 @@ func GetModelRatio(name string) float64 { return ratio } -var CompletionRatio = map[string]float64{} - func CompletionRatio2JSONString() string { jsonBytes, err := json.Marshal(CompletionRatio) if err != nil { @@ -174,6 +185,9 @@ func GetCompletionRatio(name string) float64 { if ratio, ok := CompletionRatio[name]; ok { return ratio } + if ratio, ok := DefaultCompletionRatio[name]; ok { + return ratio + } if strings.HasPrefix(name, "gpt-3.5") { if strings.HasSuffix(name, "0125") { // https://openai.com/blog/new-embedding-models-and-api-updates @@ -206,5 +220,8 @@ func GetCompletionRatio(name string) float64 { if strings.HasPrefix(name, "claude-2") { return 2.965517 } + if strings.HasPrefix(name, "mistral-") { + return 3 + } return 1 } diff --git a/controller/model.go b/controller/model.go index 0f33f919..0d0d2658 100644 --- a/controller/model.go +++ b/controller/model.go @@ -6,6 +6,7 @@ import ( "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/constant" "github.com/songquanpeng/one-api/relay/helper" @@ -122,6 +123,17 @@ func init() { 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, + }) + } openAIModelsMap = make(map[string]OpenAIModels) for _, model := range openAIModels { openAIModelsMap[model.Id] = model diff --git a/relay/channel/mistral/constants.go b/relay/channel/mistral/constants.go new file mode 100644 index 00000000..cdb157f5 --- /dev/null +++ b/relay/channel/mistral/constants.go @@ -0,0 +1,10 @@ +package mistral + +var ModelList = []string{ + "open-mistral-7b", + "open-mixtral-8x7b", + "mistral-small-latest", + "mistral-medium-latest", + "mistral-large-latest", + "mistral-embed", +} diff --git a/relay/channel/openai/adaptor.go b/relay/channel/openai/adaptor.go index 27d0fc27..5a04a768 100644 --- a/relay/channel/openai/adaptor.go +++ b/relay/channel/openai/adaptor.go @@ -9,6 +9,7 @@ import ( "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" @@ -94,6 +95,8 @@ func (a *Adaptor) GetModelList() []string { return baichuan.ModelList case common.ChannelTypeMinimax: return minimax.ModelList + case common.ChannelTypeMistral: + return mistral.ModelList default: return ModelList } @@ -111,6 +114,8 @@ func (a *Adaptor) GetChannelName() string { return "baichuan" case common.ChannelTypeMinimax: return "minimax" + case common.ChannelTypeMistral: + return "mistralai" default: return "openai" } diff --git a/relay/controller/helper.go b/relay/controller/helper.go index d5078304..89fc69ce 100644 --- a/relay/controller/helper.go +++ b/relay/controller/helper.go @@ -172,10 +172,8 @@ func postConsumeQuota(ctx context.Context, usage *relaymodel.Usage, meta *util.R if err != nil { logger.Error(ctx, "error update user quota cache: "+err.Error()) } - if quota != 0 { - logContent := fmt.Sprintf("模型倍率 %.2f,分组倍率 %.2f,补全倍率 %.2f", modelRatio, groupRatio, completionRatio) - model.RecordConsumeLog(ctx, meta.UserId, meta.ChannelId, promptTokens, completionTokens, textRequest.Model, meta.TokenName, quota, logContent) - model.UpdateUserUsedQuotaAndRequestCount(meta.UserId, quota) - model.UpdateChannelUsedQuota(meta.ChannelId, quota) - } + logContent := fmt.Sprintf("模型倍率 %.2f,分组倍率 %.2f,补全倍率 %.2f", modelRatio, groupRatio, completionRatio) + model.RecordConsumeLog(ctx, meta.UserId, meta.ChannelId, promptTokens, completionTokens, textRequest.Model, meta.TokenName, quota, logContent) + model.UpdateUserUsedQuotaAndRequestCount(meta.UserId, quota) + model.UpdateChannelUsedQuota(meta.ChannelId, quota) } diff --git a/web/berry/src/constants/ChannelConstants.js b/web/berry/src/constants/ChannelConstants.js index 98ceaebf..31c45048 100644 --- a/web/berry/src/constants/ChannelConstants.js +++ b/web/berry/src/constants/ChannelConstants.js @@ -29,6 +29,12 @@ export const CHANNEL_OPTIONS = { value: 24, color: 'orange' }, + 28: { + key: 28, + text: 'Mistral AI', + value: 28, + color: 'orange' + }, 15: { key: 15, text: '百度文心千帆', diff --git a/web/default/src/constants/channel.constants.js b/web/default/src/constants/channel.constants.js index beb0adb1..b21bb15d 100644 --- a/web/default/src/constants/channel.constants.js +++ b/web/default/src/constants/channel.constants.js @@ -4,6 +4,7 @@ export const CHANNEL_OPTIONS = [ { key: 3, text: 'Azure OpenAI', value: 3, color: 'olive' }, { key: 11, text: 'Google PaLM2', value: 11, color: 'orange' }, { key: 24, text: 'Google Gemini', value: 24, color: 'orange' }, + { key: 28, text: 'Mistral AI', value: 28, color: 'orange' }, { key: 15, text: '百度文心千帆', value: 15, color: 'blue' }, { key: 17, text: '阿里通义千问', value: 17, color: 'orange' }, { key: 18, text: '讯飞星火认知', value: 18, color: 'blue' },