diff --git a/common/constants.go b/common/constants.go index 62cad0db..4d8999c5 100644 --- a/common/constants.go +++ b/common/constants.go @@ -229,6 +229,7 @@ const ( ChannelTypeSiliconFlow = 40 ChannelTypeVertexAi = 41 ChannelTypeMistral = 42 + ChannelTypeDeepSeek = 43 ChannelTypeDummy // this one is only for count, do not add any channel after this @@ -254,7 +255,7 @@ var ChannelBaseURLs = []string{ "https://open.bigmodel.cn", // 16 "https://dashscope.aliyuncs.com", // 17 "", // 18 - "https://api.360.cn", // 19 + "https://api.360.cn", // 19 "https://openrouter.ai/api", // 20 "https://api.aiproxy.io", // 21 "https://fastgpt.run/api/openapi", // 22 @@ -278,4 +279,5 @@ var ChannelBaseURLs = []string{ "https://api.siliconflow.cn", //40 "", //41 "https://api.mistral.ai", //42 + "https://api.deepseek.com", //43 } diff --git a/relay/channel/deepseek/adaptor.go b/relay/channel/deepseek/adaptor.go new file mode 100644 index 00000000..cc94a58f --- /dev/null +++ b/relay/channel/deepseek/adaptor.go @@ -0,0 +1,71 @@ +package deepseek + +import ( + "errors" + "fmt" + "github.com/gin-gonic/gin" + "io" + "net/http" + "one-api/dto" + "one-api/relay/channel" + "one-api/relay/channel/openai" + relaycommon "one-api/relay/common" +) + +type Adaptor struct { +} + +func (a *Adaptor) ConvertAudioRequest(c *gin.Context, info *relaycommon.RelayInfo, request dto.AudioRequest) (io.Reader, error) { + //TODO implement me + return nil, errors.New("not implemented") +} + +func (a *Adaptor) ConvertImageRequest(c *gin.Context, info *relaycommon.RelayInfo, request dto.ImageRequest) (any, error) { + //TODO implement me + return nil, errors.New("not implemented") +} + +func (a *Adaptor) Init(info *relaycommon.RelayInfo) { +} + +func (a *Adaptor) GetRequestURL(info *relaycommon.RelayInfo) (string, error) { + return fmt.Sprintf("%s/chat/completions", info.BaseUrl), nil +} + +func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Header, info *relaycommon.RelayInfo) error { + channel.SetupApiRequestHeader(info, c, req) + req.Set("Authorization", "Bearer "+info.ApiKey) + return nil +} + +func (a *Adaptor) ConvertRequest(c *gin.Context, info *relaycommon.RelayInfo, request *dto.GeneralOpenAIRequest) (any, error) { + if request == nil { + return nil, errors.New("request is nil") + } + return request, nil +} + +func (a *Adaptor) ConvertRerankRequest(c *gin.Context, relayMode int, request dto.RerankRequest) (any, error) { + return nil, nil +} + +func (a *Adaptor) DoRequest(c *gin.Context, info *relaycommon.RelayInfo, requestBody io.Reader) (any, error) { + return channel.DoApiRequest(a, c, info, requestBody) +} + +func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, info *relaycommon.RelayInfo) (usage any, err *dto.OpenAIErrorWithStatusCode) { + if info.IsStream { + err, usage = openai.OaiStreamHandler(c, resp, info) + } else { + err, usage = openai.OpenaiHandler(c, resp, info.PromptTokens, info.UpstreamModelName) + } + return +} + +func (a *Adaptor) GetModelList() []string { + return ModelList +} + +func (a *Adaptor) GetChannelName() string { + return ChannelName +} diff --git a/relay/channel/deepseek/constants.go b/relay/channel/deepseek/constants.go new file mode 100644 index 00000000..b17c2c41 --- /dev/null +++ b/relay/channel/deepseek/constants.go @@ -0,0 +1,7 @@ +package deepseek + +var ModelList = []string{ + "deepseek-chat", "deepseek-coder", +} + +var ChannelName = "deepseek" diff --git a/relay/constant/api_type.go b/relay/constant/api_type.go index 4be09525..c5c1d089 100644 --- a/relay/constant/api_type.go +++ b/relay/constant/api_type.go @@ -26,6 +26,7 @@ const ( APITypeSiliconFlow APITypeVertexAi APITypeMistral + APITypeDeepSeek APITypeDummy // this one is only for count, do not add any channel after this ) @@ -75,6 +76,8 @@ func ChannelType2APIType(channelType int) (int, bool) { apiType = APITypeVertexAi case common.ChannelTypeMistral: apiType = APITypeMistral + case common.ChannelTypeDeepSeek: + apiType = APITypeDeepSeek } if apiType == -1 { return APITypeOpenAI, false diff --git a/relay/relay_adaptor.go b/relay/relay_adaptor.go index 5219c8f3..1c7d11e9 100644 --- a/relay/relay_adaptor.go +++ b/relay/relay_adaptor.go @@ -9,6 +9,7 @@ import ( "one-api/relay/channel/claude" "one-api/relay/channel/cloudflare" "one-api/relay/channel/cohere" + "one-api/relay/channel/deepseek" "one-api/relay/channel/dify" "one-api/relay/channel/gemini" "one-api/relay/channel/jina" @@ -71,6 +72,8 @@ func GetAdaptor(apiType int) channel.Adaptor { return &vertex.Adaptor{} case constant.APITypeMistral: return &mistral.Adaptor{} + case constant.APITypeDeepSeek: + return &deepseek.Adaptor{} } return nil } diff --git a/web/src/constants/channel.constants.js b/web/src/constants/channel.constants.js index 711edb68..32bf8bce 100644 --- a/web/src/constants/channel.constants.js +++ b/web/src/constants/channel.constants.js @@ -44,13 +44,6 @@ export const CHANNEL_OPTIONS = [ color: 'teal', label: 'Azure OpenAI' }, - { - key: 24, - text: 'Google Gemini', - value: 24, - color: 'orange', - label: 'Google Gemini' - }, { key: 34, text: 'Cohere', @@ -58,6 +51,8 @@ export const CHANNEL_OPTIONS = [ color: 'purple', label: 'Cohere' }, + { key: 39, text: 'Cloudflare', value: 39, color: 'grey', label: 'Cloudflare' }, + { key: 43, text: 'DeepSeek', value: 43, color: 'blue', label: 'DeepSeek' }, { key: 15, text: '百度文心千帆', @@ -93,6 +88,13 @@ export const CHANNEL_OPTIONS = [ color: 'purple', label: '智谱 GLM-4V' }, + { + key: 24, + text: 'Google Gemini', + value: 24, + color: 'orange', + label: 'Google Gemini' + }, { key: 11, text: 'Google PaLM2', @@ -100,7 +102,6 @@ export const CHANNEL_OPTIONS = [ color: 'orange', label: 'Google PaLM2' }, - { key: 39, text: 'Cloudflare', value: 39, color: 'grey', label: 'Cloudflare' }, { key: 25, text: 'Moonshot', value: 25, color: 'green', label: 'Moonshot' }, { key: 19, text: '360 智脑', value: 19, color: 'blue', label: '360 智脑' }, { key: 23, text: '腾讯混元', value: 23, color: 'teal', label: '腾讯混元' },