UNPKG

@botonic/plugin-flow-builder

Version:

Use Flow Builder to show your contents

80 lines (72 loc) 2.19 kB
import { ActionRequest } from '@botonic/react' import { v7 as uuidv7 } from 'uuid' import { FlowContent } from './content-fields' import { HtNodeWithContent, HtNodeWithContentType, } from './content-fields/hubtype-fields' import { getFlowBuilderPlugin } from './helpers' export enum EventAction { FlowNode = 'flow_node', Keyword = 'nlu_keyword', IntentSmart = 'nlu_intent_smart', Knowledgebase = 'knowledgebase', Fallback = 'fallback', FeedbackCase = 'feedback_case', } export enum KnowledgebaseFailReason { NoKnowledge = 'no_knowledge', Hallucination = 'hallucination', } export async function trackEvent( request: ActionRequest, eventAction: EventAction, args?: Record<string, any> ): Promise<void> { const flowBuilderPlugin = getFlowBuilderPlugin(request.plugins) if (flowBuilderPlugin.trackEvent) { await flowBuilderPlugin.trackEvent(request, eventAction, args) } return } export async function trackFlowContent( request: ActionRequest, contents: FlowContent[] ) { const flowBuilderPlugin = getFlowBuilderPlugin(request.plugins) const cmsApi = flowBuilderPlugin.cmsApi for (const content of contents) { const nodeContent = cmsApi.getNodeById<HtNodeWithContent>(content.id) if (nodeContent.type !== HtNodeWithContentType.KNOWLEDGE_BASE) { const eventArgs = getContentEventArgs(request, { code: nodeContent.code, flowId: nodeContent.flow_id, flowName: flowBuilderPlugin.getFlowName(nodeContent.flow_id), id: nodeContent.id, isMeaningful: nodeContent.is_meaningful ?? false, }) await trackEvent(request, EventAction.FlowNode, eventArgs) } } } function getContentEventArgs( request: ActionRequest, contentInfo: { code: string flowId: string flowName: string id: string isMeaningful: boolean } ) { const flowThreadId = request.session.flow_thread_id ?? uuidv7() request.session.flow_thread_id = flowThreadId return { flowThreadId, flowId: contentInfo.flowId, flowName: contentInfo.flowName, flowNodeId: contentInfo.id, flowNodeContentId: contentInfo.code, flowNodeIsMeaningful: contentInfo.isMeaningful, } }