Improve OpenAI message parsing and error handling

- Enhanced error handling in OpenAI message processing
- Added colored console output for JSON parsing errors
- Updated Error struct to support flexible code type
- Improved message type and done state setting for various error scenarios
- Added support for parsing different error message formats
This commit is contained in:
Max 2025-02-01 11:26:11 +08:00
parent 54e946c61d
commit 6ac0406ad4
2 changed files with 33 additions and 4 deletions

View file

@ -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

View file

@ -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
}