diff --git a/relay/channel/api_request.go b/relay/channel/api_request.go index 1ff1e2392..128e9453e 100644 --- a/relay/channel/api_request.go +++ b/relay/channel/api_request.go @@ -71,6 +71,12 @@ func DoApiRequest(a Adaptor, c *gin.Context, info *common.RelayInfo, requestBody return nil, fmt.Errorf("new request failed: %w", err) } headers := req.Header + err = a.SetupRequestHeader(c, &headers, info) + if err != nil { + return nil, fmt.Errorf("setup request header failed: %w", err) + } + // 在 SetupRequestHeader 之后应用 Header Override,确保用户设置优先级最高 + // 这样可以覆盖默认的 Authorization header 设置 headerOverride, err := processHeaderOverride(info) if err != nil { return nil, err @@ -78,10 +84,6 @@ func DoApiRequest(a Adaptor, c *gin.Context, info *common.RelayInfo, requestBody for key, value := range headerOverride { headers.Set(key, value) } - err = a.SetupRequestHeader(c, &headers, info) - if err != nil { - return nil, fmt.Errorf("setup request header failed: %w", err) - } resp, err := doRequest(c, req, info) if err != nil { return nil, fmt.Errorf("do request failed: %w", err) @@ -104,6 +106,12 @@ func DoFormRequest(a Adaptor, c *gin.Context, info *common.RelayInfo, requestBod // set form data req.Header.Set("Content-Type", c.Request.Header.Get("Content-Type")) headers := req.Header + err = a.SetupRequestHeader(c, &headers, info) + if err != nil { + return nil, fmt.Errorf("setup request header failed: %w", err) + } + // 在 SetupRequestHeader 之后应用 Header Override,确保用户设置优先级最高 + // 这样可以覆盖默认的 Authorization header 设置 headerOverride, err := processHeaderOverride(info) if err != nil { return nil, err @@ -111,10 +119,6 @@ func DoFormRequest(a Adaptor, c *gin.Context, info *common.RelayInfo, requestBod for key, value := range headerOverride { headers.Set(key, value) } - err = a.SetupRequestHeader(c, &headers, info) - if err != nil { - return nil, fmt.Errorf("setup request header failed: %w", err) - } resp, err := doRequest(c, req, info) if err != nil { return nil, fmt.Errorf("do request failed: %w", err) @@ -128,6 +132,12 @@ func DoWssRequest(a Adaptor, c *gin.Context, info *common.RelayInfo, requestBody return nil, fmt.Errorf("get request url failed: %w", err) } targetHeader := http.Header{} + err = a.SetupRequestHeader(c, &targetHeader, info) + if err != nil { + return nil, fmt.Errorf("setup request header failed: %w", err) + } + // 在 SetupRequestHeader 之后应用 Header Override,确保用户设置优先级最高 + // 这样可以覆盖默认的 Authorization header 设置 headerOverride, err := processHeaderOverride(info) if err != nil { return nil, err @@ -135,10 +145,6 @@ func DoWssRequest(a Adaptor, c *gin.Context, info *common.RelayInfo, requestBody for key, value := range headerOverride { targetHeader.Set(key, value) } - err = a.SetupRequestHeader(c, &targetHeader, info) - if err != nil { - return nil, fmt.Errorf("setup request header failed: %w", err) - } targetHeader.Set("Content-Type", c.Request.Header.Get("Content-Type")) targetConn, _, err := websocket.DefaultDialer.Dial(fullRequestURL, targetHeader) if err != nil { diff --git a/relay/channel/openai/adaptor.go b/relay/channel/openai/adaptor.go index f40f5da6d..f9a2e8ea8 100644 --- a/relay/channel/openai/adaptor.go +++ b/relay/channel/openai/adaptor.go @@ -184,9 +184,25 @@ func (a *Adaptor) SetupRequestHeader(c *gin.Context, header *http.Header, info * header.Set("api-key", info.ApiKey) return nil } + // 自定义渠道类型完全跳过默认 Authorization 设置,由 Header Override 控制 + if info.ChannelType == constant.ChannelTypeCustom { + // 自定义渠道不设置默认 Authorization,完全由 Header Override 控制 + return nil + } if info.ChannelType == constant.ChannelTypeOpenAI && "" != info.Organization { header.Set("OpenAI-Organization", info.Organization) } + // 检查 Header Override 是否已设置 Authorization,如果已设置则跳过默认设置 + // 这样可以避免在 Header Override 应用时被覆盖(虽然 Header Override 会在之后应用,但这里作为额外保护) + hasAuthOverride := false + if len(info.HeadersOverride) > 0 { + for k := range info.HeadersOverride { + if strings.EqualFold(k, "Authorization") { + hasAuthOverride = true + break + } + } + } if info.RelayMode == relayconstant.RelayModeRealtime { swp := c.Request.Header.Get("Sec-WebSocket-Protocol") if swp != "" { @@ -201,10 +217,14 @@ func (a *Adaptor) SetupRequestHeader(c *gin.Context, header *http.Header, info * //req.Header.Set("Sec-Websocket-Version", c.Request.Header.Get("Sec-Websocket-Version")) } else { header.Set("openai-beta", "realtime=v1") - header.Set("Authorization", "Bearer "+info.ApiKey) + if !hasAuthOverride { + header.Set("Authorization", "Bearer "+info.ApiKey) + } } } else { - header.Set("Authorization", "Bearer "+info.ApiKey) + if !hasAuthOverride { + header.Set("Authorization", "Bearer "+info.ApiKey) + } } if info.ChannelType == constant.ChannelTypeOpenRouter { header.Set("HTTP-Referer", "https://www.newapi.ai")