@tiledesk/tiledesk-tybot-connector 0.2.22 → 0.2.24

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,8 +5,18 @@
5
5
  available on:
6
6
  ▶️ https://www.npmjs.com/package/@tiledesk/tiledesk-tybot-connector
7
7
 
8
+ ### v0.2.24
9
+ - Patch for the misleading \\start training phrase. Added: if (message.text === "\\start") { message.text = "/start" }
10
+ - Added Qapla action
11
+ - Fixed bug: the 3.5 turbo model was always used in GptTask action
12
+
13
+ ### v0.2.23
14
+ - Fixed CaptureUserReply. Added Check for missing goToIntent
15
+ - When channelName == "chat21" it will be renamed in "web"
16
+
8
17
  ### v0.2.22
9
18
  - Fixed "TildeskChatConst.js is not defined" in index.js
19
+ - added System attribute "channelName"
10
20
 
11
21
  ### v0.2.21
12
22
  - log clean
package/index.js CHANGED
@@ -147,6 +147,11 @@ router.post('/ext/:botid', async (req, res) => {
147
147
  projectId: projectId,
148
148
  log: log
149
149
  });
150
+ if (log) {console.log("MESSAGE CONTAINS:", message.text);}
151
+ if (message.text === "\\\\start") { // patch for the misleading \\start training phrase
152
+ if (log) {console.log("forced conversion of \\\\start /start");}
153
+ message.text = "/start";
154
+ }
150
155
  await TiledeskChatbotUtil.updateRequestAttributes(chatbot, message, projectId, requestId);
151
156
  await TiledeskChatbotUtil.updateConversationTranscript(chatbot, message);
152
157
 
@@ -338,7 +338,14 @@ class TiledeskChatbotUtil {
338
338
  if (message.text && message.sender !== "_tdinternal") {
339
339
  await chatbot.addParameter(TiledeskChatbotConst.REQ_LAST_USER_TEXT_KEY, message.text); // DEPRECATED
340
340
  await chatbot.addParameter("lastUserText", message.text);
341
-
341
+ if (message.channel) {
342
+ if (message.channel.name === "chat21") {
343
+ await chatbot.addParameter("chatChannel", "web"); // renames the channel in chat21
344
+ }
345
+ else {
346
+ await chatbot.addParameter("chatChannel", message.channel.name);
347
+ }
348
+ }
342
349
  await chatbot.addParameter("lastUserMessageType", message.type);
343
350
  await chatbot.addParameter("lastUserMessage", TiledeskChatbotUtil.lastUserMessageFrom(message)); // JSON TYPE *NEW
344
351
  // get image
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tiledesk/tiledesk-tybot-connector",
3
- "version": "0.2.22",
3
+ "version": "0.2.24",
4
4
  "description": "Tiledesk Tybot connector",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -30,6 +30,7 @@ const { DirWebRequestV2 } = require('./directives/DirWebRequestV2');
30
30
  const { DirCode } = require('./directives/DirCode');
31
31
  const { DirWhatsappByAttribute } = require('./directives/DirWhatsappByAttribute');
32
32
  const { DirAskGPT } = require('./directives/DirAskGPT');
33
+ const { DirQapla } = require('./directives/DirQapla');
33
34
 
34
35
  const { TiledeskChatbot } = require('../models/TiledeskChatbot');
35
36
  const { DirIfOnlineAgents } = require('./directives/DirIfOnlineAgents');
@@ -594,6 +595,12 @@ class DirectivesChatbotPlug {
594
595
  this.process(next_dir);
595
596
  });
596
597
  }
598
+ else if (directive_name === Directives.QAPLA) {
599
+ new DirQapla(context).execute(directive, async () => {
600
+ let next_dir = await this.nextDirective(this.directives);
601
+ this.process(next_dir);
602
+ })
603
+ }
597
604
  else {
598
605
  //console.log("Unhandled Post-message Directive:", directive_name);
599
606
  let next_dir = await this.nextDirective(this.directives);
@@ -103,9 +103,15 @@ class DirCaptureUserReply {
103
103
 
104
104
  if (callback) {
105
105
  // console.log("(DirCaptureUserReply) #executeGoTo(goToIntent)", goToIntent)
106
- this.#executeGoTo(goToIntent, () => {
106
+ if (goToIntent) {
107
+ this.#executeGoTo(goToIntent, () => {
108
+ callback(); // continue the flow
109
+ });
110
+ }
111
+ else {
107
112
  callback(); // continue the flow
108
- });
113
+ }
114
+
109
115
  }
110
116
  }
