diff --git a/dto/openai_request.go b/dto/openai_request.go index a6567542..aa4f1962 100644 --- a/dto/openai_request.go +++ b/dto/openai_request.go @@ -55,6 +55,7 @@ type GeneralOpenAIRequest struct { EnableThinking any `json:"enable_thinking,omitempty"` // ali THINKING json.RawMessage `json:"thinking,omitempty"` // doubao ExtraBody json.RawMessage `json:"extra_body,omitempty"` + SearchParameters any `json:"search_parameters,omitempty"` //xai WebSearchOptions *WebSearchOptions `json:"web_search_options,omitempty"` // OpenRouter Params Usage json.RawMessage `json:"usage,omitempty"` diff --git a/relay/channel/xai/adaptor.go b/relay/channel/xai/adaptor.go index b5896415..17747dd5 100644 --- a/relay/channel/xai/adaptor.go +++ b/relay/channel/xai/adaptor.go @@ -56,6 +56,15 @@ func (a *Adaptor) ConvertOpenAIRequest(c *gin.Context, info *relaycommon.RelayIn if request == nil { return nil, errors.New("request is nil") } + if strings.HasSuffix(info.UpstreamModelName, "-search") { + info.UpstreamModelName = strings.TrimSuffix(info.UpstreamModelName, "-search") + request.Model = info.UpstreamModelName + toMap := request.ToMap() + toMap["search_parameters"] = map[string]any{ + "mode": "on", + } + return toMap, nil + } if strings.HasPrefix(request.Model, "grok-3-mini") { if request.MaxCompletionTokens == 0 && request.MaxTokens != 0 { request.MaxCompletionTokens = request.MaxTokens diff --git a/relay/channel/xai/constants.go b/relay/channel/xai/constants.go index 685fe3bb..311b4bb6 100644 --- a/relay/channel/xai/constants.go +++ b/relay/channel/xai/constants.go @@ -1,6 +1,8 @@ package xai var ModelList = []string{ + // grok-4 + "grok-4", "grok-4-0709", "grok-4-0709-search", // grok-3 "grok-3-beta", "grok-3-mini-beta", // grok-3 mini