Symptom Triage Solution Component
Document Title: Orbita Symptom Triage Experience Solution
Solution Center Version: V 1.1.0
Creation Date: Aug 31, 2021
Author: ORBITA
Solution Centers offer packaged pre-built experiences. All Solutions have been designed with the goals of improving time-to-value & decreasing implementation time.
Symptom Triage
Description:
The Orbita Solution Symptom Triage is for any provider and pharma professionals, there is a raising need for a safer, efficient, and quick solution that is responsive, easy to use, and available 24/7.
For this exact need, we have introduced a solution that uses the chatbot to do a preliminary screening of the patients by collecting information about their symptoms and triaging them based on predefined rules.
Why was it created?
For any provider and pharma professional, there is a raising need for a safer, efficient, and quick solution that is responsive, easy to use, and available 24/7.
For this exact need, we have introduced a solution that uses the chatbot to do a preliminary screening of the patients by collecting information about their symptoms and triaging them based on predefined rules.
What is its purpose?
Unlike the orthodox experience of calling a nurse/doctor, going to an urgent care center, going to an emergency room, or scheduling an appointment to meet with a provider or clinician, the Symptom Triage provides an intelligent, conversational, empathetic experience to help consumers define and take action on symptoms they are experiencing and directs them to the appropriate care options.
As an admin user, you will have access to the patient transcripts for further diagnosis/action and pre-built dashboards to track usage and outcomes.
How does it work?
Symptom Triage Solution assists patients in preliminary diagnosis using artificial intelligence to check the symptoms and guide patients to the appropriate medical services.
Recognize when patients express symptoms using natural language.
Guide patients to the right care point:
Call Ambulance/911
Go to the Emergency Room
Schedule a visit to be seen within 24 hours
Schedule routine visit
Self-care at home
Chatbot users will be guided in the button driven conversation flow until they answer all the necessary information to accurately triage the symptoms and guide patients to the point of the right care
At the end of the flow, the chatbot user will receive a Symptom Summary Report with suggested care based on their symptoms.
This is NOT A SUBSTITUTE FOR PROFESSIONAL MEDICAL ADVICE OR TREATMENT.
Sample Symptom Summary Reports
Call Ambulance/911 or Go to the Emergency Room
Schedule visit to be seen within 24 hours
Schedule routine visit
Self-care at home
How do you install it?
The solution comes with the needed prebuilt and customizable conversation flows, dashboards, and interaction models.
How to Install a Package:
Login to Experience Manager
Navigate to your project > Project side navigation menu > Create > Solution Center > Solutions
Click the Add button against the Symptom Triage package. You will get a Success message once the Package is installed successfully
After installing the package, the symptomstriage sub-flow will be available in the Experience Designer > Module Flows tab.
Post-installation
To integrate with the V3 Chatbot please import the below code to the Experience Designer > Bot Manager V3 flow/tab.
[ { "id": "db3f8895.c18028", "type": "orbita-adverse_event", "z": "25baf5ca.56d3aa", "skillConfig": "150ab083.2380ef", "name": "Orbita Detect", "utterance": "{{msg.payload.text}}", "x": 390, "y": 840, "wires": [ [ "fc69261a.dd45a8" ] ] }, { "id": "fc69261a.dd45a8", "type": "function", "z": "25baf5ca.56d3aa", "name": "Set Namespace", "func": "const _ = global.get('lodash');\nconst util = global.get('orbitaUtil');\nlet projectId = util.getProjectId(node);\n_.set(msg, 'orbita.session.NAMESPACE', `symptomtriage:${projectId}`);\n\nreturn msg;", "outputs": 1, "noerr": 0, "x": 580, "y": 840, "wires": [ [ "7f356695.686e28" ] ] }, { "id": "7f356695.686e28", "type": "function", "z": "25baf5ca.56d3aa", "name": "Check Symptoms", "func": "const _ = global.get('lodash');\nconst YES = \"LABEL_1\";\n\nconst NAMESPACE = _.get(msg, 'orbita.session.NAMESPACE');\nconst settings = global.get(NAMESPACE).settings;\n\n\nconst adverseEventDetected = _.get(msg, 'payload.data.adverseEvent[0][0].score', _.get(msg, 'payload.data.adverseEvent.score')) > 0.7 && _.get(msg, 'payload.data.adverseEvent[0][0].label', _.get(msg, 'payload.data.adverseEvent.label')) === YES;\nconst isLaunch = _.get(msg, `payload.session.${NAMESPACE}.isLaunch`);\nlet symptomValue = _.get(msg, 'payload.text');\n\nlet results = _.get(msg, 'data.dynamicData.result');\nlet excludedTerms = settings.excludeUtterancesFromSymTriFlow;\nlet checkUserValue = excludedTerms.findIndex(term => term.toLowerCase() === symptomValue.toString().toLowerCase());\n\n\nif(adverseEventDetected && isLaunch && checkUserValue === -1){\n _.set(msg, `orbita.session.${NAMESPACE}.symptomValue`, symptomValue);\n _.set(msg, 'payload.text', 'Symptoms Checker Conversation');\n}\n\n\nreturn [msg,null];", "outputs": 1, "noerr": 0, "x": 790, "y": 840, "wires": [ [ "6961a47f.5949bc" ] ] }, { "id": "6961a47f.5949bc", "type": "function", "z": "25baf5ca.56d3aa", "name": "Route", "func": "const _ = global.get('lodash');\nconst NAMESPACE = _.get(msg, 'orbita.session.NAMESPACE');\n//const NAMESPACE = 'symptomtriage';\nconst settings = global.get(NAMESPACE).settings;\nconst symptomChecker = global.get(NAMESPACE).symptomChecker || {};\nlet symptomCheckerSessionID = symptomChecker.sessionIDStore\n ? symptomChecker.sessionIDStore[msg.payload.sessionId]\n : null;\n_.set(msg, 'orbitaBotVersion', 3);\nif (symptomCheckerSessionID) {\n let formatId = `hbConvId:${symptomCheckerSessionID}`;\n global.get(`hbConvId:${symptomCheckerSessionID}`, function(err, cacheData) {\n const input = typeof msg.payload.text === \"string\"\n ? msg.payload.text.toLowerCase()\n : msg.payload.text && msg.payload.text.message\n ? msg.payload.text.message.toLowerCase()\n : \"\";\n let genderList = ['male', 'female'];\n if(typeof msg.payload.text === 'string'){\n genderIdx = genderList.findIndex(gender => gender.toLowerCase() === msg.payload.text.toLowerCase()); \n }\n let results = _.get(msg, 'data.dynamicData.result');\n // if (results && results.length > 0) {\n // let result = results[0];\n let excludedTerms = settings.excludeUtterancesFromSymConvFlow;\n let checkUserValue = excludedTerms.findIndex(term => term.toLowerCase() === input.toString().toLowerCase());\n if(checkUserValue >=0 ){\n global.set(`hbConvId:${symptomCheckerSessionID}`, undefined);\n global.set(`hbConvId:${symptomCheckerSessionID}:checkboxes`, undefined);\n return node.send([msg, null]);\n }\n //}\n // switch(input) {\n // case \"open\":\n // case \"mychart\":\n // case \"covid\":\n // case \"covid 19\":\n // case \"covid-19\":\n // case \"find a location\":\n // case \"find location\":\n // case \"agent\":\n // case \"can i please talk with a person\":\n // case \"can i talk to a human\":\n // case \"can i talk to a person\":\n // case \"can i talk to a real person\":\n // case \"can i talk to an agent\":\n // case \"can i talk to someone\":\n // case \"can i talk to the operator\":\n // case \"connect me to a human\":\n // case \"customer service\":\n // case \"customer service rep\":\n // case \"customer service representative\":\n // case \"how to chat with a human\":\n // case \"how to chat with an agent\":\n // case \"how to conncet with a agent\":\n // case \"how to conncet with a human\":\n // case \"how to conncet with a real person\":\n // case \"how to connect with a agent\":\n // case \"how to connect with an agent\":\n // case \"how to connect with rep\":\n // case \"how to connect with representative\":\n // case \"how to talk to a human\":\n // case \"human\":\n // case \"i am having trouble paying my bill\":\n // case \"i need to talk to an operator\":\n // case \"i want to talk to an agent\":\n // case \"i want to talk to someone\":\n // case \"i want to talk with a person\":\n // case \"let me talk to a human\":\n // case \"live agent\":\n // case \"mainmenuescalate\":\n // case \"need to talk with someone\":\n // case \"please let me talk to a human\":\n // case \"real person\":\n // case \"transfer me to a person\":\n // case \"covid screener\":\n // case \"ask a question\":\n // case \"help\":\n // case \"check my symptoms\":\n // case \"start checking symptoms\":\n // case \"symptom checker\":\n // // cacheData = null;\n // global.set(`hbConvId:${symptomCheckerSessionID}`, undefined);\n // global.set(`hbConvId:${symptomCheckerSessionID}:checkboxes`, undefined);\n // return node.send([msg, null]);\n // // break;\n // default:\n // break;\n // }\n msg.text = msg.payload.text;\n if (cacheData) {\n msg.origPayload = JSON.parse(JSON.stringify(msg.payload));\n var myText = msg.payload.text;\n let formatCheckbox = `hbConvId:${symptomCheckerSessionID}:checkboxes`;\n var choices = global.get(`hbConvId:${symptomCheckerSessionID}:checkboxes`);\n if (isNaN(myText) === false && choices && choices.length > 0) {\n var ans = '';\n for(var i = 1; i < myText.length; i++) {\n if (myText[i] == \"1\") {\n var choice = choices[i-1];\n ans += choice.text + ',';\n }\n \n }\n if (ans) {\n ans = ans.substring(0, ans.length - 1);\n }\n if (ans === ''){ // multi select check box but did not click any button.\n ans = 'none';\n }\n msg.origPayload.text = ans;\n msg.origPayload.session.recognizedText = ans;\n }\n }\n if (err) {\n node.warn('error');\n node.error(err, msg);\n node.send([msg, null]);\n } \n else if(cacheData && cacheData.hasOwnProperty('conversationId')) {\n msg.payload = cacheData;\n _.set(msg, `payload.${NAMESPACE}.subFlowName`, 'activityFlow')\n return node.send([null, msg]);\n } else if(cacheData && cacheData.state && cacheData.state === 'start') {\n if(_.get(msg, `payload.session.${NAMESPACE}.symptomValue`)){\n _.set(msg, `orbita.session.${NAMESPACE}.sexValue`, _.get(msg, 'payload.text'));\n }\n _.set(msg, `payload.${NAMESPACE}.subFlowName`, 'conversationFlow')\n return node.send([null, msg]);\n } \n \n else if((genderIdx > -1) && \n (_.get(msg, `payload.session.${NAMESPACE}.symptomValue`)) && \n (_.get(msg, `payload.session.${NAMESPACE}.genderAsked`))){\n _.set(msg, `orbita.session.${NAMESPACE}.sexValue`, _.get(msg, 'payload.text'));\n global.get(`hbConvId:${symptomCheckerSessionID}`, function(err, symptomCacheData) {\n if (err) {\n node.warn('error');\n node.error(err, msg);\n node.send([msg, null]);\n } else if(symptomCacheData && symptomCacheData.state && symptomCacheData.state === 'start'){\n _.set(msg, `payload.${NAMESPACE}.subFlowName`, 'conversationFlow')\n return node.send([null, msg]);\n }\n });\n }\n else {\n return node.send([msg, null]);\n }\n });\n} else {\n return node.send([msg, null]); \n}\n", "outputs": 2, "noerr": 0, "x": 990, "y": 840, "wires": [ [ "6367ec18.d48104" ], [ "346a7253.36fb4e" ] ] }, { "id": "150ab083.2380ef", "type": "alexa-skill-config", "skillname": "Symptom-Triage", "projectId": "607ee6aa02ca46007aef1752", "intents": "[]", "skillstate": "fromsession, useSymptomChecker, escalation, flowManager,flow, test,FlowStudio, testState, bill,escalation,confirm_escalation,help,emergency, Reminder, sanity, flow_stud,webWeight,fromSession,flowMngr,scheduleride,aMedication,Survey,whyhelpmessage,medication,callorcomeby,Januvia,survey2,glucose,faqquestion,DailySurveyInProgress,HeadacheSurveyInProgress,MonthlySurveyInProgress,FeedbackSurveyInProgress,AllReportsDone,AskedForChangeResponse,AskedForChangeTwice,MigraineTrackerQuestions1,MigraineTrackerQuestions2,MigraineTrackerQuestions3,StudyQuestions1,StudyQuestions2,StudyQuestions3,Help1,Help2,Help3,AskedForHeadacheStart,AskedForHeadacheStartYesterday,AskedForHeadacheStartTime,AskedForHeadacheEndTime,AskedForHeadacheTimeCorrectness,AskedForHeadacheChangeStartTime,AskedForHeadacheEndDate,InvalidHeadacheTime,AskedForContinuePartial,MaxRecognitionError,ServicePhoneNumber,ConfirmGoHome,ConfirmStop,ConfirmPause,ConfirmCancel,FORTESTING,testState,setup, startup, Survey,flowManager, survey, flowMngr,eventSurvey, whyhelpmessage, HeadacheSurveyInProgress, MonthlySurveyInProgress, FeedbackSurveyInProgress, AllReportsDone, AskedForChangeResponse, AskedForChangeTwice, MigraineTrackerQuestions1, MigraineTrackerQuestions2, MigraineTrackerQuestions3, StudyQuestions1, StudyQuestions2, StudyQuestions3, Help1, Help2, Help3, AskedForHeadacheStart, AskedForHeadacheStartYesterday, AskedForHeadacheStartTime, AskedForHeadacheEndTime, AskedForHeadacheTimeCorrectness, AskedForHeadacheChangeStartTime, AskedForHeadacheEndDate, InvalidHeadacheTime, AskedForContinuePartial, MaxRecognitionError, ServicePhoneNumber, ConfirmGoHome, ConfirmStop, ConfirmPause, ConfirmCancel,pain,dual,TreatmentSurgery,plateletsflow,password,changeappointmentList,MedicalHeart,chooseLocation,cancelAppointment,plateletsFlow, reminder, CheckUser, fromSession, plateletsFlow, cancelAppointment,PlateletsChangeOption,MedicalHemochromatosis, MedicalHeart,LifestyleSTD,setDateOrTimeIntent, FAQ,setTimelanding,setDatelanding,FAQ, fromsession, mayoKB, orbitaKB, askAnother, afterAssessment, phonePrompt, awaitingPhone, confirmPhone, finalPhonePrompt, inChunkedAnswer, appointmentPhonePrompt,reminder,CheckUser,Reminder,sanity,SymptomTriage" }, { "id": "slots", "type": "slots", "z": "", "slots": [] } ]
To integrate with V2 Chatbot please import the below code to the Experience Designer > Bot Manager flow/tab.
[{ "id":"b81284f1.48aff8", "type":"orbita-adverse_event", "z":"3e1c01c1.4a67fe", "skillConfig":"596fae0e.2292e", "name":"Orbita Detect", "utterance":"{{msg.payload.text}}", "x":210, "y":400, "wires":[["fc40139c.2608a"]] }, { "id":"fc40139c.2608a", "type":"function", "z":"3e1c01c1.4a67fe", "name":"Set Namespace", "func":"const _ = global.get('lodash');\nconst util = global.get('orbitaUtil');\nlet projectId = util.getProjectId(node);\n_.set(msg, 'orbita.session.NAMESPACE', `symptomtriage:${projectId}`);\n\nreturn msg;", "outputs":1, "noerr":0, "x":400, "y":400, "wires":[["21bbeccc.b0f774"]] }, { "id":"21bbeccc.b0f774", "type":"function", "z":"3e1c01c1.4a67fe", "name":"Check Symptoms", "func":"const _ = global.get('lodash');\nconst YES = \"LABEL_1\";\n\nconst NAMESPACE = _.get(msg, 'orbita.session.NAMESPACE');\nconst settings = global.get(NAMESPACE).settings;\n\n\nconst adverseEventDetected = _.get(msg, 'payload.data.adverseEvent[0][0].score', _.get(msg, 'payload.data.adverseEvent.score')) > 0.7 && _.get(msg, 'payload.data.adverseEvent[0][0].label', _.get(msg, 'payload.data.adverseEvent.label')) === YES;\nconst isLaunch = _.get(msg, `payload.session.${NAMESPACE}.isLaunch`);\nlet symptomValue = _.get(msg, 'payload.text');\n\nlet results = _.get(msg, 'data.dynamicData.result');\nlet excludedTerms = settings.excludeUtterancesFromSymTriFlow;\nlet checkUserValue = excludedTerms.findIndex(term => term.toLowerCase() === symptomValue.toString().toLowerCase());\n\n\nif(adverseEventDetected && isLaunch && checkUserValue === -1){\n _.set(msg, `orbita.session.${NAMESPACE}.symptomValue`, symptomValue);\n _.set(msg, 'payload.text', 'Symptoms Checker Conversation');\n}\n\n\nreturn [msg,null];", "outputs":1, "noerr":0, "x":610, "y":400, "wires":[["7f483945.e80988"]] }, { "id":"7f483945.e80988", "type":"function", "z":"3e1c01c1.4a67fe", "name":"Route", "func":"const _ = global.get('lodash');\nconst NAMESPACE = _.get(msg, 'orbita.session.NAMESPACE');\n//const NAMESPACE = 'symptomtriage';\nconst settings = global.get(NAMESPACE).settings;\nconst symptomChecker = global.get(NAMESPACE).symptomChecker || {};\nlet symptomCheckerSessionID = symptomChecker.sessionIDStore\n ? symptomChecker.sessionIDStore[msg.payload.sessionId]\n : null;\n\nif (symptomCheckerSessionID) {\n let formatId = `hbConvId:${symptomCheckerSessionID}`;\n global.get(`hbConvId:${symptomCheckerSessionID}`, function(err, cacheData) {\n const input = typeof msg.payload.text === \"string\"\n ? msg.payload.text.toLowerCase()\n : msg.payload.text && msg.payload.text.message\n ? msg.payload.text.message.toLowerCase()\n : \"\";\n let genderList = ['male', 'female'];\n if(typeof msg.payload.text === 'string'){\n genderIdx = genderList.findIndex(gender => gender.toLowerCase() === msg.payload.text.toLowerCase()); \n }\n let results = _.get(msg, 'data.dynamicData.result');\n // if (results && results.length > 0) {\n // let result = results[0];\n let excludedTerms = settings.excludeUtterancesFromSymConvFlow;\n let checkUserValue = excludedTerms.findIndex(term => term.toLowerCase() === input.toString().toLowerCase());\n if(checkUserValue >=0 ){\n global.set(`hbConvId:${symptomCheckerSessionID}`, undefined);\n global.set(`hbConvId:${symptomCheckerSessionID}:checkboxes`, undefined);\n return node.send([msg, null]);\n }\n //}\n // switch(input) {\n // case \"open\":\n // case \"mychart\":\n // case \"covid\":\n // case \"covid 19\":\n // case \"covid-19\":\n // case \"find a location\":\n // case \"find location\":\n // case \"agent\":\n // case \"can i please talk with a person\":\n // case \"can i talk to a human\":\n // case \"can i talk to a person\":\n // case \"can i talk to a real person\":\n // case \"can i talk to an agent\":\n // case \"can i talk to someone\":\n // case \"can i talk to the operator\":\n // case \"connect me to a human\":\n // case \"customer service\":\n // case \"customer service rep\":\n // case \"customer service representative\":\n // case \"how to chat with a human\":\n // case \"how to chat with an agent\":\n // case \"how to conncet with a agent\":\n // case \"how to conncet with a human\":\n // case \"how to conncet with a real person\":\n // case \"how to connect with a agent\":\n // case \"how to connect with an agent\":\n // case \"how to connect with rep\":\n // case \"how to connect with representative\":\n // case \"how to talk to a human\":\n // case \"human\":\n // case \"i am having trouble paying my bill\":\n // case \"i need to talk to an operator\":\n // case \"i want to talk to an agent\":\n // case \"i want to talk to someone\":\n // case \"i want to talk with a person\":\n // case \"let me talk to a human\":\n // case \"live agent\":\n // case \"mainmenuescalate\":\n // case \"need to talk with someone\":\n // case \"please let me talk to a human\":\n // case \"real person\":\n // case \"transfer me to a person\":\n // case \"covid screener\":\n // case \"ask a question\":\n // case \"help\":\n // case \"check my symptoms\":\n // case \"start checking symptoms\":\n // case \"symptom checker\":\n // // cacheData = null;\n // global.set(`hbConvId:${symptomCheckerSessionID}`, undefined);\n // global.set(`hbConvId:${symptomCheckerSessionID}:checkboxes`, undefined);\n // return node.send([msg, null]);\n // // break;\n // default:\n // break;\n // }\n msg.text = msg.payload.text;\n if (cacheData) {\n msg.origPayload = JSON.parse(JSON.stringify(msg.payload));\n var myText = msg.payload.text;\n let formatCheckbox = `hbConvId:${symptomCheckerSessionID}:checkboxes`;\n var choices = global.get(`hbConvId:${symptomCheckerSessionID}:checkboxes`);\n if (isNaN(myText) === false && choices && choices.length > 0) {\n var ans = '';\n for(var i = 1; i < myText.length; i++) {\n if (myText[i] == \"1\") {\n var choice = choices[i-1];\n ans += choice.text + ',';\n }\n \n }\n if (ans) {\n ans = ans.substring(0, ans.length - 1);\n }\n if (ans === ''){ // multi select check box but did not click any button.\n ans = 'none';\n }\n msg.origPayload.text = ans;\n msg.origPayload.session.recognizedText = ans;\n }\n }\n if (err) {\n node.warn('error');\n node.error(err, msg);\n node.send([msg, null]);\n } \n else if(cacheData && cacheData.hasOwnProperty('conversationId')) {\n msg.payload = cacheData;\n _.set(msg, `payload.${NAMESPACE}.subFlowName`, 'activityFlow')\n return node.send([null, msg]);\n } else if(cacheData && cacheData.state && cacheData.state === 'start') {\n if(_.get(msg, `payload.session.${NAMESPACE}.symptomValue`)){\n _.set(msg, `orbita.session.${NAMESPACE}.sexValue`, _.get(msg, 'payload.text'));\n }\n _.set(msg, `payload.${NAMESPACE}.subFlowName`, 'conversationFlow')\n return node.send([null, msg]);\n } \n \n else if((genderIdx > -1) && \n (_.get(msg, `payload.session.${NAMESPACE}.symptomValue`)) && \n (_.get(msg, `payload.session.${NAMESPACE}.genderAsked`))){\n _.set(msg, `orbita.session.${NAMESPACE}.sexValue`, _.get(msg, 'payload.text'));\n global.get(`hbConvId:${symptomCheckerSessionID}`, function(err, symptomCacheData) {\n if (err) {\n node.warn('error');\n node.error(err, msg);\n node.send([msg, null]);\n } else if(symptomCacheData && symptomCacheData.state && symptomCacheData.state === 'start'){\n _.set(msg, `payload.${NAMESPACE}.subFlowName`, 'conversationFlow')\n return node.send([null, msg]);\n }\n });\n }\n else {\n return node.send([msg, null]);\n }\n });\n} else {\n return node.send([msg, null]); \n}\n", "outputs":2, "noerr":0, "x":810, "y":400, "wires":[["a9416a01.5e0588"],["67e76b2.149a394"]] }, { "id":"596fae0e.2292e", "type":"alexa-skill-config", "skillname":"triage test", "projectId":"621626fe39ad3d0072ef6fae", "intents":"[]", "skillstate":"fromsession, useSymptomChecker, escalation, flowManager,flow, test,FlowStudio, testState, bill,escalation,confirm_escalation,help,emergency, Reminder, sanity, flow_stud,webWeight,fromSession,flowMngr,scheduleride,aMedication,Survey,whyhelpmessage,medication,callorcomeby,Januvia,survey2,glucose,faqquestion,DailySurveyInProgress,HeadacheSurveyInProgress,MonthlySurveyInProgress,FeedbackSurveyInProgress,AllReportsDone,AskedForChangeResponse,AskedForChangeTwice,MigraineTrackerQuestions1,MigraineTrackerQuestions2,MigraineTrackerQuestions3,StudyQuestions1,StudyQuestions2,StudyQuestions3,Help1,Help2,Help3,AskedForHeadacheStart,AskedForHeadacheStartYesterday,AskedForHeadacheStartTime,AskedForHeadacheEndTime,AskedForHeadacheTimeCorrectness,AskedForHeadacheChangeStartTime,AskedForHeadacheEndDate,InvalidHeadacheTime,AskedForContinuePartial,MaxRecognitionError,ServicePhoneNumber,ConfirmGoHome,ConfirmStop,ConfirmPause,ConfirmCancel,FORTESTING,testState,setup, startup, Survey,flowManager, survey, flowMngr,eventSurvey, whyhelpmessage, HeadacheSurveyInProgress, MonthlySurveyInProgress, FeedbackSurveyInProgress, AllReportsDone, AskedForChangeResponse, AskedForChangeTwice, MigraineTrackerQuestions1, MigraineTrackerQuestions2, MigraineTrackerQuestions3, StudyQuestions1, StudyQuestions2, StudyQuestions3, Help1, Help2, Help3, AskedForHeadacheStart, AskedForHeadacheStartYesterday, AskedForHeadacheStartTime, AskedForHeadacheEndTime, AskedForHeadacheTimeCorrectness, AskedForHeadacheChangeStartTime, AskedForHeadacheEndDate, InvalidHeadacheTime, AskedForContinuePartial, MaxRecognitionError, ServicePhoneNumber, ConfirmGoHome, ConfirmStop, ConfirmPause, ConfirmCancel,pain,dual,TreatmentSurgery,plateletsflow,password,changeappointmentList,MedicalHeart,chooseLocation,cancelAppointment,plateletsFlow, reminder, CheckUser, fromSession, plateletsFlow, cancelAppointment,PlateletsChangeOption,MedicalHemochromatosis, MedicalHeart,LifestyleSTD,setDateOrTimeIntent, FAQ,setTimelanding,setDatelanding,FAQ, fromsession, mayoKB, orbitaKB, askAnother, afterAssessment, phonePrompt, awaitingPhone, confirmPhone, finalPhonePrompt, inChunkedAnswer, appointmentPhonePrompt,reminder,CheckUser,Reminder,sanity,SymptomTriage" }, { "id":"slots", "type":"slots", "z":"", "slots":[] }]
Copy the respective V2 or V3 bot code.
a. For V2, Go to Experience Designer > Bot Manager Tab > Hamburger Menu > Import > Clipboard.
b. For V3, Go to Experience Designer > Bot Manager V3 Tab > Hamburger Menu > Import > Clipboard.The above import will add 4 nodes to the Bot Manager tab or Bot Manager V3 tab as shown below.
a. V2 - Bot Manager Tab:
b. V3 - Bot Manager V3 Tab:Connect the nodes as described below: (Please refer to the steps based on the Chatbot version)
a. Follow the below steps for V2:
- Disconnect the “http in” node Named “POST” and Bot Provider V2.
- Add “http in” node Named “POST” to the “Orbita Detect” node.
- The first output pin of the “Route” function node should be connected to the “Bot provider v2” node.
- Drag and drop a Link out node to the Bot Manager tab and name it.
- Connect the second output pin of the “Route” function node to the Link out node.
- After the above steps, the Bot Manager Tab would look like the below:
b. Follow the below steps for V3:
- Disconnect the “Bot IN” and Bot Provider V2.
- Add “Bot IN“ to the “Orbita Detect” node.
- The first output pin of the “Route” function node should be connected to the “Bot provider v2” node.
- Drag and drop a Link out node to the Bot Manager V3 tab and name it.
- Connect the second output pin of the “Route” function node to the Link out node.
- After the above steps, the Bot Manager V3 Tab would look like the below:Double click on the “Bot Provider V2” node and add the below code to the “Bot In Parser” section.
var _ = global.get('lodash'); const NAMESPACE = _.get(msg, 'orbita.session.NAMESPACE'); let symptomValue = _.get(msg, 'orbita.session.${NAMESPACE}.symptomValue'); if(symptomValue){ _.set(msg, 'payload.originalRequest.data.symptomValue', symptomValue); }
Go to the “Modules Flows” tab
Add a Link In node and name it.
Connect the Link In node with the input pin of symptomstriage sub-flow.
This “Link In” node should be connected to the “Link Out” node which you added in the “Bot Manager” tab. To connect them, In the “Link In” node edit window, select the Link out node you added earlier.
Now Deploy the flow and validate it.
Dashboards
After the solution installation, submit a request to support@orbita.ai to enable the pre-built dashboards from the Project side navigation menu > Report > Dashboards.
What dashboards & visualizations are available and what purpose do they serve?
You will have a dashboard that will capture the Chatbot analytics such as Total ST users, ST users per day, and so on.
The metrics you can track using the dashboard are:
Total Symptom Triage Use
Symptom Checker Use Per Day
Symptom Checker Endpoints
Symptom Checker table that captures the time, user details, and endpoint.
Can I customize the dashboard?
You can create your own visualizations for the symptom triage in Insights. Refer, Guide to Orbita Insights
The Symptom Triage solution data is captured in the data-<environment>-backend.insightsendpoints
, data-<environment>-backend.symptomtriageconfig
, and data-<environment>-backend.symptomtriageresponse
index patterns.
Solution Customization
How can I update content and phrases?
To change the bot responses, you can navigate to the flow studio flows and make changes to the content present in the flow studio controls.
For example, if you want to change the welcome message,
Navigate to the Project side navigation menu > Create > Agents > Flow studio.
Select the Flow Studio named “Symptoms Triage Entry Flow”.
Open control named “Launch Greeting“.
You can edit the content displayed in the controls or use phrases to have variations in the chatbot responses. Refer, How do I create phrases for the voice assistant?.
In this case, we used phrases to have variations in the chatbot responses. To modify the phrases:
Navigate to Project side navigation menu > Lists > Phrases tab
Select the phrase you want to edit and add a new phrase or edit the existing phrases and save it.
How to update the branding of the chatbot?
You can customize the chatbot appearance using CSS and JS. For more information on customizing the appearances of your chatbot, refer 3.9.1 Orbita's Chatbot -- Coming Soon | Customizing your chatbot
Integrations
The current solution integrates the Infermedica APIs to accurately triage the symptoms and guide patients to the point of the right care. You can learn more about Infermedica here.
Video link
https://cdn.orbita.cloud/assets/orbita/solutions/symptomtriagesolution.mp4