Files
kim.dev.6789 b7f8db7d08 复制项目
2026-01-14 22:35:45 +08:00

93 lines
2.4 KiB
Go

package bot
import (
"context"
"encoding/json"
"time"
"git.imall.cloud/openim/chat/pkg/botstruct"
"git.imall.cloud/openim/chat/pkg/common/imapi"
"git.imall.cloud/openim/chat/pkg/common/mctx"
"git.imall.cloud/openim/chat/pkg/protocol/bot"
"git.imall.cloud/openim/protocol/constant"
"github.com/openimsdk/tools/errs"
"github.com/sashabaranov/go-openai"
)
func (b *botSvr) SendBotMessage(ctx context.Context, req *bot.SendBotMessageReq) (*bot.SendBotMessageResp, error) {
agent, err := b.database.TakeAgent(ctx, req.AgentID)
if err != nil {
return nil, errs.ErrArgs.WrapMsg("agent not found")
}
//convRespID, err := b.database.TakeConversationRespID(ctx, req.ConversationID, req.AgentID)
//if err != nil && !errors.Is(err, mongo.ErrNoDocuments) {
// return nil, err
//}
//var respID string
//if convRespID != nil {
// respID = convRespID.PreviousResponseID
//}
aiCfg := openai.DefaultConfig(agent.Key)
aiCfg.BaseURL = agent.Url
aiCfg.HTTPClient = b.httpClient
client := openai.NewClientWithConfig(aiCfg)
aiReq := openai.ChatCompletionRequest{
Model: agent.Model,
Messages: []openai.ChatCompletionMessage{
{
Role: openai.ChatMessageRoleSystem,
Content: agent.Prompts,
},
{
Role: openai.ChatMessageRoleUser,
Content: req.Content,
},
},
}
aiCtx, cancel := context.WithTimeout(ctx, time.Duration(b.timeout)*time.Second)
defer cancel()
completion, err := client.CreateChatCompletion(aiCtx, aiReq)
if err != nil {
return nil, errs.Wrap(err)
}
imToken, err := b.imCaller.ImAdminTokenWithDefaultAdmin(ctx)
if err != nil {
return nil, err
}
ctx = mctx.WithApiToken(ctx, imToken)
content := "no response"
if len(completion.Choices) > 0 {
content = completion.Choices[0].Message.Content
}
err = b.imCaller.SendSimpleMsg(ctx, &imapi.SendSingleMsgReq{
SendID: agent.UserID,
Content: content,
}, req.Key)
if err != nil {
return nil, err
}
//err = b.database.UpdateConversationRespID(ctx, req.ConversationID, agent.UserID, ToDBConversationRespIDUpdate(completion.ID))
//if err != nil {
// return nil, err
//}
return &bot.SendBotMessageResp{}, nil
}
func getContent(contentType int32, content string) (string, error) {
switch contentType {
case constant.Text:
var elem botstruct.TextElem
err := json.Unmarshal([]byte(content), &elem)
if err != nil {
return "", errs.ErrArgs.WrapMsg(err.Error())
}
return elem.Content, nil
default:
return "", errs.New("un support contentType").Wrap()
}
}