diff --git a/relay/channel/openai/adaptor.go b/relay/channel/openai/adaptor.go index e1182523..3fd24665 100644 --- a/relay/channel/openai/adaptor.go +++ b/relay/channel/openai/adaptor.go @@ -201,19 +201,26 @@ func (a *Adaptor) SetupRequestHeader(c *gin.Context, header *http.Header, info * } } if info.RelayMode == relayconstant.RelayModeRealtime { + // OpenAI 已下线 Realtime Beta API,GA 模型收到 beta 标识会以 beta_api_shape_disabled 拒绝; + // 仅对遗留 preview 模型保留 beta 标识 + legacyRealtimeBeta := strings.Contains(info.UpstreamModelName, "-realtime-preview") swp := c.Request.Header.Get("Sec-WebSocket-Protocol") if swp != "" { items := []string{ "realtime", "openai-insecure-api-key." + info.ApiKey, - "openai-beta.realtime-v1", + } + if legacyRealtimeBeta { + items = append(items, "openai-beta.realtime-v1") } header.Set("Sec-WebSocket-Protocol", strings.Join(items, ",")) //req.Header.Set("Sec-WebSocket-Key", c.Request.Header.Get("Sec-WebSocket-Key")) //req.Header.Set("Sec-Websocket-Extensions", c.Request.Header.Get("Sec-Websocket-Extensions")) //req.Header.Set("Sec-Websocket-Version", c.Request.Header.Get("Sec-Websocket-Version")) } else { - header.Set("openai-beta", "realtime=v1") + if legacyRealtimeBeta { + header.Set("openai-beta", "realtime=v1") + } if !hasAuthOverride { header.Set("Authorization", "Bearer "+info.ApiKey) } diff --git a/relay/channel/openai/constant.go b/relay/channel/openai/constant.go index 14e3d442..6bf2cac1 100644 --- a/relay/channel/openai/constant.go +++ b/relay/channel/openai/constant.go @@ -58,6 +58,8 @@ var ModelList = []string{ "gpt-realtime", "gpt-realtime-2025-08-28", "gpt-realtime-mini", "gpt-realtime-mini-2025-10-06", "gpt-realtime-mini-2025-12-15", "gpt-realtime-1.5", + "gpt-realtime-2", "gpt-realtime-2.1", "gpt-realtime-2.1-mini", + "gpt-realtime-whisper", "gpt-realtime-translate", "text-embedding-ada-002", "text-embedding-3-small", "text-embedding-3-large", "text-curie-001", "text-babbage-001", "text-ada-001", "text-moderation-latest", "text-moderation-stable",