diff --git a/neo/message/message.go b/neo/message/message.go index 3b8d3dba..bbcbe1c1 100644 --- a/neo/message/message.go +++ b/neo/message/message.go @@ -191,7 +191,11 @@ func NewOpenAI(data []byte) *Message { case strings.Contains(text, `"delta":{`) && strings.Contains(text, `"tool_calls"`): var toolCalls openai.ToolCalls if err := jsoniter.Unmarshal(data, &toolCalls); err != nil { - msg.Text = err.Error() + "\n" + string(data) + color.Red("JSON parse error: %s", err.Error()) + color.White(string(data)) + msg.Text = "JSON parse error\n" + string(data) + msg.Type = "error" + msg.IsDone = true return msg } @@ -205,7 +209,11 @@ func NewOpenAI(data []byte) *Message { case strings.Contains(text, `"delta":{`) && strings.Contains(text, `"content":`): var message openai.Message if err := jsoniter.Unmarshal(data, &message); err != nil { - msg.Text = err.Error() + "\n" + string(data) + color.Red("JSON parse error: %s", err.Error()) + color.White(string(data)) + msg.Text = "JSON parse error\n" + string(data) + msg.Type = "error" + msg.IsDone = true return msg } @@ -214,14 +222,35 @@ func NewOpenAI(data []byte) *Message { msg.Text = message.Choices[0].Delta.Content } + case strings.Index(text, `{"code":`) == 0: + var errorMessage openai.Error + if err := jsoniter.UnmarshalFromString(text, &errorMessage); err != nil { + color.Red("JSON parse error: %s", err.Error()) + color.White(string(data)) + msg.Text = "JSON parse error\n" + string(data) + msg.Type = "error" + msg.IsDone = true + return msg + } + msg.Type = "error" + msg.Text = errorMessage.Message + msg.IsDone = true + break + case strings.Contains(text, `{"error":{`): var errorMessage openai.ErrorMessage if err := jsoniter.Unmarshal(data, &errorMessage); err != nil { - msg.Text = err.Error() + "\n" + string(data) + color.Red("JSON parse error: %s", err.Error()) + color.White(string(data)) + msg.Text = "JSON parse error\n" + string(data) + msg.Type = "error" + msg.IsDone = true return msg } msg.Type = "error" msg.Text = errorMessage.Error.Message + msg.IsDone = true + break case strings.Contains(text, `[DONE]`): msg.IsDone = true diff --git a/openai/types.go b/openai/types.go index 3c99ce7a..0c6d58b4 100644 --- a/openai/types.go +++ b/openai/types.go @@ -48,5 +48,5 @@ type Error struct { Message string `json:"message,omitempty"` Type string `json:"type,omitempty"` Param interface{} `json:"param,omitempty"` - Code string `json:"code,omitempty"` + Code any `json:"code,omitempty"` // string or int }