Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
new-api
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
5c8af189
authored
Feb 02, 2025
by
1808837298@qq.com
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: support channel request proxy
parent
c81e23b0
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
90 additions
and
7 deletions
+90
-7
constant/channel_setting.go
+1
-0
docs/channel/orher_setting.md
+29
-0
relay/channel/api_request.go
+15
-5
service/http_client.go
+45
-0
web/src/pages/Channel/EditChannel.js
+0
-2
No files found.
constant/channel_setting.go
View file @
5c8af189
...
@@ -2,4 +2,5 @@ package constant
...
@@ -2,4 +2,5 @@ package constant
var
(
var
(
ForceFormat
=
"force_format"
// ForceFormat 强制格式化为OpenAI格式
ForceFormat
=
"force_format"
// ForceFormat 强制格式化为OpenAI格式
ChanelSettingProxy
=
"proxy"
// Proxy 代理
)
)
docs/channel/orher_setting.md
0 → 100644
View file @
5c8af189
# 渠道而外设置说明
该配置用于设置一些额外的渠道参数,可以通过 JSON 对象进行配置。主要包含以下两个设置项:
1.
force_format
-
用于标识是否对数据进行强制格式化为 OpenAI 格式
-
类型为布尔值,设置为 true 时启用强制格式化
2.
proxy
-
用于配置网络代理
-
类型为字符串,填写代理地址(例如 socks5 协议的代理地址)
--------------------------------------------------------------
## JSON 格式示例
以下是一个示例配置,启用强制格式化并设置了代理地址:
```
json
{
"force_format"
:
true
,
"proxy"
:
"socks5://xxxxxxx"
}
```
--------------------------------------------------------------
通过调整上述 JSON 配置中的值,可以灵活控制渠道的额外行为,比如是否进行格式化以及使用特定的网络代理。
\ No newline at end of file
relay/channel/api_request.go
View file @
5c8af189
...
@@ -39,7 +39,7 @@ func DoApiRequest(a Adaptor, c *gin.Context, info *common.RelayInfo, requestBody
...
@@ -39,7 +39,7 @@ func DoApiRequest(a Adaptor, c *gin.Context, info *common.RelayInfo, requestBody
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"setup request header failed: %w"
,
err
)
return
nil
,
fmt
.
Errorf
(
"setup request header failed: %w"
,
err
)
}
}
resp
,
err
:=
doRequest
(
c
,
req
)
resp
,
err
:=
doRequest
(
c
,
req
,
info
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"do request failed: %w"
,
err
)
return
nil
,
fmt
.
Errorf
(
"do request failed: %w"
,
err
)
}
}
...
@@ -62,7 +62,7 @@ func DoFormRequest(a Adaptor, c *gin.Context, info *common.RelayInfo, requestBod
...
@@ -62,7 +62,7 @@ func DoFormRequest(a Adaptor, c *gin.Context, info *common.RelayInfo, requestBod
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"setup request header failed: %w"
,
err
)
return
nil
,
fmt
.
Errorf
(
"setup request header failed: %w"
,
err
)
}
}
resp
,
err
:=
doRequest
(
c
,
req
)
resp
,
err
:=
doRequest
(
c
,
req
,
info
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"do request failed: %w"
,
err
)
return
nil
,
fmt
.
Errorf
(
"do request failed: %w"
,
err
)
}
}
...
@@ -90,8 +90,18 @@ func DoWssRequest(a Adaptor, c *gin.Context, info *common.RelayInfo, requestBody
...
@@ -90,8 +90,18 @@ func DoWssRequest(a Adaptor, c *gin.Context, info *common.RelayInfo, requestBody
return
targetConn
,
nil
return
targetConn
,
nil
}
}
func
doRequest
(
c
*
gin
.
Context
,
req
*
http
.
Request
)
(
*
http
.
Response
,
error
)
{
func
doRequest
(
c
*
gin
.
Context
,
req
*
http
.
Request
,
info
*
common
.
RelayInfo
)
(
*
http
.
Response
,
error
)
{
resp
,
err
:=
service
.
GetHttpClient
()
.
Do
(
req
)
var
client
*
http
.
Client
var
err
error
if
proxyURL
,
ok
:=
info
.
ChannelSetting
[
"proxy"
];
ok
{
client
,
err
=
service
.
NewProxyHttpClient
(
proxyURL
.
(
string
))
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"new proxy http client failed: %w"
,
err
)
}
}
else
{
client
=
service
.
GetHttpClient
()
}
resp
,
err
:=
client
.
Do
(
req
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -120,7 +130,7 @@ func DoTaskApiRequest(a TaskAdaptor, c *gin.Context, info *common.TaskRelayInfo,
...
@@ -120,7 +130,7 @@ func DoTaskApiRequest(a TaskAdaptor, c *gin.Context, info *common.TaskRelayInfo,
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"setup request header failed: %w"
,
err
)
return
nil
,
fmt
.
Errorf
(
"setup request header failed: %w"
,
err
)
}
}
resp
,
err
:=
doRequest
(
c
,
req
)
resp
,
err
:=
doRequest
(
c
,
req
,
info
.
ToRelayInfo
()
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"do request failed: %w"
,
err
)
return
nil
,
fmt
.
Errorf
(
"do request failed: %w"
,
err
)
}
}
...
...
service/http_client.go
View file @
5c8af189
package
service
package
service
import
(
import
(
"context"
"fmt"
"golang.org/x/net/proxy"
"net"
"net/http"
"net/http"
"net/url"
"one-api/common"
"one-api/common"
"time"
"time"
)
)
...
@@ -30,3 +35,43 @@ func GetHttpClient() *http.Client {
...
@@ -30,3 +35,43 @@ func GetHttpClient() *http.Client {
func
GetImpatientHttpClient
()
*
http
.
Client
{
func
GetImpatientHttpClient
()
*
http
.
Client
{
return
impatientHTTPClient
return
impatientHTTPClient
}
}
// NewProxyHttpClient 创建支持代理的 HTTP 客户端
func
NewProxyHttpClient
(
proxyURL
string
)
(
*
http
.
Client
,
error
)
{
if
proxyURL
==
""
{
return
http
.
DefaultClient
,
nil
}
// 解析代理URL
parsedURL
,
err
:=
url
.
Parse
(
proxyURL
)
if
err
!=
nil
{
return
nil
,
err
}
switch
parsedURL
.
Scheme
{
case
"http"
,
"https"
:
return
&
http
.
Client
{
Transport
:
&
http
.
Transport
{
Proxy
:
http
.
ProxyURL
(
parsedURL
),
},
},
nil
case
"socks5"
:
// 创建 SOCKS5 代理拨号器
dialer
,
err
:=
proxy
.
SOCKS5
(
"tcp"
,
parsedURL
.
Host
,
nil
,
proxy
.
Direct
)
if
err
!=
nil
{
return
nil
,
err
}
return
&
http
.
Client
{
Transport
:
&
http
.
Transport
{
DialContext
:
func
(
ctx
context
.
Context
,
network
,
addr
string
)
(
net
.
Conn
,
error
)
{
return
dialer
.
Dial
(
network
,
addr
)
},
},
},
nil
default
:
return
nil
,
fmt
.
Errorf
(
"unsupported proxy scheme: %s"
,
parsedURL
.
Scheme
)
}
}
web/src/pages/Channel/EditChannel.js
View file @
5c8af189
...
@@ -966,7 +966,6 @@ const EditChannel = (props) => {
...
@@ -966,7 +966,6 @@ const EditChannel = (props) => {
value
=
{
inputs
.
weight
}
value
=
{
inputs
.
weight
}
autoComplete
=
"new-password"
autoComplete
=
"new-password"
/>
/>
{
inputs
.
type
===
8
&&
(
<>
<>
<
div
style
=
{{
marginTop
:
10
}}
>
<
div
style
=
{{
marginTop
:
10
}}
>
<
Typography
.
Text
strong
>
<
Typography
.
Text
strong
>
...
@@ -1001,7 +1000,6 @@ const EditChannel = (props) => {
...
@@ -1001,7 +1000,6 @@ const EditChannel = (props) => {
{
t
(
'填入模板'
)}
{
t
(
'填入模板'
)}
<
/Typography.Text
>
<
/Typography.Text
>
<
/
>
<
/
>
)}
<
/Spin
>
<
/Spin
>
<
/SideSheet
>
<
/SideSheet
>
<
/
>
<
/
>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment