mirror of
				https://github.com/songquanpeng/one-api.git
				synced 2025-11-04 15:53:42 +08:00 
			
		
		
		
	fix: ignore empty choice response for azure (close #1324)
This commit is contained in:
		@@ -15,6 +15,12 @@ import (
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	dataPrefix       = "data: "
 | 
			
		||||
	done             = "[DONE]"
 | 
			
		||||
	dataPrefixLength = len(dataPrefix)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func StreamHandler(c *gin.Context, resp *http.Response, relayMode int) (*model.ErrorWithStatusCode, string, *model.Usage) {
 | 
			
		||||
	responseText := ""
 | 
			
		||||
	scanner := bufio.NewScanner(resp.Body)
 | 
			
		||||
@@ -36,23 +42,30 @@ func StreamHandler(c *gin.Context, resp *http.Response, relayMode int) (*model.E
 | 
			
		||||
	go func() {
 | 
			
		||||
		for scanner.Scan() {
 | 
			
		||||
			data := scanner.Text()
 | 
			
		||||
			if len(data) < 6 { // ignore blank line or wrong format
 | 
			
		||||
			if len(data) < dataPrefixLength { // ignore blank line or wrong format
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			if data[:6] != "data: " && data[:6] != "[DONE]" {
 | 
			
		||||
			if data[:dataPrefixLength] != dataPrefix && data[:dataPrefixLength] != done {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			if strings.HasPrefix(data[dataPrefixLength:], done) {
 | 
			
		||||
				dataChan <- data
 | 
			
		||||
			data = data[6:]
 | 
			
		||||
			if !strings.HasPrefix(data, "[DONE]") {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			switch relayMode {
 | 
			
		||||
			case relaymode.ChatCompletions:
 | 
			
		||||
				var streamResponse ChatCompletionsStreamResponse
 | 
			
		||||
					err := json.Unmarshal([]byte(data), &streamResponse)
 | 
			
		||||
				err := json.Unmarshal([]byte(data[dataPrefixLength:]), &streamResponse)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					logger.SysError("error unmarshalling stream response: " + err.Error())
 | 
			
		||||
					dataChan <- data // if error happened, pass the data to client
 | 
			
		||||
					continue         // just ignore the error
 | 
			
		||||
				}
 | 
			
		||||
				if len(streamResponse.Choices) == 0 {
 | 
			
		||||
					// but for empty choice, we should not pass it to client, this is for azure
 | 
			
		||||
					continue // just ignore empty choice
 | 
			
		||||
				}
 | 
			
		||||
				dataChan <- data
 | 
			
		||||
				for _, choice := range streamResponse.Choices {
 | 
			
		||||
					responseText += conv.AsString(choice.Delta.Content)
 | 
			
		||||
				}
 | 
			
		||||
@@ -60,8 +73,9 @@ func StreamHandler(c *gin.Context, resp *http.Response, relayMode int) (*model.E
 | 
			
		||||
					usage = streamResponse.Usage
 | 
			
		||||
				}
 | 
			
		||||
			case relaymode.Completions:
 | 
			
		||||
				dataChan <- data
 | 
			
		||||
				var streamResponse CompletionsStreamResponse
 | 
			
		||||
					err := json.Unmarshal([]byte(data), &streamResponse)
 | 
			
		||||
				err := json.Unmarshal([]byte(data[dataPrefixLength:]), &streamResponse)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					logger.SysError("error unmarshalling stream response: " + err.Error())
 | 
			
		||||
					continue
 | 
			
		||||
@@ -71,7 +85,6 @@ func StreamHandler(c *gin.Context, resp *http.Response, relayMode int) (*model.E
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		}
 | 
			
		||||
		stopChan <- true
 | 
			
		||||
	}()
 | 
			
		||||
	common.SetEventStreamHeaders(c)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user