From d148d453b86a22f4d9ccf3ce7337878c074032fb Mon Sep 17 00:00:00 2001 From: junleea <354425203@qq.com> Date: Mon, 7 Apr 2025 18:00:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=B1=86=E5=8C=85=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E6=96=87=E4=BB=B6=E5=86=85=E5=AE=B9=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?,=E7=9B=AE=E5=89=8D=E5=9B=BE=E7=89=87=E5=B7=B2=E5=AE=8C?= =?UTF-8?q?=E6=88=90=EF=BC=8C=E6=96=87=E4=BB=B6=E5=86=85=E5=AE=B9=E6=9C=AA?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handler/im.go | 10 +++++----- proto/im.go | 1 + proto/status.go | 2 +- service/doubao.go | 14 ++++++++------ 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/handler/im.go b/handler/im.go index 2a3d08c..4fccc5f 100644 --- a/handler/im.go +++ b/handler/im.go @@ -206,13 +206,13 @@ func doReceiveGenChatMessage(userId int, sessionID *uint, data *proto.WSMessageR } var err error sessionName := "" - if data.IsImage { - var imgMsg proto.UserImageMsg - err = json.Unmarshal([]byte(data.Msg), &imgMsg) + if data.IsImage || data.IsFile { + var fileMsg proto.UserFileMessage + err = json.Unmarshal([]byte(data.Msg), &fileMsg) if err != nil { log.Println("Error parsing JSON:", err) } - sessionName = imgMsg.Text + sessionName = fileMsg.Text } else { sessionName = data.Msg } @@ -258,7 +258,7 @@ func doReceiveGenChatMessage(userId int, sessionID *uint, data *proto.WSMessageR var userMsgID uint status := proto.MsgHasRead - if data.IsImage { + if data.IsImage || data.IsFile { status = proto.UserToModelImageMsgType //图片类型 } //将消息存入数据库 diff --git a/proto/im.go b/proto/im.go index cd18f51..7df3b52 100644 --- a/proto/im.go +++ b/proto/im.go @@ -26,6 +26,7 @@ type WSMessageReq struct { ToID int `json:"to_id"` //接收者id ModelID uint `json:"model_id"` //模型id IsImage bool `json:"is_image"` //是否为图片(图片消息),如果是图片消息,则msg为图片消息结构为{"img_url":"","text":""} + IsFile bool `json:"is_file"` //是否为文件(文件消息),如果是文件消息,则msg为文件消息结构为{"file_url":"","text":""} } type ModelParam struct { diff --git a/proto/status.go b/proto/status.go index 0a843f1..9d9dfbd 100644 --- a/proto/status.go +++ b/proto/status.go @@ -167,7 +167,7 @@ const ( // 文件类型(文本、图片) const ( - DownloadFileBaseURL = "https://pm.ljsea.top/tool/" + DownloadFileBaseURL = "https://pm.ljsea.top/tool/file/" FileTypeText = "text_file" FileTypeImage = "image_file" ) diff --git a/service/doubao.go b/service/doubao.go index a27e731..0109480 100644 --- a/service/doubao.go +++ b/service/doubao.go @@ -86,7 +86,7 @@ func DouBaoV2(modelParam proto.ModelParam, imCtx *proto.IMParamContext) { ) ctx := context.Background() messages := make([]*model.ChatCompletionMessage, 0) - err := GetDouBaoSessionHistoryMsg(imCtx.SessionID, modelParam.System, &messages, imCtx.Question) + err := GetDouBaoSessionHistoryMsgV2(imCtx.SessionID, modelParam.System, &messages, imCtx.UserID) if err != nil { log.Println("get doubao session history message error:", err) } @@ -273,12 +273,13 @@ func GetDouBaoSessionHistoryMsgV2(sessionID int, systemPrompt string, messages * //只取最后的 SparkContextLength 条消息 msgs = msgs[len(msgs)-proto.DouBaoContextLength-1:] } - for _, v := range msgs { + //log.Println("get doubao session history message:", msgs) + for i, v := range msgs { var message model.ChatCompletionMessage if v.Type == proto.UserToModelMsgType { message.Role = model.ChatMessageRoleUser - //用户消息为有图片类型 - if v.Status == proto.UserToModelFileMsgType { + //用户消息为有图片类型且是最后一条消息 + if v.Status == proto.UserToModelFileMsgType && i == len(msgs)-1 { listValue, err2 := decodeFileMessageToDouBaoMessage(v.Msg, userID) if err2 != nil { log.Println("unmarshal user image message error:", err2) @@ -315,14 +316,15 @@ func decodeFileMessageToDouBaoMessage(msg string, userID int) ([]*model.ChatComp log.Println("DouBao unmarshal file message error:", err) return nil, err } + log.Println("doubaov2,decode file message:", fileMsgContent) var listValue []*model.ChatCompletionMessageContentPart for _, file := range fileMsgContent.FileContent { //文件消息为文本类型,则获取文本内容,若为图片则添加图片链接 if file.FileType == proto.FileTypeText { fileContents, err2 := FindFileContentV2(file.FileContent.FileID, userID) if err2 != nil { - log.Println("doubao find file content error:", err2) - return nil, err2 + log.Println("doubao find file content error:", err2, "\t,file id:", file.FileContent.FileID, "\t,file name:", file.FileContent.UserFileName) + continue } fileContent := fileContents[0].FileContent //文件文本内容