From e8966c73746d35bb7f4f014ad1195a96d445cacd Mon Sep 17 00:00:00 2001 From: Seefs Date: Fri, 10 Oct 2025 16:12:15 +0800 Subject: [PATCH] feat: pplx channel --- dto/openai_request.go | 6 ++++++ relay/channel/perplexity/adaptor.go | 14 +++++--------- relay/channel/perplexity/constants.go | 1 + relay/channel/perplexity/relay-perplexity.go | 19 +++++++++++++------ .../channels/modals/EditChannelModal.jsx | 2 +- web/src/constants/channel.constants.js | 5 +++++ web/src/helpers/render.jsx | 3 +++ 7 files changed, 34 insertions(+), 16 deletions(-) diff --git a/dto/openai_request.go b/dto/openai_request.go index dbdfad446..d477ee6c6 100644 --- a/dto/openai_request.go +++ b/dto/openai_request.go @@ -87,6 +87,12 @@ type GeneralOpenAIRequest struct { WebSearch json.RawMessage `json:"web_search,omitempty"` // doubao,zhipu_v4 THINKING json.RawMessage `json:"thinking,omitempty"` + // pplx Params + SearchDomainFilter json.RawMessage `json:"search_domain_filter,omitempty"` + SearchRecencyFilter string `json:"search_recency_filter,omitempty"` + ReturnImages bool `json:"return_images,omitempty"` + ReturnRelatedQuestions bool `json:"return_related_questions,omitempty"` + SearchMode string `json:"search_mode,omitempty"` } func (r *GeneralOpenAIRequest) GetTokenCountMeta() *types.TokenCountMeta { diff --git a/relay/channel/perplexity/adaptor.go b/relay/channel/perplexity/adaptor.go index 8ab9c8547..8a561bdec 100644 --- a/relay/channel/perplexity/adaptor.go +++ b/relay/channel/perplexity/adaptor.go @@ -22,10 +22,9 @@ func (a *Adaptor) ConvertGeminiRequest(*gin.Context, *relaycommon.RelayInfo, *dt return nil, errors.New("not implemented") } -func (a *Adaptor) ConvertClaudeRequest(*gin.Context, *relaycommon.RelayInfo, *dto.ClaudeRequest) (any, error) { - //TODO implement me - panic("implement me") - return nil, nil +func (a *Adaptor) ConvertClaudeRequest(c *gin.Context, info *relaycommon.RelayInfo, req *dto.ClaudeRequest) (any, error) { + adaptor := openai.Adaptor{} + return adaptor.ConvertClaudeRequest(c, info, req) } func (a *Adaptor) ConvertAudioRequest(c *gin.Context, info *relaycommon.RelayInfo, request dto.AudioRequest) (io.Reader, error) { @@ -80,11 +79,8 @@ func (a *Adaptor) DoRequest(c *gin.Context, info *relaycommon.RelayInfo, request } func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, info *relaycommon.RelayInfo) (usage any, err *types.NewAPIError) { - if info.IsStream { - usage, err = openai.OaiStreamHandler(c, info, resp) - } else { - usage, err = openai.OpenaiHandler(c, info, resp) - } + adaptor := openai.Adaptor{} + usage, err = adaptor.DoResponse(c, resp, info) return } diff --git a/relay/channel/perplexity/constants.go b/relay/channel/perplexity/constants.go index f9f030e09..d37c3b877 100644 --- a/relay/channel/perplexity/constants.go +++ b/relay/channel/perplexity/constants.go @@ -2,6 +2,7 @@ package perplexity var ModelList = []string{ "llama-3-sonar-small-32k-chat", "llama-3-sonar-small-32k-online", "llama-3-sonar-large-32k-chat", "llama-3-sonar-large-32k-online", "llama-3-8b-instruct", "llama-3-70b-instruct", "mixtral-8x7b-instruct", + "sonar", "sonar-pro", "sonar-reasoning", } var ChannelName = "perplexity" diff --git a/relay/channel/perplexity/relay-perplexity.go b/relay/channel/perplexity/relay-perplexity.go index 7ebadd0f9..d2119973c 100644 --- a/relay/channel/perplexity/relay-perplexity.go +++ b/relay/channel/perplexity/relay-perplexity.go @@ -11,11 +11,18 @@ func requestOpenAI2Perplexity(request dto.GeneralOpenAIRequest) *dto.GeneralOpen }) } return &dto.GeneralOpenAIRequest{ - Model: request.Model, - Stream: request.Stream, - Messages: messages, - Temperature: request.Temperature, - TopP: request.TopP, - MaxTokens: request.GetMaxTokens(), + Model: request.Model, + Stream: request.Stream, + Messages: messages, + Temperature: request.Temperature, + TopP: request.TopP, + MaxTokens: request.GetMaxTokens(), + FrequencyPenalty: request.FrequencyPenalty, + PresencePenalty: request.PresencePenalty, + SearchDomainFilter: request.SearchDomainFilter, + SearchRecencyFilter: request.SearchRecencyFilter, + ReturnImages: request.ReturnImages, + ReturnRelatedQuestions: request.ReturnRelatedQuestions, + SearchMode: request.SearchMode, } } diff --git a/web/src/components/table/channels/modals/EditChannelModal.jsx b/web/src/components/table/channels/modals/EditChannelModal.jsx index cce63340a..5fa990c0c 100644 --- a/web/src/components/table/channels/modals/EditChannelModal.jsx +++ b/web/src/components/table/channels/modals/EditChannelModal.jsx @@ -91,7 +91,7 @@ const REGION_EXAMPLE = { // 支持并且已适配通过接口获取模型列表的渠道类型 const MODEL_FETCHABLE_TYPES = new Set([ - 1, 4, 14, 34, 17, 26, 24, 47, 25, 20, 23, 31, 35, 40, 42, 48, 43, + 1, 4, 14, 34, 17, 26, 27, 24, 47, 25, 20, 23, 31, 35, 40, 42, 48, 43, ]); function type2secretPrompt(type) { diff --git a/web/src/constants/channel.constants.js b/web/src/constants/channel.constants.js index dc55f0342..e79e19f6a 100644 --- a/web/src/constants/channel.constants.js +++ b/web/src/constants/channel.constants.js @@ -88,6 +88,11 @@ export const CHANNEL_OPTIONS = [ color: 'purple', label: '智谱 GLM-4V', }, + { + value: 27, + color: 'blue', + label: 'Perplexity', + }, { value: 24, color: 'orange', diff --git a/web/src/helpers/render.jsx b/web/src/helpers/render.jsx index c22bdd782..1c3dda854 100644 --- a/web/src/helpers/render.jsx +++ b/web/src/helpers/render.jsx @@ -54,6 +54,7 @@ import { FastGPT, Kling, Jimeng, + Perplexity, } from '@lobehub/icons'; import { @@ -309,6 +310,8 @@ export function getChannelIcon(channelType) { return ; case 25: // Moonshot return ; + case 27: // Perplexity + return ; case 20: // OpenRouter return ; case 19: // 360 智脑