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 智脑