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
a1d4012e
authored
Jun 27, 2024
by
CalciumIon
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: first response time support gemini and claude
parent
dd0f722f
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
24 additions
and
9 deletions
+24
-9
relay/channel/claude/adaptor.go
+1
-1
relay/channel/claude/relay-claude.go
+13
-6
relay/channel/gemini/adaptor.go
+1
-1
relay/channel/gemini/relay-gemini.go
+7
-1
relay/common/relay_info.go
+2
-0
No files found.
relay/channel/claude/adaptor.go
View file @
a1d4012e
...
@@ -65,7 +65,7 @@ func (a *Adaptor) DoRequest(c *gin.Context, info *relaycommon.RelayInfo, request
...
@@ -65,7 +65,7 @@ func (a *Adaptor) DoRequest(c *gin.Context, info *relaycommon.RelayInfo, request
func
(
a
*
Adaptor
)
DoResponse
(
c
*
gin
.
Context
,
resp
*
http
.
Response
,
info
*
relaycommon
.
RelayInfo
)
(
usage
*
dto
.
Usage
,
err
*
dto
.
OpenAIErrorWithStatusCode
)
{
func
(
a
*
Adaptor
)
DoResponse
(
c
*
gin
.
Context
,
resp
*
http
.
Response
,
info
*
relaycommon
.
RelayInfo
)
(
usage
*
dto
.
Usage
,
err
*
dto
.
OpenAIErrorWithStatusCode
)
{
if
info
.
IsStream
{
if
info
.
IsStream
{
err
,
usage
=
claudeStreamHandler
(
a
.
RequestMode
,
info
.
UpstreamModelName
,
info
.
PromptTokens
,
c
,
resp
)
err
,
usage
=
claudeStreamHandler
(
c
,
resp
,
info
,
a
.
RequestMode
)
}
else
{
}
else
{
err
,
usage
=
claudeHandler
(
a
.
RequestMode
,
c
,
resp
,
info
.
PromptTokens
,
info
.
UpstreamModelName
)
err
,
usage
=
claudeHandler
(
a
.
RequestMode
,
c
,
resp
,
info
.
PromptTokens
,
info
.
UpstreamModelName
)
}
}
...
...
relay/channel/claude/relay-claude.go
View file @
a1d4012e
...
@@ -9,8 +9,10 @@ import (
...
@@ -9,8 +9,10 @@ import (
"net/http"
"net/http"
"one-api/common"
"one-api/common"
"one-api/dto"
"one-api/dto"
relaycommon
"one-api/relay/common"
"one-api/service"
"one-api/service"
"strings"
"strings"
"time"
)
)
func
stopReasonClaude2OpenAI
(
reason
string
)
string
{
func
stopReasonClaude2OpenAI
(
reason
string
)
string
{
...
@@ -246,7 +248,7 @@ func ResponseClaude2OpenAI(reqMode int, claudeResponse *ClaudeResponse) *dto.Ope
...
@@ -246,7 +248,7 @@ func ResponseClaude2OpenAI(reqMode int, claudeResponse *ClaudeResponse) *dto.Ope
return
&
fullTextResponse
return
&
fullTextResponse
}
}
func
claudeStreamHandler
(
requestMode
int
,
modelName
string
,
promptTokens
int
,
c
*
gin
.
Context
,
resp
*
http
.
Response
)
(
*
dto
.
OpenAIErrorWithStatusCode
,
*
dto
.
Usage
)
{
func
claudeStreamHandler
(
c
*
gin
.
Context
,
resp
*
http
.
Response
,
info
*
relaycommon
.
RelayInfo
,
requestMode
int
)
(
*
dto
.
OpenAIErrorWithStatusCode
,
*
dto
.
Usage
)
{
responseId
:=
fmt
.
Sprintf
(
"chatcmpl-%s"
,
common
.
GetUUID
())
responseId
:=
fmt
.
Sprintf
(
"chatcmpl-%s"
,
common
.
GetUUID
())
var
usage
*
dto
.
Usage
var
usage
*
dto
.
Usage
usage
=
&
dto
.
Usage
{}
usage
=
&
dto
.
Usage
{}
...
@@ -278,10 +280,15 @@ func claudeStreamHandler(requestMode int, modelName string, promptTokens int, c
...
@@ -278,10 +280,15 @@ func claudeStreamHandler(requestMode int, modelName string, promptTokens int, c
}
}
stopChan
<-
true
stopChan
<-
true
}()
}()
isFirst
:=
true
service
.
SetEventStreamHeaders
(
c
)
service
.
SetEventStreamHeaders
(
c
)
c
.
Stream
(
func
(
w
io
.
Writer
)
bool
{
c
.
Stream
(
func
(
w
io
.
Writer
)
bool
{
select
{
select
{
case
data
:=
<-
dataChan
:
case
data
:=
<-
dataChan
:
if
isFirst
{
isFirst
=
false
info
.
FirstResponseTime
=
time
.
Now
()
}
// some implementations may add \r at the end of data
// some implementations may add \r at the end of data
data
=
strings
.
TrimSuffix
(
data
,
"
\r
"
)
data
=
strings
.
TrimSuffix
(
data
,
"
\r
"
)
var
claudeResponse
ClaudeResponse
var
claudeResponse
ClaudeResponse
...
@@ -302,7 +309,7 @@ func claudeStreamHandler(requestMode int, modelName string, promptTokens int, c
...
@@ -302,7 +309,7 @@ func claudeStreamHandler(requestMode int, modelName string, promptTokens int, c
if
claudeResponse
.
Type
==
"message_start"
{
if
claudeResponse
.
Type
==
"message_start"
{
// message_start, 获取usage
// message_start, 获取usage
responseId
=
claudeResponse
.
Message
.
Id
responseId
=
claudeResponse
.
Message
.
Id
m
odelName
=
claudeResponse
.
Message
.
Model
info
.
UpstreamM
odelName
=
claudeResponse
.
Message
.
Model
usage
.
PromptTokens
=
claudeUsage
.
InputTokens
usage
.
PromptTokens
=
claudeUsage
.
InputTokens
}
else
if
claudeResponse
.
Type
==
"content_block_delta"
{
}
else
if
claudeResponse
.
Type
==
"content_block_delta"
{
responseText
+=
claudeResponse
.
Delta
.
Text
responseText
+=
claudeResponse
.
Delta
.
Text
...
@@ -316,7 +323,7 @@ func claudeStreamHandler(requestMode int, modelName string, promptTokens int, c
...
@@ -316,7 +323,7 @@ func claudeStreamHandler(requestMode int, modelName string, promptTokens int, c
//response.Id = responseId
//response.Id = responseId
response
.
Id
=
responseId
response
.
Id
=
responseId
response
.
Created
=
createdTime
response
.
Created
=
createdTime
response
.
Model
=
m
odelName
response
.
Model
=
info
.
UpstreamM
odelName
jsonStr
,
err
:=
json
.
Marshal
(
response
)
jsonStr
,
err
:=
json
.
Marshal
(
response
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -335,13 +342,13 @@ func claudeStreamHandler(requestMode int, modelName string, promptTokens int, c
...
@@ -335,13 +342,13 @@ func claudeStreamHandler(requestMode int, modelName string, promptTokens int, c
return
service
.
OpenAIErrorWrapper
(
err
,
"close_response_body_failed"
,
http
.
StatusInternalServerError
),
nil
return
service
.
OpenAIErrorWrapper
(
err
,
"close_response_body_failed"
,
http
.
StatusInternalServerError
),
nil
}
}
if
requestMode
==
RequestModeCompletion
{
if
requestMode
==
RequestModeCompletion
{
usage
,
_
=
service
.
ResponseText2Usage
(
responseText
,
modelName
,
p
romptTokens
)
usage
,
_
=
service
.
ResponseText2Usage
(
responseText
,
info
.
UpstreamModelName
,
info
.
P
romptTokens
)
}
else
{
}
else
{
if
usage
.
PromptTokens
==
0
{
if
usage
.
PromptTokens
==
0
{
usage
.
PromptTokens
=
p
romptTokens
usage
.
PromptTokens
=
info
.
P
romptTokens
}
}
if
usage
.
CompletionTokens
==
0
{
if
usage
.
CompletionTokens
==
0
{
usage
,
_
=
service
.
ResponseText2Usage
(
responseText
,
m
odelName
,
usage
.
PromptTokens
)
usage
,
_
=
service
.
ResponseText2Usage
(
responseText
,
info
.
UpstreamM
odelName
,
usage
.
PromptTokens
)
}
}
}
}
return
nil
,
usage
return
nil
,
usage
...
...
relay/channel/gemini/adaptor.go
View file @
a1d4012e
...
@@ -63,7 +63,7 @@ func (a *Adaptor) DoRequest(c *gin.Context, info *relaycommon.RelayInfo, request
...
@@ -63,7 +63,7 @@ func (a *Adaptor) DoRequest(c *gin.Context, info *relaycommon.RelayInfo, request
func
(
a
*
Adaptor
)
DoResponse
(
c
*
gin
.
Context
,
resp
*
http
.
Response
,
info
*
relaycommon
.
RelayInfo
)
(
usage
*
dto
.
Usage
,
err
*
dto
.
OpenAIErrorWithStatusCode
)
{
func
(
a
*
Adaptor
)
DoResponse
(
c
*
gin
.
Context
,
resp
*
http
.
Response
,
info
*
relaycommon
.
RelayInfo
)
(
usage
*
dto
.
Usage
,
err
*
dto
.
OpenAIErrorWithStatusCode
)
{
if
info
.
IsStream
{
if
info
.
IsStream
{
var
responseText
string
var
responseText
string
err
,
responseText
=
geminiChatStreamHandler
(
c
,
resp
)
err
,
responseText
=
geminiChatStreamHandler
(
c
,
resp
,
info
)
usage
,
_
=
service
.
ResponseText2Usage
(
responseText
,
info
.
UpstreamModelName
,
info
.
PromptTokens
)
usage
,
_
=
service
.
ResponseText2Usage
(
responseText
,
info
.
UpstreamModelName
,
info
.
PromptTokens
)
}
else
{
}
else
{
err
,
usage
=
geminiChatHandler
(
c
,
resp
,
info
.
PromptTokens
,
info
.
UpstreamModelName
)
err
,
usage
=
geminiChatHandler
(
c
,
resp
,
info
.
PromptTokens
,
info
.
UpstreamModelName
)
...
...
relay/channel/gemini/relay-gemini.go
View file @
a1d4012e
...
@@ -11,6 +11,7 @@ import (
...
@@ -11,6 +11,7 @@ import (
relaycommon
"one-api/relay/common"
relaycommon
"one-api/relay/common"
"one-api/service"
"one-api/service"
"strings"
"strings"
"time"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin"
)
)
...
@@ -160,7 +161,7 @@ func streamResponseGeminiChat2OpenAI(geminiResponse *GeminiChatResponse) *dto.Ch
...
@@ -160,7 +161,7 @@ func streamResponseGeminiChat2OpenAI(geminiResponse *GeminiChatResponse) *dto.Ch
return
&
response
return
&
response
}
}
func
geminiChatStreamHandler
(
c
*
gin
.
Context
,
resp
*
http
.
Response
)
(
*
dto
.
OpenAIErrorWithStatusCode
,
string
)
{
func
geminiChatStreamHandler
(
c
*
gin
.
Context
,
resp
*
http
.
Response
,
info
*
relaycommon
.
RelayInfo
)
(
*
dto
.
OpenAIErrorWithStatusCode
,
string
)
{
responseText
:=
""
responseText
:=
""
dataChan
:=
make
(
chan
string
)
dataChan
:=
make
(
chan
string
)
stopChan
:=
make
(
chan
bool
)
stopChan
:=
make
(
chan
bool
)
...
@@ -190,10 +191,15 @@ func geminiChatStreamHandler(c *gin.Context, resp *http.Response) (*dto.OpenAIEr
...
@@ -190,10 +191,15 @@ func geminiChatStreamHandler(c *gin.Context, resp *http.Response) (*dto.OpenAIEr
}
}
stopChan
<-
true
stopChan
<-
true
}()
}()
isFirst
:=
true
service
.
SetEventStreamHeaders
(
c
)
service
.
SetEventStreamHeaders
(
c
)
c
.
Stream
(
func
(
w
io
.
Writer
)
bool
{
c
.
Stream
(
func
(
w
io
.
Writer
)
bool
{
select
{
select
{
case
data
:=
<-
dataChan
:
case
data
:=
<-
dataChan
:
if
isFirst
{
isFirst
=
false
info
.
FirstResponseTime
=
time
.
Now
()
}
// this is used to prevent annoying \ related format bug
// this is used to prevent annoying \ related format bug
data
=
fmt
.
Sprintf
(
"{
\"
content
\"
:
\"
%s
\"
}"
,
data
)
data
=
fmt
.
Sprintf
(
"{
\"
content
\"
:
\"
%s
\"
}"
,
data
)
type
dummyStruct
struct
{
type
dummyStruct
struct
{
...
...
relay/common/relay_info.go
View file @
a1d4012e
...
@@ -38,6 +38,7 @@ func GenRelayInfo(c *gin.Context) *RelayInfo {
...
@@ -38,6 +38,7 @@ func GenRelayInfo(c *gin.Context) *RelayInfo {
group
:=
c
.
GetString
(
"group"
)
group
:=
c
.
GetString
(
"group"
)
tokenUnlimited
:=
c
.
GetBool
(
"token_unlimited_quota"
)
tokenUnlimited
:=
c
.
GetBool
(
"token_unlimited_quota"
)
startTime
:=
time
.
Now
()
startTime
:=
time
.
Now
()
// firstResponseTime = time.Now() - 1 second
apiType
,
_
:=
constant
.
ChannelType2APIType
(
channelType
)
apiType
,
_
:=
constant
.
ChannelType2APIType
(
channelType
)
...
@@ -52,6 +53,7 @@ func GenRelayInfo(c *gin.Context) *RelayInfo {
...
@@ -52,6 +53,7 @@ func GenRelayInfo(c *gin.Context) *RelayInfo {
Group
:
group
,
Group
:
group
,
TokenUnlimited
:
tokenUnlimited
,
TokenUnlimited
:
tokenUnlimited
,
StartTime
:
startTime
,
StartTime
:
startTime
,
FirstResponseTime
:
startTime
.
Add
(
-
time
.
Second
),
ApiType
:
apiType
,
ApiType
:
apiType
,
ApiVersion
:
c
.
GetString
(
"api_version"
),
ApiVersion
:
c
.
GetString
(
"api_version"
),
ApiKey
:
strings
.
TrimPrefix
(
c
.
Request
.
Header
.
Get
(
"Authorization"
),
"Bearer "
),
ApiKey
:
strings
.
TrimPrefix
(
c
.
Request
.
Header
.
Get
(
"Authorization"
),
"Bearer "
),
...
...
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