mirror of
				https://github.com/songquanpeng/one-api.git
				synced 2025-11-04 15:53:42 +08:00 
			
		
		
		
	fix: calculate usage if not given in non-stream mode (#352)
This commit is contained in:
		@@ -92,7 +92,7 @@ func openaiStreamHandler(c *gin.Context, resp *http.Response, relayMode int) (*O
 | 
				
			|||||||
	return nil, responseText
 | 
						return nil, responseText
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func openaiHandler(c *gin.Context, resp *http.Response, consumeQuota bool) (*OpenAIErrorWithStatusCode, *Usage) {
 | 
					func openaiHandler(c *gin.Context, resp *http.Response, consumeQuota bool, promptTokens int, model string) (*OpenAIErrorWithStatusCode, *Usage) {
 | 
				
			||||||
	var textResponse TextResponse
 | 
						var textResponse TextResponse
 | 
				
			||||||
	if consumeQuota {
 | 
						if consumeQuota {
 | 
				
			||||||
		responseBody, err := io.ReadAll(resp.Body)
 | 
							responseBody, err := io.ReadAll(resp.Body)
 | 
				
			||||||
@@ -132,5 +132,17 @@ func openaiHandler(c *gin.Context, resp *http.Response, consumeQuota bool) (*Ope
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return errorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), nil
 | 
							return errorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if textResponse.Usage.TotalTokens == 0 {
 | 
				
			||||||
 | 
							completionTokens := 0
 | 
				
			||||||
 | 
							for _, choice := range textResponse.Choices {
 | 
				
			||||||
 | 
								completionTokens += countTokenText(choice.Message.Content, model)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							textResponse.Usage = Usage{
 | 
				
			||||||
 | 
								PromptTokens:     promptTokens,
 | 
				
			||||||
 | 
								CompletionTokens: completionTokens,
 | 
				
			||||||
 | 
								TotalTokens:      promptTokens + completionTokens,
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return nil, &textResponse.Usage
 | 
						return nil, &textResponse.Usage
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -362,7 +362,7 @@ func relayTextHelper(c *gin.Context, relayMode int) *OpenAIErrorWithStatusCode {
 | 
				
			|||||||
			textResponse.Usage.CompletionTokens = countTokenText(responseText, textRequest.Model)
 | 
								textResponse.Usage.CompletionTokens = countTokenText(responseText, textRequest.Model)
 | 
				
			||||||
			return nil
 | 
								return nil
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			err, usage := openaiHandler(c, resp, consumeQuota)
 | 
								err, usage := openaiHandler(c, resp, consumeQuota, promptTokens, textRequest.Model)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return err
 | 
									return err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -81,8 +81,9 @@ type OpenAIErrorWithStatusCode struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type TextResponse struct {
 | 
					type TextResponse struct {
 | 
				
			||||||
	Usage `json:"usage"`
 | 
						Choices []OpenAITextResponseChoice `json:"choices"`
 | 
				
			||||||
	Error OpenAIError `json:"error"`
 | 
						Usage   `json:"usage"`
 | 
				
			||||||
 | 
						Error   OpenAIError `json:"error"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type OpenAITextResponseChoice struct {
 | 
					type OpenAITextResponseChoice struct {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user