Skip to content

Commit 452299a

Browse files
authored
feat: optimize wecom bot provider for better streaming response (casibase#1635)
1 parent 5f81a47 commit 452299a

File tree

2 files changed

+51
-33
lines changed

2 files changed

+51
-33
lines changed

controllers/wecom_bot.go

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"github.com/beego/beego/logs"
2222
"github.com/casibase/casibase/model"
2323
"github.com/casibase/casibase/object"
24+
"github.com/casibase/casibase/util"
2425
"github.com/workweixin/weworkapi_golang/json_callback/wxbizjsonmsgcrypt"
2526
)
2627

@@ -35,7 +36,6 @@ func (c *ApiController) WecomBotVerifyUrl() {
3536
timestamp := c.GetString("timestamp")
3637
nonce := c.GetString("nonce")
3738
echoStr := c.GetString("echostr")
38-
logs.Debug("botID: %s, msgSignature: %s, timestamp: %s, nonce: %s, echoStr: %s", botId, msgSignature, timestamp, nonce, echoStr)
3939

4040
token, encodingAESKey, err := object.GetWecomBotTokenAndKey(botId)
4141
if err != nil {
@@ -51,7 +51,6 @@ func (c *ApiController) WecomBotVerifyUrl() {
5151
return
5252
}
5353

54-
logs.Debug("[WechatWork Bot] URL verified for botID: %s\n", botId)
5554
c.Ctx.ResponseWriter.Write(result)
5655
}
5756

@@ -90,14 +89,12 @@ func (c *ApiController) WecomBotHandleMessage() {
9089
return
9190
}
9291

93-
logs.Debug("[WechatWork Bot] Received message, botID: %s, msgtype: %s, msgid: %s\n", botId, message.MsgType, message.MsgId)
94-
9592
var responseMsg string
9693
switch message.MsgType {
97-
case "text":
94+
case "text", "stream":
9895
responseMsg, cryptErr = c.handleTextMessage(&message, wxcpt, nonce, timestamp)
9996
default:
100-
logs.Debug("[WechatWork Bot] Unsupported message type: %s\n", message.MsgType)
97+
logs.Error("[WechatWork Bot] Unsupported message type: %s\n", message.MsgType)
10198
c.Ctx.ResponseWriter.Write([]byte("success"))
10299
return
103100
}
@@ -112,24 +109,40 @@ func (c *ApiController) WecomBotHandleMessage() {
112109
}
113110

114111
func (c *ApiController) handleTextMessage(message *object.WecomBotMessage, wxcpt *wxbizjsonmsgcrypt.WXBizMsgCrypt, nonce, timestamp string) (string, *wxbizjsonmsgcrypt.CryptError) {
115-
if message.Text == nil {
116-
return "", wxbizjsonmsgcrypt.NewCryptError(wxbizjsonmsgcrypt.ParseJsonError, "text content is empty")
117-
}
118-
119-
content := message.Text.Content
120-
logs.Debug("[WechatWork Bot] Text message from %s: %s\n", message.From.UserId, content)
121-
122-
store, err := object.GetDefaultStore("admin")
123-
if err != nil {
124-
return "", wxbizjsonmsgcrypt.NewCryptError(wxbizjsonmsgcrypt.IllegalBuffer, fmt.Sprintf("get default store error: %v", err))
125-
}
126-
answer, err := sendMessage(store, content)
127-
if err != nil {
128-
return "", wxbizjsonmsgcrypt.NewCryptError(wxbizjsonmsgcrypt.IllegalBuffer, fmt.Sprintf("send message error: %v", err))
129-
}
130-
logs.Debug("[WechatWork Bot] AI response: %s\n", answer)
131-
132-
resp, err := object.MakeTextResponse(answer)
112+
content := ""
113+
if message.Text != nil {
114+
content = message.Text.Content
115+
}
116+
117+
var streamId string
118+
if message.Stream != nil && message.Stream.Id != "" {
119+
streamId = message.Stream.Id
120+
} else {
121+
streamId = util.GenerateId()
122+
}
123+
124+
answer := ""
125+
ans, ok := object.WecomBotMessageCache[streamId]
126+
if !ok {
127+
object.WecomBotMessageCache[streamId] = ""
128+
go func() {
129+
store, err := object.GetDefaultStore("admin")
130+
if err != nil {
131+
return
132+
}
133+
response, _ := sendMessage(store, content)
134+
if err != nil {
135+
delete(object.WecomBotMessageCache, streamId)
136+
return
137+
}
138+
object.WecomBotMessageCache[streamId] = response
139+
}()
140+
} else if ans != "" {
141+
answer = ans
142+
delete(object.WecomBotMessageCache, streamId)
143+
}
144+
145+
resp, err := object.MakeMsgResponse(answer, streamId)
133146
if err != nil {
134147
return "", wxbizjsonmsgcrypt.NewCryptError(wxbizjsonmsgcrypt.GenJsonError, err.Error())
135148
}

object/wecom_bot.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ import (
1919
"fmt"
2020
)
2121

22-
var WecomBotCache = make(map[string]Provider)
22+
var (
23+
WecomBotCache = make(map[string]Provider)
24+
WecomBotMessageCache = make(map[string]string)
25+
)
2326

2427
type WecomBotMessage struct {
2528
MsgId string `json:"msgid"`
@@ -71,9 +74,9 @@ type ImageItem struct {
7174
Md5 string `json:"md5"`
7275
}
7376

74-
type TextResponse struct {
75-
MsgType string `json:"msgtype"`
76-
Text *TextMessage `json:"text"`
77+
type MsgResponse struct {
78+
MsgType string `json:"msgtype"`
79+
Stream *StreamSend `json:"stream"`
7780
}
7881

7982
func GetWecomBotTokenAndKey(botID string) (string, string, error) {
@@ -95,11 +98,13 @@ func GetWecomBotTokenAndKey(botID string) (string, string, error) {
9598
return "", "", fmt.Errorf("not found provider for bot %s", botID)
9699
}
97100

98-
func MakeTextResponse(content string) (string, error) {
99-
msg := map[string]interface{}{
100-
"msgtype": "text",
101-
"text": map[string]interface{}{
102-
"content": content,
101+
func MakeMsgResponse(content string, streamId string) (string, error) {
102+
msg := MsgResponse{
103+
MsgType: "stream",
104+
Stream: &StreamSend{
105+
ID: streamId,
106+
Finish: content != "",
107+
Content: content,
103108
},
104109
}
105110

0 commit comments

Comments
 (0)