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
3753e572
authored
May 03, 2025
by
creamlike1024
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add OaiResponsesStreamHandler
parent
8ea4c76f
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
70 additions
and
2 deletions
+70
-2
dto/openai_response.go
+7
-1
relay/channel/openai/adaptor.go
+1
-1
relay/channel/openai/relay-openai.go
+62
-0
No files found.
dto/openai_response.go
View file @
3753e572
...
@@ -214,7 +214,7 @@ type OpenAIResponsesResponse struct {
...
@@ -214,7 +214,7 @@ type OpenAIResponsesResponse struct {
Tools
[]
interface
{}
`json:"tools"`
Tools
[]
interface
{}
`json:"tools"`
TopP
float64
`json:"top_p"`
TopP
float64
`json:"top_p"`
Truncation
string
`json:"truncation"`
Truncation
string
`json:"truncation"`
Usage
Usage
`json:"usage"`
Usage
*
Usage
`json:"usage"`
User
json
.
RawMessage
`json:"user"`
User
json
.
RawMessage
`json:"user"`
Metadata
json
.
RawMessage
`json:"metadata"`
Metadata
json
.
RawMessage
`json:"metadata"`
}
}
...
@@ -236,3 +236,9 @@ type ResponsesOutputContent struct {
...
@@ -236,3 +236,9 @@ type ResponsesOutputContent struct {
Text
string
`json:"text"`
Text
string
`json:"text"`
Annotations
[]
interface
{}
`json:"annotations"`
Annotations
[]
interface
{}
`json:"annotations"`
}
}
// ResponsesStreamResponse 用于处理 /v1/responses 流式响应
type
ResponsesStreamResponse
struct
{
Type
string
`json:"type"`
Response
*
OpenAIResponsesResponse
`json:"response"`
}
relay/channel/openai/adaptor.go
View file @
3753e572
...
@@ -427,7 +427,7 @@ func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, info *relaycom
...
@@ -427,7 +427,7 @@ func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, info *relaycom
err
,
usage
=
common_handler
.
RerankHandler
(
c
,
info
,
resp
)
err
,
usage
=
common_handler
.
RerankHandler
(
c
,
info
,
resp
)
case
constant
.
RelayModeResponses
:
case
constant
.
RelayModeResponses
:
if
info
.
IsStream
{
if
info
.
IsStream
{
err
,
usage
=
OaiStreamHandler
(
c
,
resp
,
info
)
err
,
usage
=
Oai
Responses
StreamHandler
(
c
,
resp
,
info
)
}
else
{
}
else
{
err
,
usage
=
OpenaiResponsesHandler
(
c
,
resp
,
info
)
err
,
usage
=
OpenaiResponsesHandler
(
c
,
resp
,
info
)
}
}
...
...
relay/channel/openai/relay-openai.go
View file @
3753e572
...
@@ -694,3 +694,65 @@ func OpenaiResponsesHandler(c *gin.Context, resp *http.Response, info *relaycomm
...
@@ -694,3 +694,65 @@ func OpenaiResponsesHandler(c *gin.Context, resp *http.Response, info *relaycomm
usage
.
TotalTokens
=
responsesResponse
.
Usage
.
TotalTokens
usage
.
TotalTokens
=
responsesResponse
.
Usage
.
TotalTokens
return
nil
,
&
usage
return
nil
,
&
usage
}
}
func
OaiResponsesStreamHandler
(
c
*
gin
.
Context
,
resp
*
http
.
Response
,
info
*
relaycommon
.
RelayInfo
)
(
*
dto
.
OpenAIErrorWithStatusCode
,
*
dto
.
Usage
)
{
if
resp
==
nil
||
resp
.
Body
==
nil
{
common
.
LogError
(
c
,
"invalid response or response body"
)
return
service
.
OpenAIErrorWrapper
(
fmt
.
Errorf
(
"invalid response"
),
"invalid_response"
,
http
.
StatusInternalServerError
),
nil
}
var
usage
=
&
dto
.
Usage
{}
var
streamItems
[]
string
// 存储流式数据项
// var responseTextBuilder strings.Builder
// var toolCount int
var
forceFormat
bool
if
forceFmt
,
ok
:=
info
.
ChannelSetting
[
constant
.
ForceFormat
]
.
(
bool
);
ok
{
forceFormat
=
forceFmt
}
var
lastStreamData
string
helper
.
StreamScannerHandler
(
c
,
resp
,
info
,
func
(
data
string
)
bool
{
if
lastStreamData
!=
""
{
// 处理上一条数据
sendResponsesStreamData
(
c
,
lastStreamData
,
forceFormat
)
}
lastStreamData
=
data
streamItems
=
append
(
streamItems
,
data
)
// 检查当前数据是否包含 completed 状态和 usage 信息
var
streamResponse
dto
.
ResponsesStreamResponse
if
err
:=
common
.
DecodeJsonStr
(
data
,
&
streamResponse
);
err
==
nil
{
if
streamResponse
.
Type
==
"response.completed"
{
// 处理 completed 状态
usage
.
PromptTokens
=
streamResponse
.
Response
.
Usage
.
InputTokens
usage
.
CompletionTokens
=
streamResponse
.
Response
.
Usage
.
OutputTokens
usage
.
TotalTokens
=
streamResponse
.
Response
.
Usage
.
TotalTokens
}
}
return
true
})
// 处理最后一条数据
sendResponsesStreamData
(
c
,
lastStreamData
,
forceFormat
)
// 处理token计算
// if err := processTokens(info.RelayMode, streamItems, &responseTextBuilder, &toolCount); err != nil {
// common.SysError("error processing tokens: " + err.Error())
// }
return
nil
,
usage
}
func
sendResponsesStreamData
(
c
*
gin
.
Context
,
data
string
,
forceFormat
bool
)
error
{
if
data
==
""
{
return
nil
}
if
forceFormat
{
return
helper
.
ObjectData
(
c
,
data
)
}
else
{
return
helper
.
StringData
(
c
,
data
)
}
}
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