mirror of
https://github.com/linux-do/new-api.git
synced 2025-09-17 16:06:38 +08:00
fix: fix embedding
This commit is contained in:
parent
031957714a
commit
c4b3d3a975
@ -1,12 +1,16 @@
|
|||||||
package dto
|
package dto
|
||||||
|
|
||||||
type TextResponseWithError struct {
|
type TextResponseWithError struct {
|
||||||
Choices []OpenAITextResponseChoice `json:"choices"`
|
Choices []OpenAITextResponseChoice `json:"choices"`
|
||||||
|
Object string `json:"object"`
|
||||||
|
Data []OpenAIEmbeddingResponseItem `json:"data"`
|
||||||
|
Model string `json:"model"`
|
||||||
Usage `json:"usage"`
|
Usage `json:"usage"`
|
||||||
Error OpenAIError `json:"error"`
|
Error OpenAIError `json:"error"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type TextResponse struct {
|
type TextResponse struct {
|
||||||
|
Model string `json:"model"`
|
||||||
Choices []OpenAITextResponseChoice `json:"choices"`
|
Choices []OpenAITextResponseChoice `json:"choices"`
|
||||||
Usage `json:"usage"`
|
Usage `json:"usage"`
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,7 @@ func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, info *relaycom
|
|||||||
err, responseText = openai.OpenaiStreamHandler(c, resp, info.RelayMode)
|
err, responseText = openai.OpenaiStreamHandler(c, resp, info.RelayMode)
|
||||||
usage, _ = service.ResponseText2Usage(responseText, info.UpstreamModelName, info.PromptTokens)
|
usage, _ = service.ResponseText2Usage(responseText, info.UpstreamModelName, info.PromptTokens)
|
||||||
} else {
|
} else {
|
||||||
err, usage, sensitiveResp = openai.OpenaiHandler(c, resp, info.PromptTokens, info.UpstreamModelName)
|
err, usage, sensitiveResp = openai.OpenaiHandler(c, resp, info.PromptTokens, info.UpstreamModelName, info.RelayMode)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -77,7 +77,7 @@ func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, info *relaycom
|
|||||||
err, responseText = OpenaiStreamHandler(c, resp, info.RelayMode)
|
err, responseText = OpenaiStreamHandler(c, resp, info.RelayMode)
|
||||||
usage, _ = service.ResponseText2Usage(responseText, info.UpstreamModelName, info.PromptTokens)
|
usage, _ = service.ResponseText2Usage(responseText, info.UpstreamModelName, info.PromptTokens)
|
||||||
} else {
|
} else {
|
||||||
err, usage, sensitiveResp = OpenaiHandler(c, resp, info.PromptTokens, info.UpstreamModelName)
|
err, usage, sensitiveResp = OpenaiHandler(c, resp, info.PromptTokens, info.UpstreamModelName, info.RelayMode)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -124,8 +124,8 @@ func OpenaiStreamHandler(c *gin.Context, resp *http.Response, relayMode int) (*d
|
|||||||
return nil, responseTextBuilder.String()
|
return nil, responseTextBuilder.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
func OpenaiHandler(c *gin.Context, resp *http.Response, promptTokens int, model string) (*dto.OpenAIErrorWithStatusCode, *dto.Usage, *dto.SensitiveResponse) {
|
func OpenaiHandler(c *gin.Context, resp *http.Response, promptTokens int, model string, relayMode int) (*dto.OpenAIErrorWithStatusCode, *dto.Usage, *dto.SensitiveResponse) {
|
||||||
var textResponseWithError dto.TextResponseWithError
|
var responseWithError dto.TextResponseWithError
|
||||||
responseBody, err := io.ReadAll(resp.Body)
|
responseBody, err := io.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return service.OpenAIErrorWrapper(err, "read_response_body_failed", http.StatusInternalServerError), nil, nil
|
return service.OpenAIErrorWrapper(err, "read_response_body_failed", http.StatusInternalServerError), nil, nil
|
||||||
@ -134,62 +134,81 @@ func OpenaiHandler(c *gin.Context, resp *http.Response, promptTokens int, model
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return service.OpenAIErrorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), nil, nil
|
return service.OpenAIErrorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), nil, nil
|
||||||
}
|
}
|
||||||
err = json.Unmarshal(responseBody, &textResponseWithError)
|
err = json.Unmarshal(responseBody, &responseWithError)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("unmarshal_response_body_failed: body: %s, err: %v", string(responseBody), err)
|
log.Printf("unmarshal_response_body_failed: body: %s, err: %v", string(responseBody), err)
|
||||||
return service.OpenAIErrorWrapper(err, "unmarshal_response_body_failed", http.StatusInternalServerError), nil, nil
|
return service.OpenAIErrorWrapper(err, "unmarshal_response_body_failed", http.StatusInternalServerError), nil, nil
|
||||||
}
|
}
|
||||||
if textResponseWithError.Error.Type != "" {
|
if responseWithError.Error.Type != "" {
|
||||||
return &dto.OpenAIErrorWithStatusCode{
|
return &dto.OpenAIErrorWithStatusCode{
|
||||||
Error: textResponseWithError.Error,
|
Error: responseWithError.Error,
|
||||||
StatusCode: resp.StatusCode,
|
StatusCode: resp.StatusCode,
|
||||||
}, nil, nil
|
}, nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
textResponse := &dto.TextResponse{
|
|
||||||
Choices: textResponseWithError.Choices,
|
|
||||||
Usage: textResponseWithError.Usage,
|
|
||||||
}
|
|
||||||
|
|
||||||
checkSensitive := constant.ShouldCheckCompletionSensitive()
|
checkSensitive := constant.ShouldCheckCompletionSensitive()
|
||||||
sensitiveWords := make([]string, 0)
|
sensitiveWords := make([]string, 0)
|
||||||
triggerSensitive := false
|
triggerSensitive := false
|
||||||
|
|
||||||
if textResponse.Usage.TotalTokens == 0 || checkSensitive {
|
usage := &responseWithError.Usage
|
||||||
completionTokens := 0
|
|
||||||
for i, choice := range textResponse.Choices {
|
//textResponse := &dto.TextResponse{
|
||||||
stringContent := string(choice.Message.Content)
|
// Choices: responseWithError.Choices,
|
||||||
ctkm, _, _ := service.CountTokenText(stringContent, model, false)
|
// Usage: responseWithError.Usage,
|
||||||
completionTokens += ctkm
|
//}
|
||||||
if checkSensitive {
|
var doResponseBody []byte
|
||||||
sensitive, words, stringContent := service.SensitiveWordReplace(stringContent, false)
|
|
||||||
if sensitive {
|
switch relayMode {
|
||||||
triggerSensitive = true
|
case relayconstant.RelayModeEmbeddings:
|
||||||
msg := choice.Message
|
embeddingResponse := &dto.OpenAIEmbeddingResponse{
|
||||||
msg.Content = common.StringToByteSlice(stringContent)
|
Object: responseWithError.Object,
|
||||||
textResponse.Choices[i].Message = msg
|
Data: responseWithError.Data,
|
||||||
sensitiveWords = append(sensitiveWords, words...)
|
Model: responseWithError.Model,
|
||||||
|
Usage: *usage,
|
||||||
|
}
|
||||||
|
doResponseBody, err = json.Marshal(embeddingResponse)
|
||||||
|
default:
|
||||||
|
if responseWithError.Usage.TotalTokens == 0 || checkSensitive {
|
||||||
|
completionTokens := 0
|
||||||
|
for i, choice := range responseWithError.Choices {
|
||||||
|
stringContent := string(choice.Message.Content)
|
||||||
|
ctkm, _, _ := service.CountTokenText(stringContent, model, false)
|
||||||
|
completionTokens += ctkm
|
||||||
|
if checkSensitive {
|
||||||
|
sensitive, words, stringContent := service.SensitiveWordReplace(stringContent, false)
|
||||||
|
if sensitive {
|
||||||
|
triggerSensitive = true
|
||||||
|
msg := choice.Message
|
||||||
|
msg.Content = common.StringToByteSlice(stringContent)
|
||||||
|
responseWithError.Choices[i].Message = msg
|
||||||
|
sensitiveWords = append(sensitiveWords, words...)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
responseWithError.Usage = dto.Usage{
|
||||||
|
PromptTokens: promptTokens,
|
||||||
|
CompletionTokens: completionTokens,
|
||||||
|
TotalTokens: promptTokens + completionTokens,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
textResponse.Usage = dto.Usage{
|
textResponse := &dto.TextResponse{
|
||||||
PromptTokens: promptTokens,
|
Choices: responseWithError.Choices,
|
||||||
CompletionTokens: completionTokens,
|
Model: responseWithError.Model,
|
||||||
TotalTokens: promptTokens + completionTokens,
|
Usage: *usage,
|
||||||
}
|
}
|
||||||
|
doResponseBody, err = json.Marshal(textResponse)
|
||||||
}
|
}
|
||||||
|
|
||||||
if checkSensitive && triggerSensitive && constant.StopOnSensitiveEnabled {
|
if checkSensitive && triggerSensitive && constant.StopOnSensitiveEnabled {
|
||||||
sensitiveWords = common.RemoveDuplicate(sensitiveWords)
|
sensitiveWords = common.RemoveDuplicate(sensitiveWords)
|
||||||
return service.OpenAIErrorWrapper(errors.New(fmt.Sprintf("sensitive words detected on response: %s",
|
return service.OpenAIErrorWrapper(errors.New(fmt.Sprintf("sensitive words detected on response: %s",
|
||||||
strings.Join(sensitiveWords, ", "))), "sensitive_words_detected", http.StatusBadRequest),
|
strings.Join(sensitiveWords, ", "))), "sensitive_words_detected", http.StatusBadRequest),
|
||||||
&textResponse.Usage, &dto.SensitiveResponse{
|
usage, &dto.SensitiveResponse{
|
||||||
SensitiveWords: sensitiveWords,
|
SensitiveWords: sensitiveWords,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
responseBody, err = json.Marshal(textResponse)
|
|
||||||
// Reset response body
|
// Reset response body
|
||||||
resp.Body = io.NopCloser(bytes.NewBuffer(responseBody))
|
resp.Body = io.NopCloser(bytes.NewBuffer(doResponseBody))
|
||||||
// We shouldn't set the header before we parse the response body, because the parse part may fail.
|
// We shouldn't set the header before we parse the response body, because the parse part may fail.
|
||||||
// And then we will have to send an error response, but in this case, the header has already been set.
|
// And then we will have to send an error response, but in this case, the header has already been set.
|
||||||
// So the httpClient will be confused by the response.
|
// So the httpClient will be confused by the response.
|
||||||
@ -207,5 +226,5 @@ func OpenaiHandler(c *gin.Context, resp *http.Response, promptTokens int, model
|
|||||||
return service.OpenAIErrorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), nil, nil
|
return service.OpenAIErrorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), nil, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil, &textResponse.Usage, nil
|
return nil, usage, nil
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, info *relaycom
|
|||||||
err, responseText = openai.OpenaiStreamHandler(c, resp, info.RelayMode)
|
err, responseText = openai.OpenaiStreamHandler(c, resp, info.RelayMode)
|
||||||
usage, _ = service.ResponseText2Usage(responseText, info.UpstreamModelName, info.PromptTokens)
|
usage, _ = service.ResponseText2Usage(responseText, info.UpstreamModelName, info.PromptTokens)
|
||||||
} else {
|
} else {
|
||||||
err, usage, sensitiveResp = openai.OpenaiHandler(c, resp, info.PromptTokens, info.UpstreamModelName)
|
err, usage, sensitiveResp = openai.OpenaiHandler(c, resp, info.PromptTokens, info.UpstreamModelName, info.RelayMode)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -50,7 +50,7 @@ func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, info *relaycom
|
|||||||
err, responseText = openai.OpenaiStreamHandler(c, resp, info.RelayMode)
|
err, responseText = openai.OpenaiStreamHandler(c, resp, info.RelayMode)
|
||||||
usage, _ = service.ResponseText2Usage(responseText, info.UpstreamModelName, info.PromptTokens)
|
usage, _ = service.ResponseText2Usage(responseText, info.UpstreamModelName, info.PromptTokens)
|
||||||
} else {
|
} else {
|
||||||
err, usage, sensitiveResp = openai.OpenaiHandler(c, resp, info.PromptTokens, info.UpstreamModelName)
|
err, usage, sensitiveResp = openai.OpenaiHandler(c, resp, info.PromptTokens, info.UpstreamModelName, info.RelayMode)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user