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
67bdfea9
authored
Oct 10, 2024
by
Xyfacai
Committed by
CalciumIon
Nov 05, 2024
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix(realtime): 修复ws 握手失败、计费问题
(cherry picked from commit 618dffc43fd5a5f4065944db87761f9ee18e44d3)
parent
16f6bdc8
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
28 additions
and
10 deletions
+28
-10
controller/relay.go
+1
-0
relay/channel/openai/adaptor.go
+21
-6
relay/channel/openai/relay-openai.go
+4
-0
service/quota.go
+2
-4
No files found.
controller/relay.go
View file @
67bdfea9
...
@@ -145,6 +145,7 @@ func Relay(c *gin.Context) {
...
@@ -145,6 +145,7 @@ func Relay(c *gin.Context) {
}
}
var
upgrader
=
websocket
.
Upgrader
{
var
upgrader
=
websocket
.
Upgrader
{
Subprotocols
:
[]
string
{
"realtime"
},
// WS 握手支持的协议,如果有使用 Sec-WebSocket-Protocol,则必须在此声明对应的 Protocol TODO add other protocol
CheckOrigin
:
func
(
r
*
http
.
Request
)
bool
{
CheckOrigin
:
func
(
r
*
http
.
Request
)
bool
{
return
true
// 允许跨域
return
true
// 允许跨域
},
},
...
...
relay/channel/openai/adaptor.go
View file @
67bdfea9
...
@@ -63,18 +63,33 @@ func (a *Adaptor) GetRequestURL(info *relaycommon.RelayInfo) (string, error) {
...
@@ -63,18 +63,33 @@ func (a *Adaptor) GetRequestURL(info *relaycommon.RelayInfo) (string, error) {
}
}
}
}
func
(
a
*
Adaptor
)
SetupRequestHeader
(
c
*
gin
.
Context
,
req
*
http
.
Header
,
info
*
relaycommon
.
RelayInfo
)
error
{
func
(
a
*
Adaptor
)
SetupRequestHeader
(
c
*
gin
.
Context
,
header
*
http
.
Header
,
info
*
relaycommon
.
RelayInfo
)
error
{
channel
.
SetupApiRequestHeader
(
info
,
c
,
req
)
channel
.
SetupApiRequestHeader
(
info
,
c
,
header
)
if
info
.
ChannelType
==
common
.
ChannelTypeAzure
{
if
info
.
ChannelType
==
common
.
ChannelTypeAzure
{
req
.
Set
(
"api-key"
,
info
.
ApiKey
)
header
.
Set
(
"api-key"
,
info
.
ApiKey
)
return
nil
return
nil
}
}
if
info
.
ChannelType
==
common
.
ChannelTypeOpenAI
&&
""
!=
info
.
Organization
{
if
info
.
ChannelType
==
common
.
ChannelTypeOpenAI
&&
""
!=
info
.
Organization
{
req
.
Set
(
"OpenAI-Organization"
,
info
.
Organization
)
header
.
Set
(
"OpenAI-Organization"
,
info
.
Organization
)
}
}
req
.
Set
(
"Authorization"
,
"Bearer "
+
info
.
ApiKey
)
if
info
.
RelayMode
==
constant
.
RelayModeRealtime
{
if
info
.
RelayMode
==
constant
.
RelayModeRealtime
{
req
.
Set
(
"openai-beta"
,
"realtime=v1"
)
swp
:=
c
.
Request
.
Header
.
Get
(
"Sec-WebSocket-Protocol"
)
if
swp
!=
""
{
items
:=
[]
string
{
"realtime"
,
"openai-insecure-api-key."
+
info
.
ApiKey
,
"openai-beta.realtime-v1"
,
}
header
.
Set
(
"Sec-WebSocket-Protocol"
,
strings
.
Join
(
items
,
","
))
//req.Header.Set("Sec-WebSocket-Key", c.Request.Header.Get("Sec-WebSocket-Key"))
//req.Header.Set("Sec-Websocket-Extensions", c.Request.Header.Get("Sec-Websocket-Extensions"))
//req.Header.Set("Sec-Websocket-Version", c.Request.Header.Get("Sec-Websocket-Version"))
}
else
{
header
.
Set
(
"openai-beta"
,
"realtime=v1"
)
header
.
Set
(
"Authorization"
,
"Bearer "
+
info
.
ApiKey
)
}
}
else
{
header
.
Set
(
"Authorization"
,
"Bearer "
+
info
.
ApiKey
)
}
}
//if info.ChannelType == common.ChannelTypeOpenRouter {
//if info.ChannelType == common.ChannelTypeOpenRouter {
// req.Header.Set("HTTP-Referer", "https://github.com/songquanpeng/one-api")
// req.Header.Set("HTTP-Referer", "https://github.com/songquanpeng/one-api")
...
...
relay/channel/openai/relay-openai.go
View file @
67bdfea9
...
@@ -483,7 +483,10 @@ func OpenaiRealtimeHandler(c *gin.Context, info *relaycommon.RelayInfo) (*dto.Op
...
@@ -483,7 +483,10 @@ func OpenaiRealtimeHandler(c *gin.Context, info *relaycommon.RelayInfo) (*dto.Op
errChan
<-
fmt
.
Errorf
(
"error consume usage: %v"
,
err
)
errChan
<-
fmt
.
Errorf
(
"error consume usage: %v"
,
err
)
return
return
}
}
// 本次计费完成,清除
usage
=
&
dto
.
RealtimeUsage
{}
usage
=
&
dto
.
RealtimeUsage
{}
localUsage
=
&
dto
.
RealtimeUsage
{}
}
else
{
}
else
{
textToken
,
audioToken
,
err
:=
service
.
CountTokenRealtime
(
info
,
*
realtimeEvent
,
info
.
UpstreamModelName
)
textToken
,
audioToken
,
err
:=
service
.
CountTokenRealtime
(
info
,
*
realtimeEvent
,
info
.
UpstreamModelName
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -501,6 +504,7 @@ func OpenaiRealtimeHandler(c *gin.Context, info *relaycommon.RelayInfo) (*dto.Op
...
@@ -501,6 +504,7 @@ func OpenaiRealtimeHandler(c *gin.Context, info *relaycommon.RelayInfo) (*dto.Op
errChan
<-
fmt
.
Errorf
(
"error consume usage: %v"
,
err
)
errChan
<-
fmt
.
Errorf
(
"error consume usage: %v"
,
err
)
return
return
}
}
// 本次计费完成,清除
localUsage
=
&
dto
.
RealtimeUsage
{}
localUsage
=
&
dto
.
RealtimeUsage
{}
// print now usage
// print now usage
}
}
...
...
service/quota.go
View file @
67bdfea9
...
@@ -78,10 +78,8 @@ func PostWssConsumeQuota(ctx *gin.Context, relayInfo *relaycommon.RelayInfo, mod
...
@@ -78,10 +78,8 @@ func PostWssConsumeQuota(ctx *gin.Context, relayInfo *relaycommon.RelayInfo, mod
quota
:=
0
quota
:=
0
if
!
usePrice
{
if
!
usePrice
{
quota
=
textInputTokens
+
int
(
math
.
Round
(
float64
(
textOutTokens
)
*
completionRatio
))
quota
=
int
(
math
.
Round
(
float64
(
textInputTokens
)
*
ratio
+
float64
(
textOutTokens
)
*
ratio
*
completionRatio
))
quota
+=
int
(
math
.
Round
(
float64
(
audioInputTokens
)
*
audioRatio
))
+
int
(
math
.
Round
(
float64
(
audioOutTokens
)
*
audioRatio
*
audioCompletionRatio
))
quota
+=
int
(
math
.
Round
(
float64
(
audioInputTokens
)
*
ratio
*
audioRatio
+
float64
(
audioOutTokens
)
*
ratio
*
audioRatio
*
audioCompletionRatio
))
quota
=
int
(
math
.
Round
(
float64
(
quota
)
*
ratio
))
if
ratio
!=
0
&&
quota
<=
0
{
if
ratio
!=
0
&&
quota
<=
0
{
quota
=
1
quota
=
1
}
}
...
...
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