coai/adapter/dify/processor.go
Sh1n3zZ 628b0ba8d2
Some checks failed
Build Test / release (18.x) (push) Has been cancelled
Docker Image CI / build (push) Has been cancelled
feat: add dify channel
2025-04-13 02:49:35 +08:00

68 lines
1.8 KiB
Go

package dify
import (
"chat/globals"
"chat/utils"
"errors"
"fmt"
)
func processChatResponse(data string) *ChatResponse {
if form := utils.UnmarshalForm[ChatResponse](data); form != nil {
return form
}
return nil
}
func processChatStreamResponse(data string) *ChatStreamResponse {
if form := utils.UnmarshalForm[ChatStreamResponse](data); form != nil {
return form
}
return nil
}
func processChatErrorResponse(data string) *ChatStreamErrorResponse {
if form := utils.UnmarshalForm[ChatStreamErrorResponse](data); form != nil {
return form
}
return nil
}
func processStreamResponse(data string) (*globals.Chunk, bool, error) {
if data == "" {
return &globals.Chunk{Content: ""}, false, nil
}
streamData := processChatStreamResponse(data)
if streamData == nil {
return &globals.Chunk{Content: ""}, false, nil
}
switch streamData.Event {
case "message":
if streamData.Answer != "" {
return &globals.Chunk{
Content: streamData.Answer,
}, false, nil
}
case "message_end":
return &globals.Chunk{
Content: "",
}, true, nil
case "error":
if streamData.Code != "" && streamData.Message != "" {
return nil, false, errors.New(fmt.Sprintf("dify error: %s (code: %s)", streamData.Message, streamData.Code))
}
return nil, false, errors.New("dify error: conversation failed")
case "workflow_started", "node_started", "node_finished", "workflow_finished", "iteration_started", "iteration_next", "iteration_finished", "iteration_completed", "parallel_branch_started", "parallel_branch_finished", "ping":
return &globals.Chunk{Content: ""}, false, nil
}
errorResp := processChatErrorResponse(data)
if errorResp != nil {
return nil, false, errors.New(fmt.Sprintf("dify error: %s (code: %s)", errorResp.Message, errorResp.Code))
}
return &globals.Chunk{Content: ""}, false, nil
}