Jelajahi Sumber

feat: 添加 openrouter-enterprise 支持

creamlike1024 5 bulan lalu
induk
melakukan
ee7ce5a476
2 mengubah file dengan 21 tambahan dan 1 penghapusan
  1. 14 1
      relay/channel/openai/relay-openai.go
  2. 7 0
      relay/channel/openrouter/dto.go

+ 14 - 1
relay/channel/openai/relay-openai.go

@@ -12,6 +12,7 @@ import (
 	"one-api/constant"
 	"one-api/constant"
 	"one-api/dto"
 	"one-api/dto"
 	"one-api/logger"
 	"one-api/logger"
+	"one-api/relay/channel/openrouter"
 	relaycommon "one-api/relay/common"
 	relaycommon "one-api/relay/common"
 	"one-api/relay/helper"
 	"one-api/relay/helper"
 	"one-api/service"
 	"one-api/service"
@@ -185,7 +186,19 @@ func OpenaiHandler(c *gin.Context, info *relaycommon.RelayInfo, resp *http.Respo
 	if common.DebugEnabled {
 	if common.DebugEnabled {
 		println("upstream response body:", string(responseBody))
 		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 {
 	if err != nil {
 		return nil, types.NewOpenAIError(err, types.ErrorCodeBadResponseBody, http.StatusInternalServerError)
 		return nil, types.NewOpenAIError(err, types.ErrorCodeBadResponseBody, http.StatusInternalServerError)
 	}
 	}

+ 7 - 0
relay/channel/openrouter/dto.go

@@ -1,5 +1,7 @@
 package openrouter
 package openrouter
 
 
+import "encoding/json"
+
 type RequestReasoning struct {
 type RequestReasoning struct {
 	// One of the following (not both):
 	// One of the following (not both):
 	Effort    string `json:"effort,omitempty"`     // Can be "high", "medium", or "low" (OpenAI-style)
 	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.
 	// Optional: Default is false. All models support this.
 	Exclude bool `json:"exclude,omitempty"` // Set to true to exclude reasoning tokens from response
 	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"`
+}