Jelajahi Sumber

feat: supper OpenRouter now (close #333, close #340)

JustSong 2 tahun lalu
induk
melakukan
56b5007379

+ 22 - 20
common/constants.go

@@ -154,26 +154,27 @@ const (
 )
 
 const (
-	ChannelTypeUnknown   = 0
-	ChannelTypeOpenAI    = 1
-	ChannelTypeAPI2D     = 2
-	ChannelTypeAzure     = 3
-	ChannelTypeCloseAI   = 4
-	ChannelTypeOpenAISB  = 5
-	ChannelTypeOpenAIMax = 6
-	ChannelTypeOhMyGPT   = 7
-	ChannelTypeCustom    = 8
-	ChannelTypeAILS      = 9
-	ChannelTypeAIProxy   = 10
-	ChannelTypePaLM      = 11
-	ChannelTypeAPI2GPT   = 12
-	ChannelTypeAIGC2D    = 13
-	ChannelTypeAnthropic = 14
-	ChannelTypeBaidu     = 15
-	ChannelTypeZhipu     = 16
-	ChannelTypeAli       = 17
-	ChannelTypeXunfei    = 18
-	ChannelType360       = 19
+	ChannelTypeUnknown    = 0
+	ChannelTypeOpenAI     = 1
+	ChannelTypeAPI2D      = 2
+	ChannelTypeAzure      = 3
+	ChannelTypeCloseAI    = 4
+	ChannelTypeOpenAISB   = 5
+	ChannelTypeOpenAIMax  = 6
+	ChannelTypeOhMyGPT    = 7
+	ChannelTypeCustom     = 8
+	ChannelTypeAILS       = 9
+	ChannelTypeAIProxy    = 10
+	ChannelTypePaLM       = 11
+	ChannelTypeAPI2GPT    = 12
+	ChannelTypeAIGC2D     = 13
+	ChannelTypeAnthropic  = 14
+	ChannelTypeBaidu      = 15
+	ChannelTypeZhipu      = 16
+	ChannelTypeAli        = 17
+	ChannelTypeXunfei     = 18
+	ChannelType360        = 19
+	ChannelTypeOpenRouter = 20
 )
 
 var ChannelBaseURLs = []string{
@@ -197,4 +198,5 @@ var ChannelBaseURLs = []string{
 	"https://dashscope.aliyuncs.com", // 17
 	"",                               // 18
 	"https://ai.360.cn",              // 19
+	"https://openrouter.ai/api",      // 20
 }

+ 4 - 0
controller/relay-text.go

@@ -282,6 +282,10 @@ func relayTextHelper(c *gin.Context, relayMode int) *OpenAIErrorWithStatusCode {
 				req.Header.Set("api-key", apiKey)
 			} else {
 				req.Header.Set("Authorization", c.Request.Header.Get("Authorization"))
+				if channelType == common.ChannelTypeOpenRouter {
+					req.Header.Set("HTTP-Referer", "https://github.com/songquanpeng/one-api")
+					req.Header.Set("X-Title", "One API")
+				}
 			}
 		case APITypeClaude:
 			req.Header.Set("x-api-key", apiKey)

+ 1 - 0
web/src/constants/channel.constants.js

@@ -9,6 +9,7 @@ export const CHANNEL_OPTIONS = [
   { key: 16, text: '智谱 ChatGLM', value: 16, color: 'violet' },
   { key: 19, text: '360 智脑', value: 19, color: 'blue' },
   { key: 8, text: '自定义渠道', value: 8, color: 'pink' },
+  { key: 20, text: '代理:OpenRouter', value: 20, color: 'black' },
   { key: 2, text: '代理:API2D', value: 2, color: 'blue' },
   { key: 5, text: '代理:OpenAI-SB', value: 5, color: 'brown' },
   { key: 7, text: '代理:OhMyGPT', value: 7, color: 'purple' },

+ 3 - 3
web/src/pages/Channel/EditChannel.js

@@ -1,6 +1,6 @@
 import React, { useEffect, useState } from 'react';
 import { Button, Form, Header, Input, Message, Segment } from 'semantic-ui-react';
-import { useParams, useNavigate } from 'react-router-dom';
+import { useNavigate, useParams } from 'react-router-dom';
 import { API, showError, showInfo, showSuccess, verifyJSON } from '../../helpers';
 import { CHANNEL_OPTIONS } from '../../constants';
 
@@ -19,7 +19,7 @@ const EditChannel = () => {
   const handleCancel = () => {
     navigate('/channel');
   };
-  
+
   const originInputs = {
     name: '',
     type: 1,
@@ -62,7 +62,7 @@ const EditChannel = () => {
           localModels = ['SparkDesk'];
           break;
         case 19:
-          localModels = ['360GPT_S2_V9', 'embedding-bert-512-v1', 'embedding_s1_v1', 'semantic_similarity_s1_v1', '360GPT_S2_V9.4']
+          localModels = ['360GPT_S2_V9', 'embedding-bert-512-v1', 'embedding_s1_v1', 'semantic_similarity_s1_v1', '360GPT_S2_V9.4'];
           break;
       }
       setInputs((inputs) => ({ ...inputs, models: localModels }));