|
@@ -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
|
|
|
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
|
|
|
}
|
|
}
|
|
|
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
|
|
|
if claudeResponse.Type == "message_start" {
|
|
if claudeResponse.Type == "message_start" {
|
|
|
// message_start, 获取usage
|
|
// message_start, 获取usage
|
|
|
responseId = claudeResponse.Message.Id
|
|
responseId = claudeResponse.Message.Id
|
|
|
- modelName = claudeResponse.Message.Model
|
|
|
|
|
|
|
+ info.UpstreamModelName = 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
|
|
|
//response.Id = responseId
|
|
//response.Id = responseId
|
|
|
response.Id = responseId
|
|
response.Id = responseId
|
|
|
response.Created = createdTime
|
|
response.Created = createdTime
|
|
|
- response.Model = modelName
|
|
|
|
|
|
|
+ response.Model = info.UpstreamModelName
|
|
|
|
|
|
|
|
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
|
|
|
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, promptTokens)
|
|
|
|
|
|
|
+ usage, _ = service.ResponseText2Usage(responseText, info.UpstreamModelName, info.PromptTokens)
|
|
|
} else {
|
|
} else {
|
|
|
if usage.PromptTokens == 0 {
|
|
if usage.PromptTokens == 0 {
|
|
|
- usage.PromptTokens = promptTokens
|
|
|
|
|
|
|
+ usage.PromptTokens = info.PromptTokens
|
|
|
}
|
|
}
|
|
|
if usage.CompletionTokens == 0 {
|
|
if usage.CompletionTokens == 0 {
|
|
|
- usage, _ = service.ResponseText2Usage(responseText, modelName, usage.PromptTokens)
|
|
|
|
|
|
|
+ usage, _ = service.ResponseText2Usage(responseText, info.UpstreamModelName, usage.PromptTokens)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
return nil, usage
|
|
return nil, usage
|