@botonic/plugin-flow-builder 0.26.2-alpha.0 → 0.27.0-alpha.0

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.
Files changed (89) hide show
  1. package/lib/cjs/action/index.js +38 -18
  2. package/lib/cjs/action/index.js.map +1 -1
  3. package/lib/cjs/action/knowledge-bases.js +14 -4
  4. package/lib/cjs/action/knowledge-bases.js.map +1 -1
  5. package/lib/cjs/api.d.ts +2 -4
  6. package/lib/cjs/api.js +7 -32
  7. package/lib/cjs/api.js.map +1 -1
  8. package/lib/cjs/constants.d.ts +1 -1
  9. package/lib/cjs/constants.js +2 -2
  10. package/lib/cjs/constants.js.map +1 -1
  11. package/lib/cjs/content-fields/flow-handoff.js +7 -19
  12. package/lib/cjs/content-fields/flow-handoff.js.map +1 -1
  13. package/lib/cjs/content-fields/index.d.ts +1 -0
  14. package/lib/cjs/content-fields/index.js +3 -1
  15. package/lib/cjs/content-fields/index.js.map +1 -1
  16. package/lib/cjs/functions/conditional-queue-status.d.ts +7 -1
  17. package/lib/cjs/functions/conditional-queue-status.js +34 -12
  18. package/lib/cjs/functions/conditional-queue-status.js.map +1 -1
  19. package/lib/cjs/index.d.ts +6 -3
  20. package/lib/cjs/index.js +22 -13
  21. package/lib/cjs/index.js.map +1 -1
  22. package/lib/cjs/tracking.d.ts +18 -14
  23. package/lib/cjs/tracking.js +27 -20
  24. package/lib/cjs/tracking.js.map +1 -1
  25. package/lib/cjs/types.d.ts +14 -1
  26. package/lib/cjs/types.js.map +1 -1
  27. package/lib/cjs/user-input/index.d.ts +2 -1
  28. package/lib/cjs/user-input/index.js +9 -3
  29. package/lib/cjs/user-input/index.js.map +1 -1
  30. package/lib/cjs/user-input/intent.js +12 -8
  31. package/lib/cjs/user-input/intent.js.map +1 -1
  32. package/lib/cjs/user-input/keyword.d.ts +21 -1
  33. package/lib/cjs/user-input/keyword.js +68 -13
  34. package/lib/cjs/user-input/keyword.js.map +1 -1
  35. package/lib/cjs/user-input/smart-intent.d.ts +18 -1
  36. package/lib/cjs/user-input/smart-intent.js +46 -28
  37. package/lib/cjs/user-input/smart-intent.js.map +1 -1
  38. package/lib/esm/action/index.js +39 -19
  39. package/lib/esm/action/index.js.map +1 -1
  40. package/lib/esm/action/knowledge-bases.js +15 -5
  41. package/lib/esm/action/knowledge-bases.js.map +1 -1
  42. package/lib/esm/api.d.ts +2 -4
  43. package/lib/esm/api.js +8 -33
  44. package/lib/esm/api.js.map +1 -1
  45. package/lib/esm/constants.d.ts +1 -1
  46. package/lib/esm/constants.js +1 -1
  47. package/lib/esm/constants.js.map +1 -1
  48. package/lib/esm/content-fields/flow-handoff.js +7 -19
  49. package/lib/esm/content-fields/flow-handoff.js.map +1 -1
  50. package/lib/esm/content-fields/index.d.ts +1 -0
  51. package/lib/esm/content-fields/index.js +1 -0
  52. package/lib/esm/content-fields/index.js.map +1 -1
  53. package/lib/esm/functions/conditional-queue-status.d.ts +7 -1
  54. package/lib/esm/functions/conditional-queue-status.js +32 -11
  55. package/lib/esm/functions/conditional-queue-status.js.map +1 -1
  56. package/lib/esm/index.d.ts +6 -3
  57. package/lib/esm/index.js +23 -14
  58. package/lib/esm/index.js.map +1 -1
  59. package/lib/esm/tracking.d.ts +18 -14
  60. package/lib/esm/tracking.js +25 -19
  61. package/lib/esm/tracking.js.map +1 -1
  62. package/lib/esm/types.d.ts +14 -1
  63. package/lib/esm/types.js.map +1 -1
  64. package/lib/esm/user-input/index.d.ts +2 -1
  65. package/lib/esm/user-input/index.js +11 -5
  66. package/lib/esm/user-input/index.js.map +1 -1
  67. package/lib/esm/user-input/intent.js +13 -9
  68. package/lib/esm/user-input/intent.js.map +1 -1
  69. package/lib/esm/user-input/keyword.d.ts +21 -1
  70. package/lib/esm/user-input/keyword.js +67 -12
  71. package/lib/esm/user-input/keyword.js.map +1 -1
  72. package/lib/esm/user-input/smart-intent.d.ts +18 -1
  73. package/lib/esm/user-input/smart-intent.js +44 -26
  74. package/lib/esm/user-input/smart-intent.js.map +1 -1
  75. package/package.json +2 -2
  76. package/src/action/index.tsx +58 -24
  77. package/src/action/knowledge-bases.ts +16 -5
  78. package/src/api.ts +11 -57
  79. package/src/constants.ts +1 -1
  80. package/src/content-fields/flow-handoff.tsx +8 -28
  81. package/src/content-fields/index.ts +1 -0
  82. package/src/functions/conditional-queue-status.ts +36 -13
  83. package/src/index.ts +39 -19
  84. package/src/tracking.ts +25 -14
  85. package/src/types.ts +13 -1
  86. package/src/user-input/index.ts +13 -7
  87. package/src/user-input/intent.ts +17 -10
  88. package/src/user-input/keyword.ts +93 -14
  89. package/src/user-input/smart-intent.ts +57 -29
