@tiledesk/tiledesk-server 2.10.94 → 2.10.96

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 CHANGED
@@ -5,6 +5,17 @@
5
5
  🚀 IN PRODUCTION 🚀
6
6
  (https://www.npmjs.com/package/@tiledesk/tiledesk-server/v/2.3.77)
7
7
 
8
+ # 2.10.96
9
+ - Added: support for hybrid search
10
+ - Added: support for chunks_only option
11
+ - Added: support for native logs
12
+ - Bug fix: unexpceted indexing run of all urls in the project
13
+
14
+ # 2.10.95 (Aborted)
15
+ - Added: support for hybrid search
16
+ - Added: support for chunks_only option
17
+ - Added: support for native logs
18
+
8
19
  # 2.10.94
9
20
  - Update: fix uncaughtException in tagSchedule method
10
21
 
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.94",
4
+ "version": "2.10.96",
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.15",
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.1",
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
- //context: "You are an awesome AI Assistant."
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);
@@ -1336,14 +1341,19 @@ router.post('/multi', upload.single('uploadFile'), async (req, res) => {
1336
1341
  }
1337
1342
  })
1338
1343
 
1339
- saveBulk(operations, kbs, project_id).then((result) => {
1344
+ saveBulk(operations, kbs, project_id, namespace_id).then((result) => {
1340
1345
 
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
 
@@ -1446,7 +1456,7 @@ router.post('/csv', upload.single('uploadFile'), async (req, res) => {
1446
1456
  }
1447
1457
  })
1448
1458
 
1449
- saveBulk(operations, kbs, project_id).then((result) => {
1459
+ saveBulk(operations, kbs, project_id, namespace_id).then((result) => {
1450
1460
 
1451
1461
  let ns = namespaces.find(n => n.id === namespace_id);
1452
1462
  let engine = ns.engine || default_engine;
@@ -1613,13 +1623,13 @@ router.delete('/:kb_id', async (req, res) => {
1613
1623
  * ****************************************
1614
1624
  */
1615
1625
 
1616
- async function saveBulk(operations, kbs, project_id) {
1626
+ async function saveBulk(operations, kbs, project_id, namespace) {
1617
1627
 
1618
1628
  return new Promise((resolve, reject) => {
1619
1629
  KB.bulkWrite(operations, { ordered: false }).then((result) => {
1620
1630
  winston.verbose("bulkWrite operations result: ", result);
1621
1631
 
1622
- KB.find({ id_project: project_id, source: { $in: kbs.map(kb => kb.source) } }).lean().then((documents) => {
1632
+ KB.find({ id_project: project_id, namespace: namespace, source: { $in: kbs.map(kb => kb.source) } }).lean().then((documents) => {
1623
1633
  winston.debug("documents: ", documents);
1624
1634
  resolve(documents)
1625
1635
  }).catch((err) => {
@@ -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": { $lt: 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": { $lt: nlevel }, "rows.timestamp": { $lt: timestamp } } },
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": { $lt: nlevel }, "rows.timestamp": { $gt: timestamp } } },
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
  ])
@@ -44,6 +44,7 @@ class WebhookService {
44
44
  }
45
45
  let json_value = JSON.parse(value);
46
46
  payload.preloaded_request_id = json_value.request_id;
47
+ payload.draft = true;
47
48
  }
48
49
 
49
50
  let token = await this.generateChatbotToken(chatbot);
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('test_index')
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('pod');
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)
@@ -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