diff --git a/relay/adaptor/gemini/constants.go b/relay/adaptor/gemini/constants.go index cbc2c82c..d220b25f 100644 --- a/relay/adaptor/gemini/constants.go +++ b/relay/adaptor/gemini/constants.go @@ -1,18 +1,12 @@ package gemini +import ( + "github.com/songquanpeng/one-api/relay/adaptor/geminiv2" +) + // https://ai.google.dev/models/gemini -var ModelList = []string{ - "gemini-pro", "gemini-1.0-pro", - // "gemma-2-2b-it", "gemma-2-9b-it", "gemma-2-27b-it", - "gemini-1.5-flash", "gemini-1.5-flash-8b", - "gemini-1.5-pro", "gemini-1.5-pro-experimental", - "text-embedding-004", "aqa", - "gemini-2.0-flash", "gemini-2.0-flash-exp", - "gemini-2.0-flash-lite-preview-02-05", - "gemini-2.0-flash-thinking-exp-01-21", - "gemini-2.0-pro-exp-02-05", -} +var ModelList = geminiv2.ModelList // ModelsSupportSystemInstruction is the list of models that support system instruction. // diff --git a/relay/adaptor/geminiv2/constants.go b/relay/adaptor/geminiv2/constants.go new file mode 100644 index 00000000..73e7ad7d --- /dev/null +++ b/relay/adaptor/geminiv2/constants.go @@ -0,0 +1,15 @@ +package geminiv2 + +// https://ai.google.dev/models/gemini + +var ModelList = []string{ + "gemini-pro", "gemini-1.0-pro", + // "gemma-2-2b-it", "gemma-2-9b-it", "gemma-2-27b-it", + "gemini-1.5-flash", "gemini-1.5-flash-8b", + "gemini-1.5-pro", "gemini-1.5-pro-experimental", + "text-embedding-004", "aqa", + "gemini-2.0-flash", "gemini-2.0-flash-exp", + "gemini-2.0-flash-lite-preview-02-05", + "gemini-2.0-flash-thinking-exp-01-21", + "gemini-2.0-pro-exp-02-05", +} diff --git a/relay/adaptor/geminiv2/main.go b/relay/adaptor/geminiv2/main.go new file mode 100644 index 00000000..fed7f3be --- /dev/null +++ b/relay/adaptor/geminiv2/main.go @@ -0,0 +1,14 @@ +package geminiv2 + +import ( + "fmt" + "strings" + + "github.com/songquanpeng/one-api/relay/meta" +) + +func GetRequestURL(meta *meta.Meta) (string, error) { + baseURL := strings.TrimSuffix(meta.BaseURL, "/") + requestPath := strings.TrimPrefix(meta.RequestURLPath, "/v1") + return fmt.Sprintf("%s%s", baseURL, requestPath), nil +} diff --git a/relay/adaptor/openai/adaptor.go b/relay/adaptor/openai/adaptor.go index 4eea25d4..8faf90a5 100644 --- a/relay/adaptor/openai/adaptor.go +++ b/relay/adaptor/openai/adaptor.go @@ -13,6 +13,7 @@ import ( "github.com/songquanpeng/one-api/relay/adaptor/alibailian" "github.com/songquanpeng/one-api/relay/adaptor/baiduv2" "github.com/songquanpeng/one-api/relay/adaptor/doubao" + "github.com/songquanpeng/one-api/relay/adaptor/geminiv2" "github.com/songquanpeng/one-api/relay/adaptor/minimax" "github.com/songquanpeng/one-api/relay/adaptor/novita" "github.com/songquanpeng/one-api/relay/channeltype" @@ -59,6 +60,8 @@ func (a *Adaptor) GetRequestURL(meta *meta.Meta) (string, error) { return baiduv2.GetRequestURL(meta) case channeltype.AliBailian: return alibailian.GetRequestURL(meta) + case channeltype.GeminiOpenAICompatible: + return geminiv2.GetRequestURL(meta) default: return GetFullRequestURL(meta.BaseURL, meta.RequestURLPath, meta.ChannelType), nil } diff --git a/relay/adaptor/openai/compatible.go b/relay/adaptor/openai/compatible.go index 36c22a74..955cb090 100644 --- a/relay/adaptor/openai/compatible.go +++ b/relay/adaptor/openai/compatible.go @@ -7,6 +7,7 @@ import ( "github.com/songquanpeng/one-api/relay/adaptor/baiduv2" "github.com/songquanpeng/one-api/relay/adaptor/deepseek" "github.com/songquanpeng/one-api/relay/adaptor/doubao" + "github.com/songquanpeng/one-api/relay/adaptor/geminiv2" "github.com/songquanpeng/one-api/relay/adaptor/groq" "github.com/songquanpeng/one-api/relay/adaptor/lingyiwanwu" "github.com/songquanpeng/one-api/relay/adaptor/minimax" @@ -82,6 +83,8 @@ func GetCompatibleChannelMeta(channelType int) (string, []string) { return "openrouter", openrouter.ModelList case channeltype.AliBailian: return "alibailian", alibailian.ModelList + case channeltype.GeminiOpenAICompatible: + return "geminiv2", geminiv2.ModelList default: return "openai", ModelList } diff --git a/relay/channeltype/define.go b/relay/channeltype/define.go index 87a3cbb8..f557d6c6 100644 --- a/relay/channeltype/define.go +++ b/relay/channeltype/define.go @@ -52,5 +52,6 @@ const ( XunfeiV2 AliBailian OpenAICompatible + GeminiOpenAICompatible Dummy ) diff --git a/relay/channeltype/url.go b/relay/channeltype/url.go index f2e41602..5a47a64e 100644 --- a/relay/channeltype/url.go +++ b/relay/channeltype/url.go @@ -52,6 +52,8 @@ var ChannelBaseURLs = []string{ "https://spark-api-open.xf-yun.com", // 48 "https://dashscope.aliyuncs.com", // 49 "", // 50 + + "https://generativelanguage.googleapis.com/v1beta/openai/", // 51 } func init() { diff --git a/web/default/src/constants/channel.constants.js b/web/default/src/constants/channel.constants.js index feb914a8..e1dd3b53 100644 --- a/web/default/src/constants/channel.constants.js +++ b/web/default/src/constants/channel.constants.js @@ -7,11 +7,18 @@ export const CHANNEL_OPTIONS = [ color: 'olive', description: 'OpenAI 兼容渠道,支持设置 Base URL', }, - { key: 14, text: 'Anthropic Claude', value: 14, color: 'black' }, + {key: 14, text: 'Anthropic', value: 14, color: 'black'}, { key: 33, text: 'AWS', value: 33, color: 'black' }, - { 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: 3, text: 'Azure', value: 3, color: 'olive'}, + {key: 11, text: 'PaLM2', value: 11, color: 'orange'}, + {key: 24, text: 'Gemini', value: 24, color: 'orange'}, + { + key: 51, + text: 'Gemini (OpenAI)', + value: 51, + color: 'orange', + description: 'Gemini OpenAI 兼容格式', + }, { key: 28, text: 'Mistral AI', value: 28, color: 'orange' }, { key: 41, text: 'Novita', value: 41, color: 'purple' }, {