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
961af95e
authored
Nov 04, 2025
by
IcedTangerine
Committed by
GitHub
Nov 04, 2025
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: openai 音频模型流模式未正确计费 (#2160)
parent
e1b93175
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
27 additions
and
0 deletions
+27
-0
relay/channel/openai/relay-openai.go
+27
-0
No files found.
relay/channel/openai/relay-openai.go
View file @
961af95e
...
@@ -122,6 +122,10 @@ func OaiStreamHandler(c *gin.Context, info *relaycommon.RelayInfo, resp *http.Re
...
@@ -122,6 +122,10 @@ func OaiStreamHandler(c *gin.Context, info *relaycommon.RelayInfo, resp *http.Re
var
usage
=
&
dto
.
Usage
{}
var
usage
=
&
dto
.
Usage
{}
var
streamItems
[]
string
// store stream items
var
streamItems
[]
string
// store stream items
var
lastStreamData
string
var
lastStreamData
string
var
secondLastStreamData
string
// 存储倒数第二个stream data,用于音频模型
// 检查是否为音频模型
isAudioModel
:=
strings
.
Contains
(
strings
.
ToLower
(
model
),
"audio"
)
helper
.
StreamScannerHandler
(
c
,
resp
,
info
,
func
(
data
string
)
bool
{
helper
.
StreamScannerHandler
(
c
,
resp
,
info
,
func
(
data
string
)
bool
{
if
lastStreamData
!=
""
{
if
lastStreamData
!=
""
{
...
@@ -131,12 +135,35 @@ func OaiStreamHandler(c *gin.Context, info *relaycommon.RelayInfo, resp *http.Re
...
@@ -131,12 +135,35 @@ func OaiStreamHandler(c *gin.Context, info *relaycommon.RelayInfo, resp *http.Re
}
}
}
}
if
len
(
data
)
>
0
{
if
len
(
data
)
>
0
{
// 对音频模型,保存倒数第二个stream data
if
isAudioModel
&&
lastStreamData
!=
""
{
secondLastStreamData
=
lastStreamData
}
lastStreamData
=
data
lastStreamData
=
data
streamItems
=
append
(
streamItems
,
data
)
streamItems
=
append
(
streamItems
,
data
)
}
}
return
true
return
true
})
})
// 对音频模型,从倒数第二个stream data中提取usage信息
if
isAudioModel
&&
secondLastStreamData
!=
""
{
var
streamResp
struct
{
Usage
*
dto
.
Usage
`json:"usage"`
}
err
:=
json
.
Unmarshal
([]
byte
(
secondLastStreamData
),
&
streamResp
)
if
err
==
nil
&&
streamResp
.
Usage
!=
nil
&&
service
.
ValidUsage
(
streamResp
.
Usage
)
{
usage
=
streamResp
.
Usage
containStreamUsage
=
true
if
common
.
DebugEnabled
{
logger
.
LogDebug
(
c
,
fmt
.
Sprintf
(
"Audio model usage extracted from second last SSE: PromptTokens=%d, CompletionTokens=%d, TotalTokens=%d, InputTokens=%d, OutputTokens=%d"
,
usage
.
PromptTokens
,
usage
.
CompletionTokens
,
usage
.
TotalTokens
,
usage
.
InputTokens
,
usage
.
OutputTokens
))
}
}
}
// 处理最后的响应
// 处理最后的响应
shouldSendLastResp
:=
true
shouldSendLastResp
:=
true
if
err
:=
handleLastResponse
(
lastStreamData
,
&
responseId
,
&
createAt
,
&
systemFingerprint
,
&
model
,
&
usage
,
if
err
:=
handleLastResponse
(
lastStreamData
,
&
responseId
,
&
createAt
,
&
systemFingerprint
,
&
model
,
&
usage
,
...
...
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