diff --git a/relay/channel/deepseek/adaptor.go b/relay/channel/deepseek/adaptor.go index 57c4c3ec..ff13efa4 100644 --- a/relay/channel/deepseek/adaptor.go +++ b/relay/channel/deepseek/adaptor.go @@ -68,6 +68,8 @@ func (a *Adaptor) GetRequestURL(info *relaycommon.RelayInfo) (string, error) { switch info.RelayMode { case constant.RelayModeCompletions: return fmt.Sprintf("%s/completions", fimBaseUrl), nil + case constant.RelayModeResponses: + return fmt.Sprintf("%s/responses", info.ChannelBaseUrl), nil default: return fmt.Sprintf("%s/v1/chat/completions", info.ChannelBaseUrl), nil } @@ -158,9 +160,33 @@ func (a *Adaptor) ConvertEmbeddingRequest(c *gin.Context, info *relaycommon.Rela return nil, errors.New("not implemented") } -func (a *Adaptor) ConvertOpenAIResponsesRequest(c *gin.Context, info *relaycommon.RelayInfo, request dto.OpenAIResponsesRequest) (any, error) { - // TODO implement me - return nil, errors.New("not implemented") +func (a *Adaptor) ConvertOpenAIResponsesRequest(_ *gin.Context, info *relaycommon.RelayInfo, request dto.OpenAIResponsesRequest) (any, error) { + applyDeepSeekV4ResponsesThinkingSuffix(info, &request) + return request, nil +} + +func applyDeepSeekV4ResponsesThinkingSuffix(info *relaycommon.RelayInfo, request *dto.OpenAIResponsesRequest) { + modelName := request.Model + if info != nil && info.ChannelMeta != nil && info.UpstreamModelName != "" { + modelName = info.UpstreamModelName + } + baseModel, thinkingType, effort, ok := reasoning.ParseDeepSeekV4ThinkingSuffix(modelName) + if ok { + if thinkingType == "disabled" { + effort = "none" + } + request.Model = baseModel + if request.Reasoning == nil { + request.Reasoning = &dto.Reasoning{} + } + request.Reasoning.Effort = effort + if info != nil && info.ChannelMeta != nil { + info.UpstreamModelName = baseModel + } + } + if info != nil && request.Reasoning != nil { + info.ReasoningEffort = request.Reasoning.Effort + } } func (a *Adaptor) DoRequest(c *gin.Context, info *relaycommon.RelayInfo, requestBody io.Reader) (any, error) {