@tiledesk/tiledesk-server 2.10.93 → 2.10.95
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 +8 -0
- package/package.json +3 -3
- package/routes/kb.js +22 -12
- package/services/Scheduler.js +12 -6
- package/services/logsService.js +4 -4
- package/test/kbRoute.js +53 -5
- package/test/openaiRoute.js +4 -1
package/CHANGELOG.md
CHANGED
@@ -5,6 +5,14 @@
|
|
5
5
|
🚀 IN PRODUCTION 🚀
|
6
6
|
(https://www.npmjs.com/package/@tiledesk/tiledesk-server/v/2.3.77)
|
7
7
|
|
8
|
+
# 2.10.95
|
9
|
+
- Added: support for hybrid search
|
10
|
+
- Added: support for chunks_only option
|
11
|
+
- Added: support for native logs
|
12
|
+
|
13
|
+
# 2.10.94
|
14
|
+
- Update: fix uncaughtException in tagSchedule method
|
15
|
+
|
8
16
|
# 2.10.93
|
9
17
|
- Added: endpoints to import/export namespaces
|
10
18
|
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "@tiledesk/tiledesk-server",
|
3
3
|
"description": "The Tiledesk server module",
|
4
|
-
"version": "2.10.
|
4
|
+
"version": "2.10.95",
|
5
5
|
"scripts": {
|
6
6
|
"start": "node ./bin/www",
|
7
7
|
"pretest": "mongodb-runner start",
|
@@ -47,13 +47,13 @@
|
|
47
47
|
"@tiledesk/tiledesk-messenger-connector": "^0.1.23",
|
48
48
|
"@tiledesk/tiledesk-rasa-connector": "^1.0.10",
|
49
49
|
"@tiledesk/tiledesk-telegram-connector": "^0.1.14",
|
50
|
-
"@tiledesk/tiledesk-tybot-connector": "^2.0.
|
50
|
+
"@tiledesk/tiledesk-tybot-connector": "^2.0.19",
|
51
51
|
"@tiledesk/tiledesk-whatsapp-connector": "^0.1.83",
|
52
52
|
"@tiledesk/tiledesk-whatsapp-jobworker": "^0.0.12",
|
53
53
|
"@tiledesk/tiledesk-sms-connector": "^0.1.11",
|
54
54
|
"@tiledesk/tiledesk-vxml-connector": "^0.1.76",
|
55
55
|
"@tiledesk/tiledesk-voice-twilio-connector": "^0.1.22",
|
56
|
-
"@tiledesk/tiledesk-multi-worker": "^0.3.
|
56
|
+
"@tiledesk/tiledesk-multi-worker": "^0.3.2",
|
57
57
|
"passport-oauth2": "^1.8.0",
|
58
58
|
"amqplib": "^0.5.5",
|
59
59
|
"app-root-path": "^3.0.0",
|
package/routes/kb.js
CHANGED
@@ -57,8 +57,9 @@ let default_preview_settings = {
|
|
57
57
|
max_tokens: 256,
|
58
58
|
temperature: 0.7,
|
59
59
|
top_k: 4,
|
60
|
-
|
60
|
+
alpha: 0.5,
|
61
61
|
context: null
|
62
|
+
//context: "You are an awesome AI Assistant."
|
62
63
|
}
|
63
64
|
let default_engine = {
|
64
65
|
name: "pinecone",
|
@@ -93,10 +94,6 @@ router.post('/scrape/single', async (req, res) => {
|
|
93
94
|
let data = req.body;
|
94
95
|
winston.debug("/scrape/single data: ", data);
|
95
96
|
|
96
|
-
// if (!data.scrape_type) {
|
97
|
-
// data.scrape_type = 1;
|
98
|
-
// }
|
99
|
-
|
100
97
|
let namespaces = await Namespace.find({ id_project: project_id }).catch((err) => {
|
101
98
|
winston.error("find namespaces error: ", err)
|
102
99
|
res.status(500).send({ success: false, error: err })
|
@@ -137,11 +134,6 @@ router.post('/scrape/single', async (req, res) => {
|
|
137
134
|
json.content = kb.content;
|
138
135
|
}
|
139
136
|
|
140
|
-
// json.scrape_type = 1;
|
141
|
-
// if (data.scrape_type) {
|
142
|
-
// json.scrape_type = data.scrape_type;
|
143
|
-
// }
|
144
|
-
|
145
137
|
if (kb.scrape_type) {
|
146
138
|
json.scrape_type = kb.scrape_type
|
147
139
|
}
|
@@ -157,6 +149,10 @@ router.post('/scrape/single', async (req, res) => {
|
|
157
149
|
let ns = namespaces.find(n => n.id === kb.namespace);
|
158
150
|
json.engine = ns.engine || default_engine;
|
159
151
|
|
152
|
+
if (json.engine.type === 'serverless') {
|
153
|
+
json.hybrid = true;
|
154
|
+
}
|
155
|
+
|
160
156
|
winston.verbose("/scrape/single json: ", json);
|
161
157
|
|
162
158
|
startScrape(json).then((response) => {
|
@@ -302,12 +298,17 @@ router.post('/qa', async (req, res) => {
|
|
302
298
|
|
303
299
|
let ns = namespaces.find(n => n.id === data.namespace);
|
304
300
|
data.engine = ns.engine || default_engine;
|
301
|
+
|
302
|
+
if (data.engine.type === 'serverless') {
|
303
|
+
data.search_type = 'hybrid';
|
304
|
+
}
|
305
|
+
|
305
306
|
|
306
307
|
delete data.advancedPrompt;
|
307
308
|
winston.verbose("ask data: ", data);
|
308
309
|
|
309
310
|
if (process.env.NODE_ENV === 'test') {
|
310
|
-
return res.status(200).send({ success: true, message: "Question skipped in test environment"});
|
311
|
+
return res.status(200).send({ success: true, message: "Question skipped in test environment", data: data });
|
311
312
|
}
|
312
313
|
|
313
314
|
data.debug = true;
|
@@ -1217,6 +1218,10 @@ router.post('/', async (req, res) => {
|
|
1217
1218
|
let ns = namespaces.find(n => n.id === body.namespace);
|
1218
1219
|
json.engine = ns.engine || default_engine;
|
1219
1220
|
|
1221
|
+
if (json.engine.type === 'serverless') {
|
1222
|
+
json.hybrid = true;
|
1223
|
+
}
|
1224
|
+
|
1220
1225
|
let resources = [];
|
1221
1226
|
|
1222
1227
|
resources.push(json);
|
@@ -1341,9 +1346,14 @@ router.post('/multi', upload.single('uploadFile'), async (req, res) => {
|
|
1341
1346
|
let ns = namespaces.find(n => n.id === namespace_id);
|
1342
1347
|
let engine = ns.engine || default_engine;
|
1343
1348
|
|
1349
|
+
let hybrid;
|
1350
|
+
if (engine.type === 'serverless') {
|
1351
|
+
hybrid = true;
|
1352
|
+
}
|
1353
|
+
|
1344
1354
|
let resources = result.map(({ name, status, __v, createdAt, updatedAt, id_project, ...keepAttrs }) => keepAttrs)
|
1345
1355
|
resources = resources.map(({ _id, scrape_options, ...rest }) => {
|
1346
|
-
return { id: _id, webhook: webhook, parameters_scrape_type_4: scrape_options, engine: engine, ...rest}
|
1356
|
+
return { id: _id, webhook: webhook, parameters_scrape_type_4: scrape_options, engine: engine, hybrid: hybrid, ...rest}
|
1347
1357
|
});
|
1348
1358
|
winston.verbose("resources to be sent to worker: ", resources);
|
1349
1359
|
|
package/services/Scheduler.js
CHANGED
@@ -32,13 +32,19 @@ class Scheduler {
|
|
32
32
|
tagSchedule(data, callback) {
|
33
33
|
|
34
34
|
winston.debug("(tagScheduler) data: ", data);
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
callback
|
35
|
+
try {
|
36
|
+
this.jobManager.publish(data);
|
37
|
+
let response_data = { success: true, message: "Scheduled" };
|
38
|
+
if (callback) {
|
39
|
+
callback(null, response_data);
|
40
|
+
}
|
41
|
+
} catch(err) {
|
42
|
+
let response_data = { success: false, message: "Task not scheduled" };
|
43
|
+
if (callback) {
|
44
|
+
callback(err, response_data);
|
45
|
+
}
|
39
46
|
}
|
40
|
-
|
41
|
-
// })
|
47
|
+
|
42
48
|
}
|
43
49
|
|
44
50
|
}
|
package/services/logsService.js
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
const { FlowLogs } = require("../models/flowLogs");
|
4
4
|
const default_log_level = 'info';
|
5
5
|
|
6
|
-
const levels = { error: 0, warn: 1, info: 2, debug: 3 };
|
6
|
+
const levels = { error: 0, warn: 1, info: 2, debug: 3, native: 4 };
|
7
7
|
|
8
8
|
class LogsService {
|
9
9
|
|
@@ -16,7 +16,7 @@ class LogsService {
|
|
16
16
|
return FlowLogs.aggregate([
|
17
17
|
{ $match: { request_id: request_id } },
|
18
18
|
{ $unwind: "$rows" },
|
19
|
-
{ $match: { "rows.nlevel": { $
|
19
|
+
{ $match: { "rows.nlevel": { $lte: nlevel } } },
|
20
20
|
{ $sort: { "rows.timestamp": -1, "rows._id": -1 } },
|
21
21
|
{ $limit: limit }
|
22
22
|
]).then(rows => rows.reverse())
|
@@ -31,7 +31,7 @@ class LogsService {
|
|
31
31
|
return FlowLogs.aggregate([
|
32
32
|
{ $match: { request_id: request_id } },
|
33
33
|
{ $unwind: "$rows" },
|
34
|
-
{ $match: { "rows.nlevel": { $
|
34
|
+
{ $match: { "rows.nlevel": { $lte: nlevel }, "rows.timestamp": { $lt: timestamp } } },
|
35
35
|
{ $sort: { "rows.timestamp": -1, "rows._id": -1 } },
|
36
36
|
{ $limit: limit }
|
37
37
|
]).then(rows => rows.reverse())
|
@@ -46,7 +46,7 @@ class LogsService {
|
|
46
46
|
return FlowLogs.aggregate([
|
47
47
|
{ $match: { request_id: request_id } },
|
48
48
|
{ $unwind: "$rows" },
|
49
|
-
{ $match: { "rows.nlevel": { $
|
49
|
+
{ $match: { "rows.nlevel": { $lte: nlevel }, "rows.timestamp": { $gt: timestamp } } },
|
50
50
|
{ $sort: { "rows.timestamp": 1, "rows._id": 1 } },
|
51
51
|
{ $limit: limit }
|
52
52
|
])
|
package/test/kbRoute.js
CHANGED
@@ -1,10 +1,15 @@
|
|
1
1
|
//During the test the env variable is set to test
|
2
2
|
process.env.NODE_ENV = 'test';
|
3
3
|
process.env.GPTKEY = "fakegptkey";
|
4
|
-
process.env.KB_WEBHOOK_TOKEN = "testtoken"
|
5
|
-
process.env.PINECONE_INDEX = "test_index"
|
6
|
-
process.env.PINECONE_TYPE = "pod"
|
7
4
|
process.env.LOG_LEVEL = 'critical'
|
5
|
+
process.env.KB_WEBHOOK_TOKEN = "testtoken"
|
6
|
+
// Similarity
|
7
|
+
// process.env.PINECONE_INDEX = "test_index"
|
8
|
+
// process.env.PINECONE_TYPE = "pod"
|
9
|
+
// Hybrid
|
10
|
+
process.env.PINECONE_INDEX = "test_hybrid_index"
|
11
|
+
process.env.PINECONE_TYPE = "serverless"
|
12
|
+
|
8
13
|
|
9
14
|
var userService = require('../services/userService');
|
10
15
|
var projectService = require('../services/projectService');
|
@@ -58,7 +63,7 @@ describe('KbRoute', () => {
|
|
58
63
|
|
59
64
|
res.should.have.status(200);
|
60
65
|
expect(res.body.length).to.equal(1);
|
61
|
-
expect(res.body[0].engine.index_name).to.equal('
|
66
|
+
expect(res.body[0].engine.index_name).to.equal('test_hybrid_index')
|
62
67
|
|
63
68
|
let namespace_id = res.body[0].id;
|
64
69
|
|
@@ -813,6 +818,49 @@ describe('KbRoute', () => {
|
|
813
818
|
})
|
814
819
|
}).timeout(10000)
|
815
820
|
|
821
|
+
it('askkb-with-hybrid-search', (done) => {
|
822
|
+
|
823
|
+
var email = "test-signup-" + Date.now() + "@email.com";
|
824
|
+
var pwd = "pwd";
|
825
|
+
|
826
|
+
userService.signup(email, pwd, "Test Firstname", "Test Lastname").then((savedUser) => {
|
827
|
+
projectService.create("test-kb-qa", savedUser._id).then((savedProject) => {
|
828
|
+
|
829
|
+
chai.request(server)
|
830
|
+
.get('/' + savedProject._id + '/kb/namespace/all')
|
831
|
+
.auth(email, pwd)
|
832
|
+
.end((err, res) => {
|
833
|
+
|
834
|
+
if (err) { console.error("err: ", err); }
|
835
|
+
if (log) { console.log("get all namespaces res.body: ", res.body); }
|
836
|
+
|
837
|
+
res.should.have.status(200)
|
838
|
+
expect(res.body.length).to.equal(1);
|
839
|
+
expect(res.body[0].type === "serverless");
|
840
|
+
|
841
|
+
|
842
|
+
chai.request(server)
|
843
|
+
.post('/' + savedProject._id + "/kb/qa")
|
844
|
+
.auth(email, pwd)
|
845
|
+
.send({ model: "gpt-4o", namespace: savedProject._id, question: "sample question", advancedPrompt: true, system_context: "You are a robot coming from future" })
|
846
|
+
.end((err, res) => {
|
847
|
+
|
848
|
+
if (err) { console.error("err: ", err) };
|
849
|
+
if (log) { console.log("res.body: ", res.body) };
|
850
|
+
|
851
|
+
res.should.have.status(200);
|
852
|
+
expect(res.body.data);
|
853
|
+
expect(res.body.data.search_type === "hybrid");
|
854
|
+
|
855
|
+
done();
|
856
|
+
})
|
857
|
+
|
858
|
+
|
859
|
+
})
|
860
|
+
})
|
861
|
+
})
|
862
|
+
}).timeout(10000)
|
863
|
+
|
816
864
|
it('webhook', (done) => {
|
817
865
|
|
818
866
|
var email = "test-signup-" + Date.now() + "@email.com";
|
@@ -1096,7 +1144,7 @@ describe('KbRoute', () => {
|
|
1096
1144
|
expect(res.body.name).to.equal('MyCustomNamespace');
|
1097
1145
|
should.exist(res.body.engine)
|
1098
1146
|
expect(res.body.engine.name).to.equal('pinecone');
|
1099
|
-
expect(res.body.engine.type).to.equal('
|
1147
|
+
expect(res.body.engine.type).to.equal('serverless');
|
1100
1148
|
|
1101
1149
|
// Get again all namespace. A new default namespace should not be created.
|
1102
1150
|
chai.request(server)
|
package/test/openaiRoute.js
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
//During the test the env variable is set to test
|
2
2
|
process.env.NODE_ENV = 'test';
|
3
|
-
process.env.GPTKEY = '';
|
4
3
|
//process.env.AI_MODELS = 'gpt-3.5-turbo:0.6;gpt-4:25;gpt-4-turbo-preview:12;gpt-4o:6'
|
5
4
|
//process.env.AI_MODELS = 'gpt-3.5-turbo;gpt-4-turbo-preview;gpt-4o'
|
6
5
|
process.env.AI_MODELS = ' gpt-3.5-turbo:0 .6;gpt -4:2 5; g pt-4-tur bo-preview:12;gp t-4o:6'
|
@@ -110,6 +109,8 @@ describe('OpenaiRoute', () => {
|
|
110
109
|
|
111
110
|
it('newCompletionsMissingGptkey', (done) => {
|
112
111
|
|
112
|
+
let original_value = process.env.GPTKEY;
|
113
|
+
process.env.GPTKEY = "";
|
113
114
|
var email = "test-signup-" + Date.now() + "@email.com";
|
114
115
|
var pwd = "pwd";
|
115
116
|
|
@@ -130,6 +131,8 @@ describe('OpenaiRoute', () => {
|
|
130
131
|
expect(res.body.success).to.equal(false);
|
131
132
|
expect(res.body.message).to.equal("Missing gptkey parameter");
|
132
133
|
|
134
|
+
process.env.GPTKEY = original_value;
|
135
|
+
|
133
136
|
done();
|
134
137
|
})
|
135
138
|
|