From c7498b768ca427ce10bf11b9b192a688b1974e33 Mon Sep 17 00:00:00 2001 From: CaIon Date: Sun, 10 Aug 2025 21:09:16 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E2=9C=A8=20feat:=20Update=20Azure=20respon?= =?UTF-8?q?ses=20API=20version=20handling=20in=20adaptor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- relay/channel/openai/adaptor.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/relay/channel/openai/adaptor.go b/relay/channel/openai/adaptor.go index e6b551b6..2a7193bc 100644 --- a/relay/channel/openai/adaptor.go +++ b/relay/channel/openai/adaptor.go @@ -129,10 +129,18 @@ func (a *Adaptor) GetRequestURL(info *relaycommon.RelayInfo) (string, error) { // 特殊处理 responses API if info.RelayMode == relayconstant.RelayModeResponses { responsesApiVersion := "preview" + + subUrl := "/openai/v1/responses" + if strings.Contains(info.BaseUrl, "cognitiveservices.azure.com") { + subUrl = "/openai/responses" + responsesApiVersion = apiVersion + } + if info.ChannelOtherSettings.AzureResponsesVersion != "" { responsesApiVersion = info.ChannelOtherSettings.AzureResponsesVersion } - requestURL = fmt.Sprintf("/openai/v1/responses?api-version=%s", responsesApiVersion) + + requestURL = fmt.Sprintf("%s?api-version=%s", subUrl, responsesApiVersion) return relaycommon.GetFullRequestURL(info.BaseUrl, requestURL, info.ChannelType), nil } From dddf772f190a4fbc735c12a0b50b92b5c20cb171 Mon Sep 17 00:00:00 2001 From: CaIon Date: Mon, 11 Aug 2025 17:17:56 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E2=9C=A8=20feat:=20Update=20request=20URL?= =?UTF-8?q?=20handling=20for=20Claude=20relay=20format=20in=20adaptor=20#1?= =?UTF-8?q?557?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- relay/channel/openai/adaptor.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/relay/channel/openai/adaptor.go b/relay/channel/openai/adaptor.go index 2a7193bc..86461426 100644 --- a/relay/channel/openai/adaptor.go +++ b/relay/channel/openai/adaptor.go @@ -126,6 +126,11 @@ func (a *Adaptor) GetRequestURL(info *relaycommon.RelayInfo) (string, error) { requestURL = fmt.Sprintf("%s?api-version=%s", requestURL, apiVersion) task := strings.TrimPrefix(requestURL, "/v1/") + if info.RelayFormat == relaycommon.RelayFormatClaude { + task = strings.TrimPrefix(task, "messages") + task = "chat/completions" + task + } + // 特殊处理 responses API if info.RelayMode == relayconstant.RelayModeResponses { responsesApiVersion := "preview" From 53fa7255ec3843c972aa83d3b404a1893687d674 Mon Sep 17 00:00:00 2001 From: CaIon Date: Mon, 11 Aug 2025 17:32:58 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E2=9C=A8=20feat:=20Refactor=20model=20hand?= =?UTF-8?q?ling=20to=20use=20UpstreamModelName=20for=20request=20processin?= =?UTF-8?q?g?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- relay/channel/openai/adaptor.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/relay/channel/openai/adaptor.go b/relay/channel/openai/adaptor.go index 86461426..4c7ba60e 100644 --- a/relay/channel/openai/adaptor.go +++ b/relay/channel/openai/adaptor.go @@ -256,34 +256,34 @@ func (a *Adaptor) ConvertOpenAIRequest(c *gin.Context, info *relaycommon.RelayIn } } } - if strings.HasPrefix(request.Model, "o") || strings.HasPrefix(request.Model, "gpt-5") { + if strings.HasPrefix(info.UpstreamModelName, "o") || strings.HasPrefix(info.UpstreamModelName, "gpt-5") { if request.MaxCompletionTokens == 0 && request.MaxTokens != 0 { request.MaxCompletionTokens = request.MaxTokens request.MaxTokens = 0 } - if strings.HasPrefix(request.Model, "o") { + if strings.HasPrefix(info.UpstreamModelName, "o") { request.Temperature = nil } - if strings.HasPrefix(request.Model, "gpt-5") { - if request.Model != "gpt-5-chat-latest" { + if strings.HasPrefix(info.UpstreamModelName, "gpt-5") { + if info.UpstreamModelName != "gpt-5-chat-latest" { request.Temperature = nil } } // 转换模型推理力度后缀 - effort, originModel := parseReasoningEffortFromModelSuffix(request.Model) + effort, originModel := parseReasoningEffortFromModelSuffix(info.UpstreamModelName) if effort != "" { request.ReasoningEffort = effort + info.UpstreamModelName = originModel request.Model = originModel } info.ReasoningEffort = request.ReasoningEffort - info.UpstreamModelName = request.Model // o系列模型developer适配(o1-mini除外) - if !strings.HasPrefix(request.Model, "o1-mini") && !strings.HasPrefix(request.Model, "o1-preview") { + if !strings.HasPrefix(info.UpstreamModelName, "o1-mini") && !strings.HasPrefix(info.UpstreamModelName, "o1-preview") { //修改第一个Message的内容,将system改为developer if len(request.Messages) > 0 && request.Messages[0].Role == "system" { request.Messages[0].Role = "developer"