@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 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.93",
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.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);
@@ -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
 
@@ -32,13 +32,19 @@ class Scheduler {
32
32
  tagSchedule(data, callback) {
33
33
 
34
34
  winston.debug("(tagScheduler) data: ", data);
35
- this.jobManager.publish(data);
36
- let response_data = { success: true, message: "Scheduled" };
37
- if (callback) {
38
- callback(err, response_data);
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
- // this.jobManager.publish(data, (err, ok) => {
41
- // })
47
+
42
48
  }
43
49
 
44
50
  }
@@ -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
  ])
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