@@ -1,29 +1,35 @@
1
1
  import { __awaiter } from "tslib";
2
2
  import { getFlowBuilderPlugin } from './helpers';
3
- export function trackEvent(request, eventName, args) {
3
+ export function trackEvent(request, eventAction, args) {
4
4
  return __awaiter(this, void 0, void 0, function* () {
5
5
  const flowBuilderPlugin = getFlowBuilderPlugin(request.plugins);
6
6
  if (flowBuilderPlugin.trackEvent) {
7
- yield flowBuilderPlugin.trackEvent(request, eventName, args);
7
+ yield flowBuilderPlugin.trackEvent(request, eventAction, args);
8
8
  }
9
9
  return;
10
10
  });
11
11
  }
12
- export var EventName;
13
- (function (EventName) {
14
- EventName["botAgentRating"] = "bot_agent_rating";
15
- EventName["botChannelRating"] = "bot_channel_rating";
16
- EventName["botFaqUseful"] = "bot_faq_useful";
17
- EventName["botRating"] = "bot_rating";
18
- EventName["botFaq"] = "bot_faq";
19
- EventName["botStart"] = "bot_start";
20
- EventName["botOpen"] = "bot_open";
21
- EventName["botAiModel"] = "bot_ai_model";
22
- EventName["botAiKnowledgeBase"] = "bot_ai_knowledge_base";
23
- EventName["botKeywordsModel"] = "bot_keywords_model";
24
- EventName["fallback"] = "fallback";
25
- EventName["handoffOption"] = "handoff_option";
26
- EventName["handoffSuccess"] = "handoff_success";
27
- EventName["handoffFail"] = "handoff_fail";
28
- })(EventName || (EventName = {}));
12
+ export function getNodeEventArgs(request, node) {
13
+ const flowBuilderPlugin = getFlowBuilderPlugin(request.plugins);
14
+ return {
15
+ flowThreadId: request.session.flow_thread_id,
16
+ flowId: node.flow_id,
17
+ flowName: flowBuilderPlugin.getFlowName(node.flow_id),
18
+ flowNodeId: node.id,
19
+ flowNodeContentId: node.code,
20
+ flowNodeIsMeaningful: undefined, //node?.isMeaningful,
21
+ };
22
+ }
23
+ export var EventAction;
24
+ (function (EventAction) {
25
+ EventAction["flowNode"] = "flow_node";
26
+ EventAction["handoffOption"] = "handoff_option";
27
+ EventAction["handoffSuccess"] = "handoff_success";
28
+ EventAction["handoffFail"] = "handoff_fail";
29
+ EventAction["keyword"] = "nlu_keyword";
30
+ EventAction["intent"] = "nlu_intent";
31
+ EventAction["intentSmart"] = "nlu_intent_smart";
32
+ EventAction["knowledgebase"] = "knowledgebase";
33
+ EventAction["fallback"] = "fallback";
34
+ })(EventAction || (EventAction = {}));
29
35
  //# sourceMappingURL=tracking.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tracking.js","sourceRoot":"","sources":["../../src/tracking.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAEhD,MAAM,UAAgB,UAAU,CAC9B,OAAsB,EACtB,SAAoB,EACpB,IAA0B;;QAE1B,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAC/D,IAAI,iBAAiB,CAAC,UAAU,EAAE;YAChC,MAAM,iBAAiB,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;SAC7D;QACD,OAAM;IACR,CAAC;CAAA;AAED,MAAM,CAAN,IAAY,SAeX;AAfD,WAAY,SAAS;IACnB,gDAAmC,CAAA;IACnC,oDAAuC,CAAA;IACvC,4CAA+B,CAAA;IAC/B,qCAAwB,CAAA;IACxB,+BAAkB,CAAA;IAClB,mCAAsB,CAAA;IACtB,iCAAoB,CAAA;IACpB,wCAA2B,CAAA;IAC3B,yDAA4C,CAAA;IAC5C,oDAAuC,CAAA;IACvC,kCAAqB,CAAA;IACrB,6CAAgC,CAAA;IAChC,+CAAkC,CAAA;IAClC,yCAA4B,CAAA;AAC9B,CAAC,EAfW,SAAS,KAAT,SAAS,QAepB"}
1
+ {"version":3,"file":"tracking.js","sourceRoot":"","sources":["../../src/tracking.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAEhD,MAAM,UAAgB,UAAU,CAC9B,OAAsB,EACtB,WAAwB,EACxB,IAA0B;;QAE1B,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAC/D,IAAI,iBAAiB,CAAC,UAAU,EAAE;YAChC,MAAM,iBAAiB,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;SAC/D;QACD,OAAM;IACR,CAAC;CAAA;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAAsB,EACtB,IAAuB;IAEvB,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/D,OAAO;QACL,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,cAAc;QAC5C,MAAM,EAAE,IAAI,CAAC,OAAO;QACpB,QAAQ,EAAE,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;QACrD,UAAU,EAAE,IAAI,CAAC,EAAE;QACnB,iBAAiB,EAAE,IAAI,CAAC,IAAI;QAC5B,oBAAoB,EAAE,SAAS,EAAE,qBAAqB;KACvD,CAAA;AACH,CAAC;AAED,MAAM,CAAN,IAAY,WAUX;AAVD,WAAY,WAAW;IACrB,qCAAsB,CAAA;IACtB,+CAAgC,CAAA;IAChC,iDAAkC,CAAA;IAClC,2CAA4B,CAAA;IAC5B,sCAAuB,CAAA;IACvB,oCAAqB,CAAA;IACrB,+CAAgC,CAAA;IAChC,8CAA+B,CAAA;IAC/B,oCAAqB,CAAA;AACvB,CAAC,EAVW,WAAW,KAAX,WAAW,QAUtB"}
@@ -8,8 +8,11 @@ export interface BotonicPluginFlowBuilderOptions {
8
8
  customFunctions?: Record<any, any>;
9
9
  getLocale: (session: Session) => string;
10
10
  getAccessToken: () => string;
11
- trackEvent?: (request: ActionRequest, eventName: string, args?: Record<string, any>) => Promise<void>;
11
+ trackEvent?: (request: ActionRequest, eventAction: string, args?: Record<string, any>) => Promise<void>;
12
12
  getKnowledgeBaseResponse?: (request: ActionRequest) => Promise<KnowledgeBaseResponse>;
13
+ smartIntentsConfig?: {
14
+ numSmartIntentsToUse: number;
15
+ };
13
16
  }
14
17
  export interface FlowBuilderApiOptions {
15
18
  url: string;
@@ -33,6 +36,16 @@ export interface KnowledgeBaseResponse {
33
36
  page?: number;
34
37
  }[];
35
38
  }
39
+ export interface SmartIntentResponse {
40
+ data: {
41
+ smart_intent_title: string;
42
+ text: string;
43
+ smart_intents_used: {
44
+ title: string;
45
+ description: string;
46
+ }[];
47
+ };
48
+ }
36
49
  export interface PayloadParamsBase {
37
50
  followUpContentID?: string;
38
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AA6BA,MAAM,CAAN,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC5B,+CAAyB,CAAA;IACzB,iDAA2B,CAAA;AAC7B,CAAC,EAHW,kBAAkB,KAAlB,kBAAkB,QAG7B;AAED,MAAM,CAAN,IAAY,sBAGX;AAHD,WAAY,sBAAsB;IAChC,yCAAe,CAAA;IACf,2CAAiB,CAAA;AACnB,CAAC,EAHW,sBAAsB,KAAtB,sBAAsB,QAGjC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AA8BA,MAAM,CAAN,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC5B,+CAAyB,CAAA;IACzB,iDAA2B,CAAA;AAC7B,CAAC,EAHW,kBAAkB,KAAlB,kBAAkB,QAG7B;AAED,MAAM,CAAN,IAAY,sBAGX;AAHD,WAAY,sBAAsB;IAChC,yCAAe,CAAA;IACf,2CAAiB,CAAA;AACnB,CAAC,EAHW,sBAAsB,KAAtB,sBAAsB,QAGjC"}
@@ -1,4 +1,5 @@
1
1
  import { ActionRequest } from '@botonic/react';
2
2
  import { FlowBuilderApi } from '../api';
3
3
  import { HtIntentNode, HtKeywordNode, HtSmartIntentNode } from '../content-fields/hubtype-fields';
4
- export declare function getNodeByUserInput(cmsApi: FlowBuilderApi, locale: string, request: ActionRequest): Promise<HtSmartIntentNode | HtIntentNode | HtKeywordNode | undefined>;
4
+ import { SmartIntentsInferenceConfig } from './smart-intent';
5
+ export declare function getNodeByUserInput(cmsApi: FlowBuilderApi, locale: string, request: ActionRequest, smartIntentsConfig: SmartIntentsInferenceConfig): Promise<HtSmartIntentNode | HtIntentNode | HtKeywordNode | undefined>;
@@ -1,14 +1,20 @@
1
1
  import { __awaiter } from "tslib";
2
2
  import { getIntentNodeByInput } from './intent';
3
- import { getKeywordNodeByInput } from './keyword';
4
- import { getSmartIntentNodeByInput } from './smart-intent';
5
- export function getNodeByUserInput(cmsApi, locale, request) {
3
+ import { KeywordMatcher } from './keyword';
4
+ import { SmartIntentsApi } from './smart-intent';
5
+ export function getNodeByUserInput(cmsApi, locale, request, smartIntentsConfig) {
6
6
  return __awaiter(this, void 0, void 0, function* () {
7
7
  if (request.input.data) {
8
- const keywordNode = yield getKeywordNodeByInput(cmsApi, locale, request, request.input.data);
8
+ const keywordMatcher = new KeywordMatcher({
9
+ cmsApi,
10
+ locale,
11
+ request,
12
+ });
13
+ const keywordNode = yield keywordMatcher.getNodeByInput(request.input.data);
9
14
  if (keywordNode)
10
15
  return keywordNode;
11
- const smartIntentNode = yield getSmartIntentNodeByInput(cmsApi, request);
16
+ const smartIntentsApi = new SmartIntentsApi(cmsApi, request, smartIntentsConfig);
17
+ const smartIntentNode = smartIntentsApi.getNodeByInput();
12
18
  if (smartIntentNode)
13
19
  return smartIntentNode;
14
20
  const intentNode = yield getIntentNodeByInput(cmsApi, locale, request);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/user-input/index.ts"],"names":[],"mappings":";AAQA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAA;AAE1D,MAAM,UAAgB,kBAAkB,CACtC,MAAsB,EACtB,MAAc,EACd,OAAsB;;QAEtB,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;YACtB,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAC7C,MAAM,EACN,MAAM,EACN,OAAO,EACP,OAAO,CAAC,KAAK,CAAC,IAAI,CACnB,CAAA;YACD,IAAI,WAAW;gBAAE,OAAO,WAAW,CAAA;YAEnC,MAAM,eAAe,GAAG,MAAM,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YACxE,IAAI,eAAe;gBAAE,OAAO,eAAe,CAAA;YAE3C,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;YACtE,IAAI,UAAU;gBAAE,OAAO,UAAU,CAAA;SAClC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/user-input/index.ts"],"names":[],"mappings":";AAQA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,EAAE,eAAe,EAA+B,MAAM,gBAAgB,CAAA;AAE7E,MAAM,UAAgB,kBAAkB,CACtC,MAAsB,EACtB,MAAc,EACd,OAAsB,EACtB,kBAA+C;;QAE/C,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;YACtB,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC;gBACxC,MAAM;gBACN,MAAM;gBACN,OAAO;aACR,CAAC,CAAA;YACF,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC3E,IAAI,WAAW;gBAAE,OAAO,WAAW,CAAA;YAEnC,MAAM,eAAe,GAAG,IAAI,eAAe,CACzC,MAAM,EACN,OAAO,EACP,kBAAkB,CACnB,CAAA;YACD,MAAM,eAAe,GAAG,eAAe,CAAC,cAAc,EAAE,CAAA;YACxD,IAAI,eAAe;gBAAE,OAAO,eAAe,CAAA;YAE3C,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;YACtE,IAAI,UAAU;gBAAE,OAAO,UAAU,CAAA;SAClC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;CAAA"}
@@ -1,24 +1,28 @@
1
1
  import { __awaiter } from "tslib";
2
- import { EventName, trackEvent } from '../tracking';
2
+ import { EventAction, trackEvent } from '../tracking';
3
3
  export function getIntentNodeByInput(cmsApi, locale, request) {
4
4
  return __awaiter(this, void 0, void 0, function* () {
5
5
  const intentNode = cmsApi.getIntentNode(request.input, locale);
6
- const eventArgs = {
7
- intent: request.input.intent,
8
- confidence: request.input.confidence,
9
- confidence_successful: true,
10
- };
11
6
  if (request.input.confidence && request.input.intent && intentNode) {
7
+ yield trackIntentEvent(request, intentNode);
12
8
  if (isIntentValid(intentNode, request, cmsApi)) {
13
- yield trackEvent(request, EventName.botAiModel, eventArgs);
14
9
  return intentNode;
15
10
  }
16
- eventArgs.confidence_successful = false;
17
- yield trackEvent(request, EventName.botAiModel, eventArgs);
18
11
  }
19
12
  return undefined;
20
13
  });
21
14
  }
15
+ function trackIntentEvent(request, intentNode) {
16
+ return __awaiter(this, void 0, void 0, function* () {
17
+ const eventArgs = {
18
+ nluIntentLabel: request.input.intent,
19
+ nluIntentConfidence: request.input.confidence,
20
+ nluIntentThreshold: intentNode === null || intentNode === void 0 ? void 0 : intentNode.content.confidence,
21
+ nluIntentMessageId: request.input.message_id,
22
+ };
23
+ yield trackEvent(request, EventAction.intent, eventArgs);
24
+ });
25
+ }
22
26
  function isIntentValid(intentNode, request, cmsApi) {
23
27
  return (request.input.confidence &&
24
28
  cmsApi.hasMetConfidenceThreshold(intentNode, request.input.confidence));
@@ -1 +1 @@
1
- {"version":3,"file":"intent.js","sourceRoot":"","sources":["../../../src/user-input/intent.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAEnD,MAAM,UAAgB,oBAAoB,CACxC,MAAsB,EACtB,MAAc,EACd,OAAsB;;QAEtB,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAC9D,MAAM,SAAS,GAAG;YAChB,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAgB;YACtC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,UAAoB;YAC9C,qBAAqB,EAAE,IAAI;SAC5B,CAAA;QACD,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,UAAU,EAAE;YAClE,IAAI,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE;gBAC9C,MAAM,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;gBAC1D,OAAO,UAAU,CAAA;aAClB;YAED,SAAS,CAAC,qBAAqB,GAAG,KAAK,CAAA;YACvC,MAAM,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;SAC3D;QAED,OAAO,SAAS,CAAA;IAClB,CAAC;CAAA;AAED,SAAS,aAAa,CACpB,UAAwB,EACxB,OAAsB,EACtB,MAAsB;IAEtB,OAAO,CACL,OAAO,CAAC,KAAK,CAAC,UAAU;QACxB,MAAM,CAAC,yBAAyB,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CACvE,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"intent.js","sourceRoot":"","sources":["../../../src/user-input/intent.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAErD,MAAM,UAAgB,oBAAoB,CACxC,MAAsB,EACtB,MAAc,EACd,OAAsB;;QAEtB,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAE9D,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,UAAU,EAAE;YAClE,MAAM,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;YAE3C,IAAI,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE;gBAC9C,OAAO,UAAU,CAAA;aAClB;SACF;QAED,OAAO,SAAS,CAAA;IAClB,CAAC;CAAA;AAED,SAAe,gBAAgB,CAC7B,OAAsB,EACtB,UAAwB;;QAExB,MAAM,SAAS,GAAG;YAChB,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;YACpC,mBAAmB,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU;YAC7C,kBAAkB,EAAE,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,OAAO,CAAC,UAAU;YAClD,kBAAkB,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU;SAC7C,CAAA;QACD,MAAM,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC1D,CAAC;CAAA;AAED,SAAS,aAAa,CACpB,UAAwB,EACxB,OAAsB,EACtB,MAAsB;IAEtB,OAAO,CACL,OAAO,CAAC,KAAK,CAAC,UAAU;QACxB,MAAM,CAAC,yBAAyB,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CACvE,CAAA;AACH,CAAC"}
@@ -1,4 +1,24 @@
1
1
  import { ActionRequest } from '@botonic/react';
2
2
  import { FlowBuilderApi } from '../api';
3
3
  import { HtKeywordNode } from '../content-fields/hubtype-fields';
4
- export declare function getKeywordNodeByInput(cmsApi: FlowBuilderApi, locale: string, request: ActionRequest, userInput: string): Promise<HtKeywordNode | undefined>;
4
+ interface KeywordProps {
5
+ cmsApi: FlowBuilderApi;
6
+ locale: string;
7
+ request: ActionRequest;
8
+ }
9
+ export declare class KeywordMatcher {
10
+ cmsApi: FlowBuilderApi;
11
+ locale: string;
12
+ request: ActionRequest;
13
+ isRegExp: boolean;
14
+ matchedKeyword?: string;
15
+ keywordNodeId?: string;
16
+ constructor({ cmsApi, locale, request }: KeywordProps);
17
+ getNodeByInput(userInput: string): Promise<HtKeywordNode | undefined>;
18
+ private getNodeByKeyword;
19
+ private matchKeywords;
20
+ private inputMatchesAnyKeyword;
21
+ private resolveKeywordAsRegExp;
22
+ private trackKeywordEvent;
23
+ }
24
+ export {};
@@ -1,16 +1,71 @@
1
1
  import { __awaiter } from "tslib";
2
- import { EventName, trackEvent } from '../tracking';
3
- export function getKeywordNodeByInput(cmsApi, locale, request, userInput) {
4
- return __awaiter(this, void 0, void 0, function* () {
5
- const keywordNode = cmsApi.getNodeByKeyword(userInput, locale);
6
- if (!keywordNode) {
7
- return undefined;
2
+ import { REG_EXP_PATTERN } from '../constants';
3
+ import { EventAction, trackEvent } from '../tracking';
4
+ export class KeywordMatcher {
5
+ constructor({ cmsApi, locale, request }) {
6
+ this.cmsApi = cmsApi;
7
+ this.locale = locale;
8
+ this.request = request;
9
+ this.isRegExp = false;
10
+ }
11
+ getNodeByInput(userInput) {
12
+ return __awaiter(this, void 0, void 0, function* () {
13
+ const keywordNodes = this.cmsApi.getKeywordNodes();
14
+ const keywordNode = this.getNodeByKeyword(userInput, keywordNodes);
15
+ if (!keywordNode) {
16
+ return undefined;
17
+ }
18
+ this.trackKeywordEvent();
19
+ return keywordNode;
20
+ });
21
+ }
22
+ getNodeByKeyword(userInput, keywordNodes) {
23
+ const matchedKeywordNodes = keywordNodes.filter(node => this.matchKeywords(userInput, node));
24
+ if (matchedKeywordNodes.length > 0 && matchedKeywordNodes[0].target) {
25
+ return matchedKeywordNodes[0];
8
26
  }
9
- const eventArgs = {
10
- confidence_successful: true,
11
- };
12
- yield trackEvent(request, EventName.botKeywordsModel, eventArgs);
13
- return keywordNode;
14
- });
27
+ return undefined;
28
+ }
29
+ matchKeywords(userInput, node) {
30
+ const result = node.content.keywords.find(keywords => {
31
+ if (keywords.locale === this.locale) {
32
+ this.keywordNodeId = node.id;
33
+ return this.inputMatchesAnyKeyword(userInput, keywords.values);
34
+ }
35
+ return false;
36
+ });
37
+ return Boolean(result);
38
+ }
39
+ inputMatchesAnyKeyword(userInput, keywords) {
40
+ return keywords.some(keyword => {
41
+ const regExpMatchArray = keyword.match(REG_EXP_PATTERN);
42
+ if (regExpMatchArray) {
43
+ const keywordAsRegExp = this.resolveKeywordAsRegExp(regExpMatchArray);
44
+ const match = userInput.match(keywordAsRegExp);
45
+ this.isRegExp = true;
46
+ this.matchedKeyword = match ? match[0] : undefined;
47
+ }
48
+ else {
49
+ this.isRegExp = false;
50
+ this.matchedKeyword = userInput.includes(keyword) ? keyword : undefined;
51
+ }
52
+ return this.matchedKeyword !== undefined;
53
+ });
54
+ }
55
+ resolveKeywordAsRegExp(regExpMatchArray) {
56
+ const [, pattern, flags] = regExpMatchArray;
57
+ return new RegExp(pattern, flags);
58
+ }
59
+ trackKeywordEvent() {
60
+ return __awaiter(this, void 0, void 0, function* () {
61
+ const eventArgs = {
62
+ nluKeywordId: this.keywordNodeId,
63
+ nluKeywordName: this.matchedKeyword,
64
+ nluKeywordIsRegex: this.isRegExp,
65
+ nluKeywordMessageId: this.request.input.message_id,
66
+ };
67
+ yield trackEvent(this.request, EventAction.keyword, eventArgs);
68
+ });
69
+ }
15
70
  }
16
71
  //# sourceMappingURL=keyword.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"keyword.js","sourceRoot":"","sources":["../../../src/user-input/keyword.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAEnD,MAAM,UAAgB,qBAAqB,CACzC,MAAsB,EACtB,MAAc,EACd,OAAsB,EACtB,SAAiB;;QAEjB,MAAM,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAC9D,IAAI,CAAC,WAAW,EAAE;YAChB,OAAO,SAAS,CAAA;SACjB;QACD,MAAM,SAAS,GAAG;YAChB,qBAAqB,EAAE,IAAI;SAC5B,CAAA;QACD,MAAM,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAA;QAChE,OAAO,WAAW,CAAA;IACpB,CAAC;CAAA"}
1
+ {"version":3,"file":"keyword.js","sourceRoot":"","sources":["../../../src/user-input/keyword.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,21 @@
1
1
  import { ActionRequest } from '@botonic/react';
2
2
  import { FlowBuilderApi } from '../api';
3
3
  import { HtSmartIntentNode } from '../content-fields/hubtype-fields/smart-intent';
4
- export declare function getSmartIntentNodeByInput(cmsApi: FlowBuilderApi, request: ActionRequest): Promise<HtSmartIntentNode | undefined>;
4
+ export interface SmartIntentsInferenceParams {
5
+ bot_id: string;
6
+ text: string;
7
+ num_smart_intents_to_use?: number;
8
+ use_latest: boolean;
9
+ }
10
+ export interface SmartIntentsInferenceConfig {
11
+ useLatest: boolean;
12
+ numSmartIntentsToUse?: number;
13
+ }
14
+ export declare class SmartIntentsApi {
15
+ cmsApi: FlowBuilderApi;
16
+ currentRequest: ActionRequest;
17
+ smartIntentsConfig: SmartIntentsInferenceConfig;
18
+ constructor(cmsApi: FlowBuilderApi, currentRequest: ActionRequest, smartIntentsConfig: SmartIntentsInferenceConfig);
19
+ getNodeByInput(): Promise<HtSmartIntentNode | undefined>;
20
+ private getInference;
21
+ }
@@ -1,38 +1,56 @@
1
1
  import { __awaiter } from "tslib";
2
2
  import axios from 'axios';
3
- export function getSmartIntentNodeByInput(cmsApi, request) {
4
- return __awaiter(this, void 0, void 0, function* () {
5
- const smartIntentNodes = cmsApi.getSmartIntentNodes();
6
- if (smartIntentNodes.length === 0) {
7
- return undefined;
8
- }
9
- const intentsInferenceParams = smartIntentNodes.map(smartIntentNode => {
10
- return {
11
- name: smartIntentNode.content.title,
12
- definition: smartIntentNode.content.description,
3
+ import { EventAction, trackEvent } from '../tracking';
4
+ export class SmartIntentsApi {
5
+ constructor(cmsApi, currentRequest, smartIntentsConfig) {
6
+ this.cmsApi = cmsApi;
7
+ this.currentRequest = currentRequest;
8
+ this.smartIntentsConfig = smartIntentsConfig;
9
+ }
10
+ getNodeByInput() {
11
+ return __awaiter(this, void 0, void 0, function* () {
12
+ if (!this.currentRequest.input.data)
13
+ return undefined;
14
+ const smartIntentNodes = this.cmsApi.getSmartIntentNodes();
15
+ if (!smartIntentNodes.length)
16
+ return undefined;
17
+ const params = {
18
+ bot_id: this.currentRequest.session.bot.id,
19
+ text: this.currentRequest.input.data,
20
+ num_smart_intents_to_use: this.smartIntentsConfig.numSmartIntentsToUse,
21
+ use_latest: this.smartIntentsConfig.useLatest,
13
22
  };
23
+ try {
24
+ const response = yield this.getInference(params);
25
+ const smartIntentNode = smartIntentNodes.find(smartIntentNode => smartIntentNode.content.title === response.data.smart_intent_title);
26
+ if (smartIntentNode) {
27
+ trackEvent(this.currentRequest, EventAction.intentSmart, {
28
+ nluIntentSmartTitle: response.data.smart_intent_title,
29
+ nluIntentSmartNumUsed: response.data.smart_intents_used,
30
+ nluIntentSmartMessageId: this.currentRequest.input.message_id,
31
+ });
32
+ return smartIntentNode;
33
+ }
34
+ }
35
+ catch (e) {
36
+ console.error(e);
37
+ }
38
+ return undefined;
14
39
  });
15
- intentsInferenceParams.push({
16
- name: 'Other',
17
- definition: 'The text does not belong to any other intent.',
18
- });
19
- try {
20
- const response = yield axios({
40
+ }
41
+ getInference(inferenceParams) {
42
+ return __awaiter(this, void 0, void 0, function* () {
43
+ return yield axios({
21
44
  method: 'POST',
22
- url: `${process.env.HUBTYPE_API_URL}/external/v1/ai/smart_intents/inference/`,
45
+ url: `${process.env.HUBTYPE_API_URL}/external/v2/ai/smart_intents/inference/`,
23
46
  headers: {
24
- Authorization: `Bearer ${request.session._access_token}`,
47
+ Authorization: `Bearer ${this.currentRequest.session._access_token}`,
25
48
  'Content-Type': 'application/json',
26
49
  },
27
- data: { text: request.input.data, intents: intentsInferenceParams },
50
+ data: inferenceParams,
28
51
  timeout: 10000,
29
52
  });
30
- return smartIntentNodes.find(smartIntentNode => smartIntentNode.content.title === response.data.intent_name);
31
- }
32
- catch (e) {
33
- console.error(e);
34
- return undefined;
35
- }
36
- });
53
+ });
54
+ }
37
55
  }
38
56
  //# sourceMappingURL=smart-intent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"smart-intent.js","sourceRoot":"","sources":["../../../src/user-input/smart-intent.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,MAAM,UAAgB,yBAAyB,CAC7C,MAAsB,EACtB,OAAsB;;QAEtB,MAAM,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,EAAE,CAAA;QACrD,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;YACjC,OAAO,SAAS,CAAA;SACjB;QAED,MAAM,sBAAsB,GAAG,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE;YACpE,OAAO;gBACL,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,KAAK;gBACnC,UAAU,EAAE,eAAe,CAAC,OAAO,CAAC,WAAW;aAChD,CAAA;QACH,CAAC,CAAC,CAAA;QACF,sBAAsB,CAAC,IAAI,CAAC;YAC1B,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,+CAA+C;SAC5D,CAAC,CAAA;QAEF,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC;gBAC3B,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,0CAA0C;gBAC7E,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE;oBACxD,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,sBAAsB,EAAE;gBACnE,OAAO,EAAE,KAAK;aACf,CAAC,CAAA;YACF,OAAO,gBAAgB,CAAC,IAAI,CAC1B,eAAe,CAAC,EAAE,CAChB,eAAe,CAAC,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,IAAI,CAAC,WAAW,CAC9D,CAAA;SACF;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAChB,OAAO,SAAS,CAAA;SACjB;IACH,CAAC;CAAA"}
1
+ {"version":3,"file":"smart-intent.js","sourceRoot":"","sources":["../../../src/user-input/smart-intent.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAerD,MAAM,OAAO,eAAe;IAC1B,YACS,MAAsB,EACtB,cAA6B,EAC7B,kBAA+C;QAF/C,WAAM,GAAN,MAAM,CAAgB;QACtB,mBAAc,GAAd,cAAc,CAAe;QAC7B,uBAAkB,GAAlB,kBAAkB,CAA6B;IACrD,CAAC;IAEE,cAAc;;YAClB,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO,SAAS,CAAA;YACrD,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAA;YAC1D,IAAI,CAAC,gBAAgB,CAAC,MAAM;gBAAE,OAAO,SAAS,CAAA;YAE9C,MAAM,MAAM,GAAG;gBACb,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBAC1C,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI;gBACpC,wBAAwB,EAAE,IAAI,CAAC,kBAAkB,CAAC,oBAAoB;gBACtE,UAAU,EAAE,IAAI,CAAC,kBAAkB,CAAC,SAAS;aAC9C,CAAA;YAED,IAAI;gBACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;gBAChD,MAAM,eAAe,GAAG,gBAAgB,CAAC,IAAI,CAC3C,eAAe,CAAC,EAAE,CAChB,eAAe,CAAC,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CACrE,CAAA;gBACD,IAAI,eAAe,EAAE;oBACnB,UAAU,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,WAAW,EAAE;wBACvD,mBAAmB,EAAE,QAAQ,CAAC,IAAI,CAAC,kBAAkB;wBACrD,qBAAqB,EAAE,QAAQ,CAAC,IAAI,CAAC,kBAAkB;wBACvD,uBAAuB,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU;qBAC9D,CAAC,CAAA;oBACF,OAAO,eAAe,CAAA;iBACvB;aACF;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;aACjB;YACD,OAAO,SAAS,CAAA;QAClB,CAAC;KAAA;IAEa,YAAY,CACxB,eAA4C;;YAE5C,OAAO,MAAM,KAAK,CAAC;gBACjB,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,0CAA0C;gBAC7E,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,aAAa,EAAE;oBACpE,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,KAAK;aACf,CAAC,CAAA;QACJ,CAAC;KAAA;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botonic/plugin-flow-builder",
3
- "version": "0.26.2-alpha.0",
3
+ "version": "0.27.0-alpha.0",
4
4
  "main": "./lib/cjs/index.js",
5
5
  "module": "./lib/esm/index.js",
6
6
  "description": "Use Flow Builder to show your contents",
@@ -14,7 +14,7 @@
14
14
  "lint_core": "../../node_modules/.bin/eslint_d --cache --quiet 'src/**/*.ts*'"
15
15
  },
16
16
  "dependencies": {
17
- "@botonic/react": "^0.26.2-alpha.0",
17
+ "@botonic/react": "^0.27.0-alpha.0",
18
18
  "axios": "^1.6.8",
19
19
  "uuid": "^9.0.1"
20
20
  },
@@ -5,7 +5,8 @@ import { FlowBuilderApi } from '../api'
5
5
  import { FlowContent, FlowHandoff } from '../content-fields'
6
6
  import { HtNodeWithContent } from '../content-fields/hubtype-fields'
7
7
  import { getFlowBuilderPlugin } from '../helpers'
8
- import { EventName, trackEvent } from '../tracking'
8
+ import BotonicPluginFlowBuilder from '../index'
9
+ import { EventAction, getNodeEventArgs, trackEvent } from '../tracking'
9
10
  import { createNodeFromKnowledgeBase } from './knowledge-bases'
10
11
 
11
12
  export type FlowBuilderActionProps = {
@@ -18,15 +19,7 @@ export class FlowBuilderAction extends React.Component<FlowBuilderActionProps> {
18
19
  static async botonicInit(
19
20
  request: ActionRequest
20
21
  ): Promise<FlowBuilderActionProps> {
21
- const flowBuilderPlugin = getFlowBuilderPlugin(request.plugins)
22
- const locale = flowBuilderPlugin.getLocale(request.session)
23
-
24
- const targetNode = await getTargetNode(flowBuilderPlugin.cmsApi, request)
25
-
26
- const contents = await flowBuilderPlugin.getContentsByNode(
27
- targetNode,
28
- locale
29
- )
22
+ const contents = await getContents(request)
30
23
 
31
24
  const handoffContent = contents.find(
32
25
  content => content instanceof FlowHandoff
@@ -55,26 +48,64 @@ export class FlowBuilderMultichannelAction extends FlowBuilderAction {
55
48
  }
56
49
  }
57
50
 
58
- async function getTargetNode(cmsApi: FlowBuilderApi, request: ActionRequest) {
51
+ async function getContents(request: ActionRequest): Promise<FlowContent[]> {
52
+ const flowBuilderPlugin = getFlowBuilderPlugin(request.plugins)
53
+ const cmsApi = flowBuilderPlugin.cmsApi
54
+ const locale = flowBuilderPlugin.getLocale(request.session)
55
+ const resolvedLocale = flowBuilderPlugin.cmsApi.getResolvedLocale(locale)
56
+ const context = {
57
+ cmsApi,
58
+ flowBuilderPlugin,
59
+ request,
60
+ resolvedLocale,
61
+ }
62
+
59
63
  if (request.session.is_first_interaction) {
60
- const startNode = cmsApi.getStartNode()
61
- await trackEvent(request, EventName.botStart)
62
- return startNode
64
+ return await flowBuilderPlugin.getStartContents(resolvedLocale)
65
+ }
66
+
67
+ if (request.input.payload) {
68
+ return await getContentsByPayload(context)
63
69
  }
64
- const contentId = request.input.payload
65
70
 
66
- const targetNode = contentId
67
- ? cmsApi.getNodeById<HtNodeWithContent>(contentId)
71
+ return await getContentsByFallback(context)
72
+ }
73
+
74
+ interface FlowBuilderContext {
75
+ cmsApi: FlowBuilderApi
76
+ flowBuilderPlugin: BotonicPluginFlowBuilder
77
+ request: ActionRequest
78
+ resolvedLocale: string
79
+ }
80
+
81
+ async function getContentsByPayload({
82
+ cmsApi,
83
+ flowBuilderPlugin,
84
+ request,
85
+ resolvedLocale,
86
+ }: FlowBuilderContext): Promise<FlowContent[]> {
87
+ const targetNode = request.input.payload
88
+ ? cmsApi.getNodeById<HtNodeWithContent>(request.input.payload)
68
89
  : undefined
69
90
 
70
91
  if (targetNode) {
71
- const eventArgs = {
72
- faq_name: targetNode.code,
73
- }
74
- await trackEvent(request, EventName.botFaq, eventArgs)
75
- return targetNode
92
+ const eventArgs = getNodeEventArgs(request, targetNode)
93
+ await trackEvent(request, EventAction.flowNode, eventArgs)
94
+ return await flowBuilderPlugin.getContentsByNode(targetNode, resolvedLocale)
76
95
  }
77
- return await getFallbackNode(cmsApi, request)
96
+ return []
97
+ }
98
+
99
+ async function getContentsByFallback({
100
+ cmsApi,
101
+ flowBuilderPlugin,
102
+ request,
103
+ resolvedLocale,
104
+ }: FlowBuilderContext): Promise<FlowContent[]> {
105
+ const fallbackNode = await getFallbackNode(cmsApi, request)
106
+ const eventArgs = getNodeEventArgs(request, fallbackNode)
107
+ await trackEvent(request, EventAction.flowNode, eventArgs)
108
+ return await flowBuilderPlugin.getContentsByNode(fallbackNode, resolvedLocale)
78
109
  }
79
110
 
80
111
  async function getFallbackNode(cmsApi: FlowBuilderApi, request: ActionRequest) {
@@ -95,6 +126,9 @@ async function getFallbackNode(cmsApi: FlowBuilderApi, request: ActionRequest) {
95
126
  const fallbackNode = cmsApi.getFallbackNode(isFirstFallbackOption)
96
127
  request.session.user.extra_data.isFirstFallbackOption = !isFirstFallbackOption
97
128
 
98
- await trackEvent(request, EventName.fallback)
129
+ trackEvent(request, EventAction.fallback, {
130
+ fallbackAttempt: isFirstFallbackOption ? 1 : 2,
131
+ })
132
+
99
133
  return fallbackNode
100
134
  }
@@ -9,7 +9,7 @@ import {
9
9
  HtTextNode,
10
10
  } from '../content-fields/hubtype-fields'
11
11
  import { getFlowBuilderPlugin } from '../helpers'
12
- import { EventName, trackEvent } from '../tracking'
12
+ import { EventAction, trackEvent } from '../tracking'
13
13
 
14
14
  export async function createNodeFromKnowledgeBase(
15
15
  cmsApi: FlowBuilderApi,
@@ -28,11 +28,11 @@ export async function createNodeFromKnowledgeBase(
28
28
  const knowledgeBaseResponse =
29
29
  await flowBuilderPlugin.getKnowledgeBaseResponse(request)
30
30
  if (knowledgeBaseResponse.hasKnowledge) {
31
- await trackEvent(request, EventName.botAiKnowledgeBase, {
32
- answer: knowledgeBaseResponse.answer,
33
- knowledge_source_ids: knowledgeBaseResponse.sources.map(
31
+ await trackEvent(request, EventAction.knowledgebase, {
32
+ knowledgebaseSourcesIds: knowledgeBaseResponse.sources.map(
34
33
  source => source.knowledgeSourceId
35
34
  ),
35
+ knowledgebaseChunksIds: [],
36
36
  })
37
37
 
38
38
  const knowledgeBaseNode: HtTextNode = {
@@ -58,8 +58,19 @@ export async function createNodeFromKnowledgeBase(
58
58
  }
59
59
  return knowledgeBaseNode
60
60
  }
61
+ await trackEvent(request, EventAction.knowledgebase, {
62
+ knowledgebaseFailReason:
63
+ 'The knowledge base does not have enough knowledge',
64
+ knowledgeSourceIds: [],
65
+ knowledgebaseChunksIds: [],
66
+ })
61
67
  } catch (e) {
62
- console.log('Hubtype knowledge base api error: ', { e })
68
+ console.error('Hubtype knowledge base api error: ', { e })
69
+ await trackEvent(request, EventAction.knowledgebase, {
70
+ knowledgebaseFailReason: 'Knowledge base api error',
71
+ knowledgeSourceIds: [],
72
+ knowledgebaseChunksIds: [],
73
+ })
63
74
  return undefined
64
75
  }
65
76
  }