@tiledesk/tiledesk-server 2.3.92 → 2.3.94
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -1
- package/channels/chat21/chat21WebHook.js +5 -2
- package/package.json +1 -1
- package/routes/faq_kb.js +19 -15
- package/services/chatbotService.js +1 -1
- package/services/subscriptionNotifier.js +5 -4
- package/services/trainingService.js +26 -14
- package/test/chatbot-mock.js +3 -3
- package/test/example-json.txt +1 -1
- package/test/faqkbRoute.js +10 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,8 +5,26 @@
|
|
|
5
5
|
🚀 IN PRODUCTION 🚀
|
|
6
6
|
(https://www.npmjs.com/package/@tiledesk/tiledesk-server/v/2.3.77)
|
|
7
7
|
|
|
8
|
+
# 2.3.93 -> PROD v3
|
|
9
|
+
- subscriptionNotifier secret fix
|
|
8
10
|
|
|
9
|
-
# 2.3.
|
|
11
|
+
# 2.3.92
|
|
12
|
+
- Apps module fix for public secret key
|
|
13
|
+
|
|
14
|
+
# 2.3.91
|
|
15
|
+
- subscription webhook fix for global webhook secret creation for token
|
|
16
|
+
- added jsonRequest field to subscriptionLog to save request body payload
|
|
17
|
+
|
|
18
|
+
# 2.3.90
|
|
19
|
+
- Dependency updated tiledesk-tybot-connector 0.1.59
|
|
20
|
+
|
|
21
|
+
# 2.3.89
|
|
22
|
+
- added as_attachment query parameter to images endpoint to download the images
|
|
23
|
+
|
|
24
|
+
# 2.3.88
|
|
25
|
+
- added score, publishedBy and publishedAt to bot model
|
|
26
|
+
|
|
27
|
+
# 2.3.87
|
|
10
28
|
- Geo Service fix with queue enabled
|
|
11
29
|
|
|
12
30
|
# 2.3.86
|
|
@@ -79,7 +79,7 @@ router.post('/', function (req, res) {
|
|
|
79
79
|
|
|
80
80
|
if (cacheEnabler.request) {
|
|
81
81
|
q.cache(cacheUtil.defaultTTL, "requests:request_id:"+message.recipient+":simple"); //request_cache
|
|
82
|
-
// project_id not available
|
|
82
|
+
// project_id not available //without project for chat21 webhook
|
|
83
83
|
winston.debug('request cache enabled');
|
|
84
84
|
}
|
|
85
85
|
return q.exec(function(err, request) {
|
|
@@ -391,6 +391,7 @@ router.post('/', function (req, res) {
|
|
|
391
391
|
var query = {request_id: recipient_id, id_project: projectId};
|
|
392
392
|
winston.debug('query:'+ projectId);
|
|
393
393
|
|
|
394
|
+
winston.debug('conversation-archived Request.findOne(query);:');
|
|
394
395
|
let q = Request.findOne(query);
|
|
395
396
|
// if (cacheEnabler.request) {
|
|
396
397
|
// q.cache(cacheUtil.defaultTTL, projectId+":requests:request_id:"+recipient_id+":simple"); //request_cache NOT IMPORTANT HERE
|
|
@@ -477,6 +478,7 @@ router.post('/', function (req, res) {
|
|
|
477
478
|
winston.debug("id_project: " + id_project);
|
|
478
479
|
|
|
479
480
|
// requestcachefarequi populaterequired
|
|
481
|
+
winston.debug('join-member Request.findOne(query);:');
|
|
480
482
|
return Request.findOne({request_id: request_id, id_project: id_project})
|
|
481
483
|
.populate('lead') //TODO posso prenderlo da snapshot senza populate cache_attention
|
|
482
484
|
.exec(function(err, request) {
|
|
@@ -647,6 +649,7 @@ else if (req.body.event_type == "typing-start") {
|
|
|
647
649
|
|
|
648
650
|
|
|
649
651
|
// requestcachefarequi nocachepopulatereqired
|
|
652
|
+
winston.debug('typing-start Request.findOne(query);:');
|
|
650
653
|
return Request.findOne({request_id: recipient_id})
|
|
651
654
|
//TOD errore cache sistemare e riabbilitare->
|
|
652
655
|
// .cache(cacheUtil.defaultTTL, req.projectid+":requests:request_id:"+recipient_id) cache_attention
|
|
@@ -847,7 +850,7 @@ else if (req.body.event_type == "new-group") {
|
|
|
847
850
|
res.json("new-group event_type is not implemented");
|
|
848
851
|
}
|
|
849
852
|
else {
|
|
850
|
-
winston.
|
|
853
|
+
winston.debug("Chat21WebHook error event_type not implemented", req.body);
|
|
851
854
|
res.json("Not implemented");
|
|
852
855
|
}
|
|
853
856
|
|
package/package.json
CHANGED
package/routes/faq_kb.js
CHANGED
|
@@ -525,7 +525,7 @@ router.post('/fork/:id_faq_kb', async (req, res) => {
|
|
|
525
525
|
})
|
|
526
526
|
|
|
527
527
|
|
|
528
|
-
router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) => {
|
|
528
|
+
router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), async (req, res) => {
|
|
529
529
|
|
|
530
530
|
let id_faq_kb = req.params.id_faq_kb;
|
|
531
531
|
winston.info('import on id_faq_kb: ', id_faq_kb);
|
|
@@ -545,7 +545,7 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
545
545
|
|
|
546
546
|
winston.info("intents only")
|
|
547
547
|
|
|
548
|
-
json.intents.forEach((intent) => {
|
|
548
|
+
await json.intents.forEach((intent) => {
|
|
549
549
|
|
|
550
550
|
let new_faq = {
|
|
551
551
|
id_faq_kb: id_faq_kb,
|
|
@@ -573,7 +573,7 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
573
573
|
winston.info("updated existing intent")
|
|
574
574
|
faqBotEvent.emit('faq.update', savingResult.value);
|
|
575
575
|
} else {
|
|
576
|
-
winston.info("new intent
|
|
576
|
+
winston.info("new intent created")
|
|
577
577
|
faqBotEvent.emit('faq.create', savingResult.value);
|
|
578
578
|
}
|
|
579
579
|
}
|
|
@@ -588,7 +588,7 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
588
588
|
winston.error("Duplicate intent_display_name.");
|
|
589
589
|
winston.info("Skip duplicated intent_display_name");
|
|
590
590
|
} else {
|
|
591
|
-
winston.info("new intent
|
|
591
|
+
winston.info("new intent created")
|
|
592
592
|
faqBotEvent.emit('faq.create', savedFaq);
|
|
593
593
|
}
|
|
594
594
|
}
|
|
@@ -596,17 +596,17 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
596
596
|
}
|
|
597
597
|
|
|
598
598
|
})
|
|
599
|
-
|
|
599
|
+
faqBotEvent.emit('faq_train.importedall', id_faq_kb);
|
|
600
600
|
return res.status(200).send({ success: true, msg: "Intents imported successfully" })
|
|
601
601
|
|
|
602
602
|
} else {
|
|
603
603
|
|
|
604
604
|
if (req.query.create && req.query.create == 'true') {
|
|
605
|
-
faqService.create(json.name, undefined, req.projectid, req.user.id, "tilebot", json.description, json.webhook_url, json.webhook_enabled, json.language, undefined, undefined, undefined, json.attributes).then((savedFaq_kb) => {
|
|
605
|
+
faqService.create(json.name, undefined, req.projectid, req.user.id, "tilebot", json.description, json.webhook_url, json.webhook_enabled, json.language, undefined, undefined, undefined, json.attributes).then( async (savedFaq_kb) => {
|
|
606
606
|
winston.debug("saved (and imported) faq kb: ", savedFaq_kb);
|
|
607
607
|
botEvent.emit('faqbot.create', savedFaq_kb);
|
|
608
608
|
|
|
609
|
-
json.intents.forEach((intent) => {
|
|
609
|
+
await json.intents.forEach((intent) => {
|
|
610
610
|
|
|
611
611
|
let new_faq = {
|
|
612
612
|
id_faq_kb: savedFaq_kb._id,
|
|
@@ -635,7 +635,7 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
635
635
|
winston.info("updated existing intent")
|
|
636
636
|
faqBotEvent.emit('faq.update', savingResult.value);
|
|
637
637
|
} else {
|
|
638
|
-
winston.info("new intent
|
|
638
|
+
winston.info("new intent created")
|
|
639
639
|
faqBotEvent.emit('faq.create', savingResult.value);
|
|
640
640
|
}
|
|
641
641
|
|
|
@@ -652,7 +652,7 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
652
652
|
winston.error("Duplicate intent_display_name.");
|
|
653
653
|
winston.info("Skip duplicated intent_display_name");
|
|
654
654
|
} else {
|
|
655
|
-
winston.info("new intent
|
|
655
|
+
winston.info("new intent created")
|
|
656
656
|
faqBotEvent.emit('faq.create', savedFaq);
|
|
657
657
|
}
|
|
658
658
|
}
|
|
@@ -660,6 +660,7 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
660
660
|
}
|
|
661
661
|
|
|
662
662
|
})
|
|
663
|
+
faqBotEvent.emit('faq_train.importedall', savedFaq_kb._id);
|
|
663
664
|
return res.status(200).send(savedFaq_kb);
|
|
664
665
|
|
|
665
666
|
}).catch((err) => {
|
|
@@ -699,15 +700,18 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
699
700
|
if (json.attributes) {
|
|
700
701
|
faq_kb.attributes = json.attributes;
|
|
701
702
|
}
|
|
703
|
+
// if (json.intentsEngine) {
|
|
704
|
+
// faq_kb.intentsEngine = json.intentsEngine;
|
|
705
|
+
// }
|
|
702
706
|
|
|
703
|
-
Faq_kb.findByIdAndUpdate(id_faq_kb, faq_kb, { new: true }, (err, updatedFaq_kb) => {
|
|
707
|
+
Faq_kb.findByIdAndUpdate(id_faq_kb, faq_kb, { new: true }, async (err, updatedFaq_kb) => {
|
|
704
708
|
if (err) {
|
|
705
709
|
return res.status(500).send({ success: false, msg: "Error updating bot." });
|
|
706
710
|
}
|
|
707
711
|
|
|
708
712
|
botEvent.emit('faqbot.update', updatedFaq_kb);
|
|
709
713
|
|
|
710
|
-
json.intents.forEach((intent) => {
|
|
714
|
+
await json.intents.forEach((intent) => {
|
|
711
715
|
|
|
712
716
|
let new_faq = {
|
|
713
717
|
id_faq_kb: updatedFaq_kb._id,
|
|
@@ -736,7 +740,7 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
736
740
|
winston.info("updated existing intent")
|
|
737
741
|
faqBotEvent.emit('faq.update', savingResult.value);
|
|
738
742
|
} else {
|
|
739
|
-
winston.info("new intent
|
|
743
|
+
winston.info("new intent created")
|
|
740
744
|
faqBotEvent.emit('faq.create', savingResult.value);
|
|
741
745
|
}
|
|
742
746
|
|
|
@@ -753,7 +757,7 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
753
757
|
winston.error("Duplicate intent_display_name.");
|
|
754
758
|
winston.info("Skip duplicated intent_display_name");
|
|
755
759
|
} else {
|
|
756
|
-
winston.info("new intent
|
|
760
|
+
winston.info("new intent created")
|
|
757
761
|
faqBotEvent.emit('faq.create', savedFaq);
|
|
758
762
|
}
|
|
759
763
|
}
|
|
@@ -761,7 +765,7 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
761
765
|
}
|
|
762
766
|
|
|
763
767
|
})
|
|
764
|
-
|
|
768
|
+
faqBotEvent.emit('faq_train.importedall', id_faq_kb);
|
|
765
769
|
return res.send(updatedFaq_kb);
|
|
766
770
|
|
|
767
771
|
})
|
|
@@ -796,7 +800,7 @@ router.get('/exportjson/:id_faq_kb', (req, res) => {
|
|
|
796
800
|
webhook_url: faq_kb.webhook_url,
|
|
797
801
|
language: faq_kb.language,
|
|
798
802
|
name: faq_kb.name,
|
|
799
|
-
|
|
803
|
+
type: faq_kb.type,
|
|
800
804
|
attributes: faq_kb.attributes,
|
|
801
805
|
intents: intents
|
|
802
806
|
}
|
|
@@ -69,6 +69,7 @@ class SubscriptionNotifier {
|
|
|
69
69
|
|
|
70
70
|
// winston.debug("s",s);
|
|
71
71
|
var secret = s.secret;
|
|
72
|
+
var xHookSecret = secret;
|
|
72
73
|
|
|
73
74
|
let sJson = s.toObject();
|
|
74
75
|
delete sJson.secret;
|
|
@@ -91,17 +92,17 @@ class SubscriptionNotifier {
|
|
|
91
92
|
if (alg) {
|
|
92
93
|
signOptions.algorithm = alg;
|
|
93
94
|
}
|
|
94
|
-
|
|
95
|
+
secret = process.env.GLOBAL_SECRET || config.secret;
|
|
95
96
|
var pKey = process.env.GLOBAL_SECRET_OR_PRIVATE_KEY;
|
|
96
97
|
// console.log("pKey",pKey);
|
|
97
98
|
|
|
98
99
|
if (pKey) {
|
|
99
|
-
|
|
100
|
+
secret = pKey.replace(/\\n/g, '\n');
|
|
100
101
|
}
|
|
101
102
|
|
|
102
103
|
}
|
|
103
104
|
|
|
104
|
-
var token = jwt.sign(sJson,
|
|
105
|
+
var token = jwt.sign(sJson, secret, signOptions); //priv_jwt pp_jwt
|
|
105
106
|
json["token"] = token;
|
|
106
107
|
|
|
107
108
|
winston.debug("Calling subscription " + s.event + " TO " + s.target + " with secret " +secret+ " with json " , json);
|
|
@@ -111,7 +112,7 @@ class SubscriptionNotifier {
|
|
|
111
112
|
url: s.target,
|
|
112
113
|
headers: {
|
|
113
114
|
'Content-Type' : 'application/json',
|
|
114
|
-
'x-hook-secret':
|
|
115
|
+
'x-hook-secret': xHookSecret,
|
|
115
116
|
'User-Agent': 'tiledesk-webhooks',
|
|
116
117
|
'Origin': webhook_origin
|
|
117
118
|
},
|
|
@@ -10,19 +10,27 @@ let chatbot_training_api_url = "http://34.65.210.38/model/train"
|
|
|
10
10
|
class TrainingService {
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
train(eventName, id_faq_kb) {
|
|
13
14
|
|
|
14
|
-
|
|
15
|
+
Faq_kb.findById(id_faq_kb, (err, faq_kb) => {
|
|
15
16
|
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
if (err) {
|
|
18
|
+
winston.error("train error: ", err)
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (!faq_kb) {
|
|
23
|
+
winston.error("faq_kb is undefined");
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
18
26
|
|
|
19
27
|
if (faq_kb.intentsEngine !== 'tiledesk-ai') {
|
|
20
28
|
winston.info("intentsEngine: off")
|
|
21
29
|
return null;
|
|
22
30
|
}
|
|
23
31
|
|
|
24
|
-
winston.
|
|
25
|
-
Faq.find({ id_faq_kb:
|
|
32
|
+
winston.debug("intentsEngine: on")
|
|
33
|
+
Faq.find({ id_faq_kb: id_faq_kb }, (err, faqs) => {
|
|
26
34
|
|
|
27
35
|
if (err) {
|
|
28
36
|
winston.error("[Training] find all error: ", err);
|
|
@@ -31,7 +39,7 @@ class TrainingService {
|
|
|
31
39
|
let json = {
|
|
32
40
|
"configuration": {
|
|
33
41
|
"language": faq_kb.language,
|
|
34
|
-
"pipeline":
|
|
42
|
+
"pipeline":["lstm"]
|
|
35
43
|
},
|
|
36
44
|
"model": faq_kb._id,
|
|
37
45
|
"nlu": []
|
|
@@ -76,23 +84,27 @@ class TrainingService {
|
|
|
76
84
|
start() {
|
|
77
85
|
winston.info('TrainingService start');
|
|
78
86
|
|
|
79
|
-
faqBotEvent.on('
|
|
87
|
+
faqBotEvent.on('faq_train.importedall', (id_faq_kb) => {
|
|
88
|
+
setImmediate(() => {
|
|
89
|
+
trainingService.train('faq.importedall', id_faq_kb);
|
|
90
|
+
})
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
faqBotEvent.on('faq_train.create', (id_faq_kb) => {
|
|
80
94
|
setImmediate(() => {
|
|
81
|
-
trainingService.train('
|
|
95
|
+
trainingService.train('faq_train.create', id_faq_kb);
|
|
82
96
|
})
|
|
83
97
|
})
|
|
84
98
|
|
|
85
|
-
faqBotEvent.on('
|
|
86
|
-
winston.debug("--> event faq: ", faq);
|
|
99
|
+
faqBotEvent.on('faq_train.update', (id_faq_kb) => {
|
|
87
100
|
setImmediate(() => {
|
|
88
|
-
trainingService.train('
|
|
101
|
+
trainingService.train('faq_train.update', id_faq_kb);
|
|
89
102
|
})
|
|
90
103
|
})
|
|
91
104
|
|
|
92
|
-
faqBotEvent.on('
|
|
93
|
-
console.log("--> event faq: ", faq);
|
|
105
|
+
faqBotEvent.on('faq_train.delete', (id_faq_kb) => {
|
|
94
106
|
setImmediate(() => {
|
|
95
|
-
trainingService.train('
|
|
107
|
+
trainingService.train('faq_train.delete', id_faq_kb);
|
|
96
108
|
})
|
|
97
109
|
})
|
|
98
110
|
|
package/test/chatbot-mock.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
const existing_chatbot_mock = {
|
|
2
2
|
_id: "63234fd6c69f188814749e1b",
|
|
3
3
|
webhook_enabled: false,
|
|
4
|
-
type: "
|
|
4
|
+
type: "tilebot",
|
|
5
5
|
secret: "a3577185-a8bf-4547-a000-6ba81ccb0460",
|
|
6
6
|
language: "en",
|
|
7
|
-
description: "
|
|
7
|
+
description: "A Tiledesk bot",
|
|
8
8
|
id_project: "63234fd6c69f188814749e15",
|
|
9
9
|
trashed: false,
|
|
10
10
|
createdBy: "system",
|
|
@@ -104,7 +104,7 @@ const existing_chatbot_mock = {
|
|
|
104
104
|
|
|
105
105
|
const empty_chatbot_mock = {
|
|
106
106
|
webhook_enabled: false,
|
|
107
|
-
type: '
|
|
107
|
+
type: 'tilebot',
|
|
108
108
|
secret: '0896478d-8eb3-4240-a6eb-cf2ea27b1a8e',
|
|
109
109
|
language: 'en',
|
|
110
110
|
public: false,
|
package/test/example-json.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"webhook_enabled":false,"language":"en","name":"examplebot","intents":[{"webhook_enabled":false,"enabled":true,"question":"\\start","answer":"Hi","intent_display_name":"start","language":"en"},{"webhook_enabled":false,"enabled":true,"question":"question1","answer":"question1","intent_display_name":"question1","language":"en"},{"webhook_enabled":false,"enabled":true,"question":"defaultFallback","answer":"I can not provide an adequate answer. Write a new question or talk to a human agent.\n* Back to start tdAction:start\n* See the docs https://docs.tiledesk.com/\n* 👨🏻🦰 I want an agent","intent_display_name":"defaultFallback","language":"en"}]}
|
|
1
|
+
{"webhook_enabled":false,"language":"en","name":"examplebot","intentsEngine":"tiledesk-ai","intents":[{"webhook_enabled":false,"enabled":true,"question":"\\start","answer":"Hi","intent_display_name":"start","language":"en"},{"webhook_enabled":false,"enabled":true,"question":"question1","answer":"question1","intent_display_name":"question1","language":"en"},{"webhook_enabled":false,"enabled":true,"question":"defaultFallback","answer":"I can not provide an adequate answer. Write a new question or talk to a human agent.\n* Back to start tdAction:start\n* See the docs https://docs.tiledesk.com/\n* 👨🏻🦰 I want an agent","intent_display_name":"defaultFallback","language":"en"}]}
|
package/test/faqkbRoute.js
CHANGED
|
@@ -30,6 +30,7 @@ describe('FaqKBRoute', () => {
|
|
|
30
30
|
describe('/create', () => {
|
|
31
31
|
|
|
32
32
|
|
|
33
|
+
|
|
33
34
|
it('create', (done) => {
|
|
34
35
|
|
|
35
36
|
|
|
@@ -53,7 +54,15 @@ describe('FaqKBRoute', () => {
|
|
|
53
54
|
expect(res.body.name).to.equal("testbot");
|
|
54
55
|
expect(res.body.language).to.equal("fr");
|
|
55
56
|
|
|
56
|
-
|
|
57
|
+
chai.request(server)
|
|
58
|
+
.get('/' + savedProject._id + '/faq_kb/' + res.body._id)
|
|
59
|
+
.auth(email, pwd)
|
|
60
|
+
.end((err, res) => {
|
|
61
|
+
console.log("res.body", res.body);
|
|
62
|
+
res.should.have.status(200);
|
|
63
|
+
|
|
64
|
+
done();
|
|
65
|
+
});
|
|
57
66
|
});
|
|
58
67
|
|
|
59
68
|
|