111
117
  catch(error) {
@@ -21,6 +21,7 @@ class DirGptTask {
21
21
  let action;
22
22
  if (directive.action) {
23
23
  action = directive.action;
24
+ console.log("-----> GPT TASK ACTION: \n", action);
24
25
  }
25
26
  else {
26
27
  console.error("Incorrect directive: ", JSON.stringify(directive));
@@ -34,6 +35,8 @@ class DirGptTask {
34
35
 
35
36
  async go(action, callback) {
36
37
  if (this.log) { console.log("GptTask action:", JSON.stringify(action)); }
38
+ console.log("GptTask action:", JSON.stringify(action));
39
+ console.log("GptTask action model:", action.model);
37
40
  if (!this.tdcache) {
38
41
  console.error("Error: DirGptTask tdcache is mandatory");
39
42
  callback();
@@ -94,7 +97,7 @@ class DirGptTask {
94
97
  }
95
98
  } else if (callback) {
96
99
  if (this.log) {
97
- console.log("Get KnowledgeBase resbody:", resbody);
100
+ console.log("Get KnowledgeBase settings resbody:", resbody);
98
101
  console.log("gptkey: ", resbody.gptkey);
99
102
  }
100
103
 
@@ -106,7 +109,7 @@ class DirGptTask {
106
109
  } else {
107
110
 
108
111
  let json = {
109
- "model": "gpt-3.5-turbo",
112
+ "model": action.model,
110
113
  "messages": [
111
114
  {
112
115
  "role": "user",
@@ -0,0 +1,191 @@
1
+ const axios = require("axios").default;
2
+ const { TiledeskChatbot } = require("../../models/TiledeskChatbot");
3
+ const { Filler } = require("../Filler");
4
+ let https = require("https");
5
+ require('dotenv').config();
6
+
7
+ class DirQapla {
8
+
9
+ constructor(context) {
10
+ if (!context) {
11
+ throw new Error('context object is mandatory');
12
+ }
13
+ this.context = context;
14
+ this.tdcache = this.context.tdcache;
15
+ this.requestId = this.context.requestId;
16
+ this.log = context.log;
17
+ }
18
+
19
+ execute(directive, callback) {
20
+ if (this.log) { console.log("DirQapla directive: ", directive); }
21
+ let action;
22
+ if (directive.action) {
23
+ action = directive.action;
24
+ }
25
+ else {
26
+ console.error("DirQapla Incorrect directive: ", JSON.stringify(directive));
27
+ callback();
28
+ return;
29
+ }
30
+ this.go(action, () => {
31
+ callback();
32
+ })
33
+ }
34
+
35
+ async go(action, callback) {
36
+ if (this.log) { console.log("DirQapla action:", JSON.stringify(action)); }
37
+ if (!this.tdcache) {
38
+ console.error("Error: DirQapla tdcache is mandatory");
39
+ callback();
40
+ return;
41
+ }
42
+
43
+ let requestVariables = null;
44
+ requestVariables =
45
+ await TiledeskChatbot.allParametersStatic(
46
+ this.tdcache, this.requestId
47
+ )
48
+
49
+ if (this.log) {
50
+ const all_parameters = await TiledeskChatbot.allParametersStatic(this.context.tdcache, this.context.requestId);
51
+ for (const [key, value] of Object.entries(all_parameters)) {
52
+ if (this.log) { console.log("DirQapla request parameter:", key, "value:", value, "type:", typeof value) }
53
+ }
54
+ }
55
+
56
+ let tracking_number = await this.context.chatbot.getParameter(action.trackingNumber);
57
+ if (this.log) {console.log("DirQapla tracking number: ", tracking_number); }
58
+
59
+ if (!tracking_number) {
60
+ console.error("DirQapla ERROR - tracking number is undefined or null");
61
+ callback();
62
+ }
63
+
64
+ const qapla_base_url = process.env.QAPLA_ENDPOINT || "https://api.qapla.it/1.2"
65
+ // https://api.qapla.it/1.2/getShipment/?apiKey=3b9839c954168e861f2b63d79920ec3a3ff92aab674de9f3930df60b8a40c495&trackingNumber=123456
66
+ if (this.log) { console.log("DirQapla QaplaEndpoint URL: ", qapla_base_url); }
67
+ const QAPLA_HTTPREQUEST = {
68
+ url: qapla_base_url + "/getShipment/",
69
+ headers: {
70
+ 'Content-Type': 'application/json'
71
+ },
72
+ params: {
73
+ apiKey: action.apiKey,
74
+ trackingNumber: tracking_number
75
+ },
76
+ method: "GET"
77
+ }
78
+ if (this.log) { console.log("DirQapla QAPLA_HTTPREQUEST", QAPLA_HTTPREQUEST); }
79
+
80
+ this.#myrequest(
81
+ QAPLA_HTTPREQUEST, async (err, resbody) => {
82
+ if (err) {
83
+ if (callback) {
84
+ console.error("(httprequest) DirQapla getShipment err:", err);
85
+ callback();
86
+ }
87
+ } else if (callback) {
88
+ if (this.log) { console.log("DirQapla getShipment resbody: ", resbody); }
89
+
90
+ let status = null;;
91
+ let result;
92
+ let error;
93
+
94
+ if (resbody.getShipment &&
95
+ resbody.getShipment.shipments &&
96
+ resbody.getShipment.shipments[0] &&
97
+ resbody.getShipment.shipments[0].status &&
98
+ resbody.getShipment.shipments[0].status.qaplaStatus &&
99
+ resbody.getShipment.shipments[0].status.qaplaStatus.status) {
100
+ status = resbody.getShipment.shipments[0].status.qaplaStatus.status;
101
+ }
102
+
103
+ result = resbody.getShipment.result;
104
+ error = resbody.getShipment.error;
105
+ await this.#assignAttributes(action, status, result, error);
106
+ callback();
107
+ }
108
+ }
109
+ )
110
+
111
+ }
112
+
113
+
114
+ async #assignAttributes(action, status, result, error) {
115
+ if (this.log) {
116
+ console.log("DirQapla assignAttributes action:", action)
117
+ console.log("DirQapla assignAttributes status:", status)
118
+ console.log("DirQapla assignAttributes result:", result)
119
+ console.log("DirQapla assignAttributes error:", error)
120
+ }
121
+ if (this.context.tdcache) {
122
+ if (action.assignStatusTo) {
123
+ await TiledeskChatbot.addParameterStatic(this.context.tdcache, this.context.requestId, action.assignStatusTo, status);
124
+ }
125
+ if (action.assignResultTo && result) {
126
+ await TiledeskChatbot.addParameterStatic(this.context.tdcache, this.context.requestId, action.assignResultTo, result);
127
+ }
128
+ if (action.assignErrorTo) {
129
+ await TiledeskChatbot.addParameterStatic(this.context.tdcache, this.context.requestId, action.assignErrorTo, error);
130
+ }
131
+
132
+ // Debug log
133
+ if (this.log) {
134
+ const all_parameters = await TiledeskChatbot.allParametersStatic(this.context.tdcache, this.context.requestId);
135
+ for (const [key, value] of Object.entries(all_parameters)) {
136
+ if (this.log) { console.log("DirQapla request parameter:", key, "value:", value, "type:", typeof value) }
137
+ }
138
+ }
139
+ }
140
+ }
141
+
142
+ #myrequest(options, callback) {
143
+ if (this.log) {
144
+ console.log("API URL:", options.url);
145
+ console.log("** Options:", JSON.stringify(options));
146
+ }
147
+ let axios_options = {
148
+ url: options.url,
149
+ method: options.method,
150
+ params: options.params,
151
+ headers: options.headers
152
+ }
153
+ if (options.json !== null) {
154
+ axios_options.data = options.json
155
+ }
156
+ if (this.log) {
157
+ console.log("axios_options:", JSON.stringify(axios_options));
158
+ }
159
+ if (options.url.startsWith("https:")) {
160
+ const httpsAgent = new https.Agent({
161
+ rejectUnauthorized: false,
162
+ });
163
+ axios_options.httpsAgent = httpsAgent;
164
+ }
165
+ axios(axios_options)
166
+ .then((res) => {
167
+ if (this.log) {
168
+ console.log("Response for url:", options.url);
169
+ console.log("Response headers:\n", JSON.stringify(res.headers));
170
+ }
171
+ if (res && res.status == 200 && res.data) {
172
+ if (callback) {
173
+ callback(null, res.data);
174
+ }
175
+ }
176
+ else {
177
+ if (callback) {
178
+ callback(new Error("Response status is not 200"), null);
179
+ }
180
+ }
181
+ })
182
+ .catch((error) => {
183
+ // console.error("An error occurred:", JSON.stringify(error.data));
184
+ if (callback) {
185
+ callback(error, null);
186
+ }
187
+ });
188
+ }
189
+ }
190
+
191
+ module.exports = { DirQapla }
@@ -30,6 +30,7 @@ class Directives {
30
30
  static GPT_TASK = "gpt_task";
31
31
  static FORM = "form";
32
32
  static CAPTURE_USER_REPLY = "capture_user_reply";
33
+ static QAPLA = 'qapla';
33
34
 
34
35
  // static WHEN_ONLINE_MOVE_TO_AGENT = "whenonlinemovetoagent"; // DEPRECATED?
35
36
  // static WHEN_OFFLINE_HOURS = "whenofflinehours"; // DEPRECATED // adds a message on top of the original message when offline hours opts: --replace