From ee7ce5a476c2ff787325fcd94527e19130cec2d1 Mon Sep 17 00:00:00 2001 From: creamlike1024 Date: Sun, 28 Sep 2025 09:35:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20openrouter-enterpr?= =?UTF-8?q?ise=20=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- relay/channel/openai/relay-openai.go | 15 ++++++++++++++- relay/channel/openrouter/dto.go | 7 +++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/relay/channel/openai/relay-openai.go b/relay/channel/openai/relay-openai.go index 4b13a7df1..b8b120541 100644 --- a/relay/channel/openai/relay-openai.go +++ b/relay/channel/openai/relay-openai.go @@ -12,6 +12,7 @@ import ( "one-api/constant" "one-api/dto" "one-api/logger" + "one-api/relay/channel/openrouter" relaycommon "one-api/relay/common" "one-api/relay/helper" "one-api/service" @@ -185,7 +186,19 @@ func OpenaiHandler(c *gin.Context, info *relaycommon.RelayInfo, resp *http.Respo if common.DebugEnabled { println("upstream response body:", string(responseBody)) } - err = common.Unmarshal(responseBody, &simpleResponse) + // Unmarshal to simpleResponse + if info.ChannelType == constant.ChannelTypeOpenRouter { + // 尝试解析为 openrouter enterprise + var enterpriseResponse openrouter.OpenRouterEnterpriseResponse + if err2 := common.Unmarshal(responseBody, &enterpriseResponse); err2 == nil && enterpriseResponse.Data != nil { + err = common.Unmarshal(enterpriseResponse.Data, &simpleResponse) + } else { + // treat as normal openrouter + err = common.Unmarshal(responseBody, &simpleResponse) + } + } else { + err = common.Unmarshal(responseBody, &simpleResponse) + } if err != nil { return nil, types.NewOpenAIError(err, types.ErrorCodeBadResponseBody, http.StatusInternalServerError) } diff --git a/relay/channel/openrouter/dto.go b/relay/channel/openrouter/dto.go index 607f495bf..a32499852 100644 --- a/relay/channel/openrouter/dto.go +++ b/relay/channel/openrouter/dto.go @@ -1,5 +1,7 @@ package openrouter +import "encoding/json" + type RequestReasoning struct { // One of the following (not both): Effort string `json:"effort,omitempty"` // Can be "high", "medium", or "low" (OpenAI-style) @@ -7,3 +9,8 @@ type RequestReasoning struct { // Optional: Default is false. All models support this. Exclude bool `json:"exclude,omitempty"` // Set to true to exclude reasoning tokens from response } + +type OpenRouterEnterpriseResponse struct { + Data json.RawMessage `json:"data"` + Success bool `json:"success"` +}