Compare commits

...

4 Commits

Author SHA1 Message Date
ckt1031
e2f5c1eb8c fix: channel testing for reverse proxy 2023-07-13 22:07:07 +08:00
ckt1031
d68aa4c96f fix: removing maxtokens 2023-07-13 21:28:14 +08:00
ckt1031
47cb77de53 fix: better text phrasing 2023-07-13 20:49:57 +08:00
ckt1031
61912f5e2c fix: patch testing 2023-07-13 19:40:36 +08:00
3 changed files with 62 additions and 9 deletions

View File

@@ -55,10 +55,14 @@ func testChannel(channel *model.Channel, request ChatRequest) error {
} }
if resp.StatusCode != http.StatusOK { if resp.StatusCode != http.StatusOK {
return errors.New("invalid status code: " + strconv.Itoa(resp.StatusCode)) // Prinnt the body in string
buf := new(bytes.Buffer)
buf.ReadFrom(resp.Body)
return errors.New("error response: " + strconv.Itoa(resp.StatusCode) + " " + buf.String())
} }
var streamResponseText string var done = false
var streamResponseText = ""
scanner := bufio.NewScanner(resp.Body) scanner := bufio.NewScanner(resp.Body)
scanner.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error) { scanner.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error) {
@@ -82,24 +86,52 @@ func testChannel(channel *model.Channel, request ChatRequest) error {
common.SysError("invalid stream response: " + data) common.SysError("invalid stream response: " + data)
continue continue
} }
// If data has event: event content inside, remove it, it can be prefix or inside the data
if strings.HasPrefix(data, "event:") || strings.Contains(data, "event:") {
// Remove event: event in the front or back
data = strings.TrimPrefix(data, "event: event")
data = strings.TrimSuffix(data, "event: event")
// Remove everything, only keep `data: {...}` <--- this is the json
// Find the start and end indices of `data: {...}` substring
startIndex := strings.Index(data, "data:")
endIndex := strings.LastIndex(data, "}")
// If both indices are found and end index is greater than start index
if startIndex != -1 && endIndex != -1 && endIndex > startIndex {
// Extract the `data: {...}` substring
data = data[startIndex : endIndex+1]
}
// Trim whitespace and newlines from the modified data string
data = strings.TrimSpace(data)
}
if !strings.HasPrefix(data, "data:") {
continue
}
data = data[6:] data = data[6:]
if !strings.HasPrefix(data, "[DONE]") { if !strings.HasPrefix(data, "[DONE]") {
var streamResponse ChatCompletionsStreamResponse var streamResponse ChatCompletionsStreamResponse
err = json.Unmarshal([]byte(data), &streamResponse) err = json.Unmarshal([]byte(data), &streamResponse)
if err != nil { if err != nil {
common.SysError("error unmarshalling stream response: " + err.Error()) // Prinnt the body in string
buf := new(bytes.Buffer)
buf.ReadFrom(resp.Body)
common.SysError("error unmarshalling stream response: " + err.Error() + " " + buf.String())
return err return err
} }
for _, choice := range streamResponse.Choices { for _, choice := range streamResponse.Choices {
streamResponseText += choice.Delta.Content streamResponseText += choice.Delta.Content
} }
} else {
done = true
break
} }
} }
defer resp.Body.Close() defer resp.Body.Close()
// Check if streaming is complete and streamResponseText is populated // Check if streaming is complete and streamResponseText is populated
if streamResponseText == "" { if streamResponseText == "" || !done {
return errors.New("Streaming not complete") return errors.New("Streaming not complete")
} }
@@ -109,12 +141,11 @@ func testChannel(channel *model.Channel, request ChatRequest) error {
func buildTestRequest() *ChatRequest { func buildTestRequest() *ChatRequest {
testRequest := &ChatRequest{ testRequest := &ChatRequest{
Model: "", // this will be set later Model: "", // this will be set later
MaxTokens: 1,
Stream: true, Stream: true,
} }
testMessage := Message{ testMessage := Message{
Role: "user", Role: "user",
Content: "hi", Content: "say hi word only",
} }
testRequest.Messages = append(testRequest.Messages, testMessage) testRequest.Messages = append(testRequest.Messages, testMessage)
return testRequest return testRequest

View File

@@ -278,6 +278,28 @@ func relayTextHelper(c *gin.Context, relayMode int) *OpenAIErrorWithStatusCode {
common.SysError("invalid stream response: " + data) common.SysError("invalid stream response: " + data)
continue continue
} }
// If data has event: event content inside, remove it, it can be prefix or inside the data
if strings.HasPrefix(data, "event:") || strings.Contains(data, "event:") {
// Remove event: event in the front or back
data = strings.TrimPrefix(data, "event: event")
data = strings.TrimSuffix(data, "event: event")
// Remove everything, only keep `data: {...}` <--- this is the json
// Find the start and end indices of `data: {...}` substring
startIndex := strings.Index(data, "data:")
endIndex := strings.LastIndex(data, "}")
// If both indices are found and end index is greater than start index
if startIndex != -1 && endIndex != -1 && endIndex > startIndex {
// Extract the `data: {...}` substring
data = data[startIndex : endIndex+1]
}
// Trim whitespace and newlines from the modified data string
data = strings.TrimSpace(data)
}
if !strings.HasPrefix(data, "data:") {
continue
}
dataChan <- data dataChan <- data
data = data[6:] data = data[6:]
if !strings.HasPrefix(data, "[DONE]") { if !strings.HasPrefix(data, "[DONE]") {

View File

@@ -44,7 +44,7 @@ type GeneralOpenAIRequest struct {
type ChatRequest struct { type ChatRequest struct {
Model string `json:"model"` Model string `json:"model"`
Messages []Message `json:"messages"` Messages []Message `json:"messages"`
MaxTokens int `json:"max_tokens"` MaxTokens *int `json:"max_tokens,omitempty"`
Stream bool `json:"stream"` Stream bool `json:"stream"`
} }