Bläddra i källkod

feat: support set proxy for channel OpenAI (close #139)

JustSong 2 år sedan
förälder
incheckning
8901f03864
5 ändrade filer med 25 tillägg och 7 borttagningar
  1. 2 2
      README.md
  2. 2 0
      controller/channel-test.go
  3. 4 0
      controller/relay.go
  4. 3 5
      middleware/distributor.go
  5. 14 0
      web/src/pages/Channel/EditChannel.js

+ 2 - 2
README.md

@@ -50,7 +50,7 @@ _✨ All in one 的 OpenAI 接口,整合各种 API 访问方式,开箱即用
 
 ## 功能
 1. 支持多种 API 访问渠道,欢迎 PR 或提 issue 添加更多渠道:
-   + [x] OpenAI 官方通道
+   + [x] OpenAI 官方通道(支持配置代理)
    + [x] **Azure OpenAI API**
    + [x] [API2D](https://api2d.com/r/197971)
    + [x] [OhMyGPT](https://aigptx.top?aff=uFpUl2Kf)
@@ -59,7 +59,7 @@ _✨ All in one 的 OpenAI 接口,整合各种 API 访问方式,开箱即用
    + [x] [OpenAI Max](https://openaimax.com)
    + [x] [OpenAI-SB](https://openai-sb.com)
    + [x] [CloseAI](https://console.openai-asia.com/r/2412)
-   + [x] 自定义渠道:例如使用自行搭建的 OpenAI 代理
+   + [x] 自定义渠道:例如各种未收录的第三方代理服务
 2. 支持通过**负载均衡**的方式访问多个渠道。
 3. 支持 **stream 模式**,可以通过流式传输实现打字机效果。
 4. 支持**多机部署**,[详见此处](#多机部署)。

+ 2 - 0
controller/channel-test.go

@@ -27,6 +27,8 @@ func testChannel(channel *model.Channel, request *ChatRequest) error {
 	} else {
 		if channel.Type == common.ChannelTypeCustom {
 			requestURL = channel.BaseURL
+		} else if channel.Type == common.ChannelTypeOpenAI && channel.BaseURL != "" {
+			requestURL = channel.BaseURL
 		}
 		requestURL += "/v1/chat/completions"
 	}

+ 4 - 0
controller/relay.go

@@ -147,6 +147,10 @@ func relayHelper(c *gin.Context, relayMode int) *OpenAIErrorWithStatusCode {
 	requestURL := c.Request.URL.String()
 	if channelType == common.ChannelTypeCustom {
 		baseURL = c.GetString("base_url")
+	} else if channelType == common.ChannelTypeOpenAI {
+		if c.GetString("base_url") != "" {
+			baseURL = c.GetString("base_url")
+		}
 	}
 	fullRequestURL := fmt.Sprintf("%s%s", baseURL, requestURL)
 	if channelType == common.ChannelTypeAzure {

+ 3 - 5
middleware/distributor.go

@@ -82,11 +82,9 @@ func Distribute() func(c *gin.Context) {
 		c.Set("channel_id", channel.Id)
 		c.Set("channel_name", channel.Name)
 		c.Request.Header.Set("Authorization", fmt.Sprintf("Bearer %s", channel.Key))
-		if channel.Type == common.ChannelTypeCustom || channel.Type == common.ChannelTypeAzure {
-			c.Set("base_url", channel.BaseURL)
-			if channel.Type == common.ChannelTypeAzure {
-				c.Set("api_version", channel.Other)
-			}
+		c.Set("base_url", channel.BaseURL)
+		if channel.Type == common.ChannelTypeAzure {
+			c.Set("api_version", channel.Other)
 		}
 		c.Next()
 	}

+ 14 - 0
web/src/pages/Channel/EditChannel.js

@@ -198,6 +198,20 @@ const EditChannel = () => {
               handleInputChange(null, { name: 'models', value: fullModels });
             }}>填入所有模型</Button>
           </div>
+          {
+            inputs.type === 1 && (
+              <Form.Field>
+                <Form.Input
+                  label='代理'
+                  name='base_url'
+                  placeholder={'请输入 OpenAI API 代理地址,如果不需要请留空,格式为:https://api.openai.com'}
+                  onChange={handleInputChange}
+                  value={inputs.base_url}
+                  autoComplete='new-password'
+                />
+              </Form.Field>
+            )
+          }
           {
             batch ? <Form.Field>
               <Form.TextArea