69 lines
1.6 KiB
Go
69 lines
1.6 KiB
Go
package adapter
|
|
|
|
import (
|
|
"cs-agent/internal/models"
|
|
"cs-agent/internal/pkg/enums"
|
|
"cs-agent/internal/pkg/utils"
|
|
"cs-agent/internal/repositories"
|
|
|
|
"github.com/cloudwego/eino/schema"
|
|
"github.com/mlogclub/simple/sqls"
|
|
)
|
|
|
|
const defaultHistoryLimit = 12
|
|
|
|
type HistoryBuildResult struct {
|
|
Messages []*schema.Message
|
|
RawItems []models.Message
|
|
}
|
|
|
|
func BuildHistoryMessages(conversationID int64, currentMessageID int64, limit int) HistoryBuildResult {
|
|
if conversationID <= 0 {
|
|
return HistoryBuildResult{}
|
|
}
|
|
if limit <= 0 {
|
|
limit = defaultHistoryLimit
|
|
}
|
|
items := repositories.MessageRepository.Find(sqls.DB(), sqls.NewCnd().
|
|
Eq("conversation_id", conversationID).
|
|
Desc("id").
|
|
Limit(limit+1))
|
|
for i, j := 0, len(items)-1; i < j; i, j = i+1, j-1 {
|
|
items[i], items[j] = items[j], items[i]
|
|
}
|
|
ret := HistoryBuildResult{
|
|
Messages: make([]*schema.Message, 0, len(items)),
|
|
RawItems: make([]models.Message, 0, len(items)),
|
|
}
|
|
for _, item := range items {
|
|
if item.ID == currentMessageID {
|
|
continue
|
|
}
|
|
msg := BuildSchemaMessage(&item)
|
|
if msg == nil {
|
|
continue
|
|
}
|
|
ret.RawItems = append(ret.RawItems, item)
|
|
ret.Messages = append(ret.Messages, msg)
|
|
}
|
|
return ret
|
|
}
|
|
|
|
func BuildSchemaMessage(item *models.Message) *schema.Message {
|
|
if item == nil {
|
|
return nil
|
|
}
|
|
content := utils.BuildRuntimeMessageText(item.MessageType, item.Content)
|
|
if content == "" {
|
|
return nil
|
|
}
|
|
switch item.SenderType {
|
|
case enums.IMSenderTypeCustomer:
|
|
return schema.UserMessage(content)
|
|
case enums.IMSenderTypeAI, enums.IMSenderTypeAgent:
|
|
return schema.AssistantMessage(content, nil)
|
|
default:
|
|
return nil
|
|
}
|
|
}
|