{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"2022-01-16-rasa-colab.ipynb","provenance":[{"file_id":"https://github.com/recohut/nbs/blob/main/raw/RASA_Main.ipynb","timestamp":1644643228679}],"collapsed_sections":[],"authorship_tag":"ABX9TyOc/1OPJf9nTWlne0QciDt5"},"kernelspec":{"name":"python3","display_name":"Python 3"}},"cells":[{"cell_type":"markdown","source":["# Running RASA Chatbot in Colab"],"metadata":{"id":"fBP36hRuXl76"}},{"cell_type":"markdown","source":["## RASA Main App"],"metadata":{"id":"svM2GDQSXo_L"}},{"cell_type":"code","metadata":{"id":"sIgLEkDmJdNm"},"source":["!pip install rasa"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"666GQ_ygcHfV","executionInfo":{"status":"ok","timestamp":1601356535200,"user_tz":-330,"elapsed":3263,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"}},"outputId":"4664a4c9-6166-4c02-f0ba-e1ac00f6c9af","colab":{"base_uri":"https://localhost:8080/","height":138}},"source":["!git clone https://github.com/RasaHQ/rasa-for-beginners.git"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Cloning into 'rasa-for-beginners'...\n","remote: Enumerating objects: 117, done.\u001b[K\n","remote: Counting objects: 100% (117/117), done.\u001b[K\n","remote: Compressing objects: 100% (57/57), done.\u001b[K\n","remote: Total 117 (delta 57), reused 117 (delta 57), pack-reused 0\u001b[K\n","Receiving objects: 100% (117/117), 376.04 KiB | 690.00 KiB/s, done.\n","Resolving deltas: 100% (57/57), done.\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"2CEXelioLMDh","executionInfo":{"status":"ok","timestamp":1601356574862,"user_tz":-330,"elapsed":1201,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"}},"outputId":"b72617f6-5007-4cfd-fbc0-b2a2ff830ddb","colab":{"base_uri":"https://localhost:8080/","height":34}},"source":["cd rasa-for-beginners"],"execution_count":null,"outputs":[{"output_type":"stream","text":["/content/rasa-for-beginners\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"8EzYfNENSisg","executionInfo":{"status":"ok","timestamp":1601356730327,"user_tz":-330,"elapsed":145945,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"}},"outputId":"d43e45c7-f37b-424e-9188-a8be20676a49","colab":{"base_uri":"https://localhost:8080/","height":817}},"source":["!rasa train"],"execution_count":null,"outputs":[{"output_type":"stream","text":["\u001b[94mTraining Core model...\u001b[0m\n","2020-09-29 05:16:27 \u001b[1;30mINFO \u001b[0m \u001b[34mroot\u001b[0m - Generating grammar tables from /usr/lib/python3.6/lib2to3/Grammar.txt\n","2020-09-29 05:16:27 \u001b[1;30mINFO \u001b[0m \u001b[34mroot\u001b[0m - Generating grammar tables from /usr/lib/python3.6/lib2to3/PatternGrammar.txt\n","Processed Story Blocks: 100% 10/10 [00:00<00:00, 3630.17it/s, # trackers=1]\n","Processed Story Blocks: 100% 10/10 [00:00<00:00, 515.19it/s, # trackers=10]\n","Processed Story Blocks: 100% 10/10 [00:00<00:00, 146.74it/s, # trackers=35]\n","Processed Story Blocks: 100% 10/10 [00:00<00:00, 150.66it/s, # trackers=30]\n","Processed trackers: 100% 10/10 [00:00<00:00, 4573.44it/s, # actions=34]\n","Processed actions: 34it [00:00, 12878.74it/s, # examples=34]\n","Processed trackers: 100% 510/510 [00:01<00:00, 422.11it/s, # actions=518]\n","2020-09-29 05:16:30.260075: E tensorflow/stream_executor/cuda/cuda_driver.cc:351] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected\n","Epochs: 100% 100/100 [00:54<00:00, 1.82it/s, t_loss=0.086, loss=0.002, acc=1.000]\n","2020-09-29 05:17:32 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.utils.tensorflow.models\u001b[0m - Finished training.\n","Processed trackers: 100% 10/10 [00:00<00:00, 4390.56it/s, # actions=33]\n","2020-09-29 05:17:32 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.core.agent\u001b[0m - Persisted model to '/tmp/tmp196xx3c1/core'\n","\u001b[94mCore model training completed.\u001b[0m\n","\u001b[94mTraining NLU model...\u001b[0m\n","2020-09-29 05:17:33 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.training_data.training_data\u001b[0m - Training data stats:\n","2020-09-29 05:17:33 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.training_data.training_data\u001b[0m - Number of intent examples: 120 (11 distinct intents)\n","2020-09-29 05:17:33 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.training_data.training_data\u001b[0m - Found intents: 'ask_lower_stress', 'inform', 'greet', 'deny', 'affirm', 'ask_exercise', 'goodbye', 'thankyou', 'bot_challenge', 'out_of_scope', 'ask_eat_healthy'\n","2020-09-29 05:17:33 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.training_data.training_data\u001b[0m - Number of response examples: 0 (0 distinct responses)\n","2020-09-29 05:17:33 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.training_data.training_data\u001b[0m - Number of entity examples: 18 (3 distinct entities)\n","2020-09-29 05:17:33 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.training_data.training_data\u001b[0m - Found entity types: 'sleep', 'exercise', 'stress'\n","2020-09-29 05:17:33 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.model\u001b[0m - Starting to train component WhitespaceTokenizer\n","2020-09-29 05:17:33 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.model\u001b[0m - Finished training component.\n","2020-09-29 05:17:33 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.model\u001b[0m - Starting to train component RegexFeaturizer\n","2020-09-29 05:17:33 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.model\u001b[0m - Finished training component.\n","2020-09-29 05:17:33 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.model\u001b[0m - Starting to train component LexicalSyntacticFeaturizer\n","2020-09-29 05:17:33 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.model\u001b[0m - Finished training component.\n","2020-09-29 05:17:33 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.model\u001b[0m - Starting to train component CountVectorsFeaturizer\n","2020-09-29 05:17:33 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.model\u001b[0m - Finished training component.\n","2020-09-29 05:17:33 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.model\u001b[0m - Starting to train component CountVectorsFeaturizer\n","2020-09-29 05:17:33 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.model\u001b[0m - Finished training component.\n","2020-09-29 05:17:33 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.model\u001b[0m - Starting to train component DIETClassifier\n","Epochs: 100% 100/100 [00:56<00:00, 1.78it/s, t_loss=2.196, i_loss=0.301, entity_loss=0.038, i_acc=0.983, entity_f1=0.866]\n","2020-09-29 05:18:42 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.utils.tensorflow.models\u001b[0m - Finished training.\n","2020-09-29 05:18:42 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.model\u001b[0m - Finished training component.\n","2020-09-29 05:18:42 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.model\u001b[0m - Starting to train component EntitySynonymMapper\n","2020-09-29 05:18:42 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.model\u001b[0m - Finished training component.\n","2020-09-29 05:18:42 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.model\u001b[0m - Starting to train component ResponseSelector\n","2020-09-29 05:18:42 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.selectors.response_selector\u001b[0m - Retrieval intent parameter was left to its default value. This response selector will be trained on training examples combining all retrieval intents.\n","2020-09-29 05:18:42 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.model\u001b[0m - Finished training component.\n","2020-09-29 05:18:43 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa.nlu.model\u001b[0m - Successfully saved model into '/tmp/tmp196xx3c1/nlu'\n","\u001b[94mNLU model training completed.\u001b[0m\n","\u001b[92mYour Rasa model is trained and saved at '/content/rasa-for-beginners/models/20200929-051843.tar.gz'.\u001b[0m\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"CJirF9xSTJ5Z","executionInfo":{"status":"ok","timestamp":1601357081304,"user_tz":-330,"elapsed":22369,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"}},"outputId":"486b79f6-1ca5-4ae5-d678-b8068647d533","colab":{"base_uri":"https://localhost:8080/","height":156}},"source":["# !pip install colab_ssh\n","from colab_ssh import launch_ssh\n","launch_ssh('', '')"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Successfully running 2.tcp.ngrok.io:19039\n","[Optional] You can also connect with VSCode SSH Remote extension using this configuration:\n","\n","\tHost google_colab_ssh\n","\t\tHostName 2.tcp.ngrok.io\n","\t\tUser root\n","\t\tPort 19039\n","\t \n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"CCHqKj0VTXSf","executionInfo":{"status":"ok","timestamp":1601365699519,"user_tz":-330,"elapsed":8944,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"}},"outputId":"6a7150ab-aa64-47c0-f979-20888b19462b","colab":{"base_uri":"https://localhost:8080/","height":52}},"source":["!pip install -q pyngrok\n","from pyngrok import ngrok\n","!ngrok authtoken "],"execution_count":null,"outputs":[{"output_type":"stream","text":[" Building wheel for pyngrok (setup.py) ... \u001b[?25l\u001b[?25hdone\n","Authtoken saved to configuration file: /root/.ngrok2/ngrok.yml\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"y2qhNPDT1EXe","executionInfo":{"status":"ok","timestamp":1601371988402,"user_tz":-330,"elapsed":2455,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"}},"outputId":"614a8644-02bb-48a9-a30d-7ddad315dc96","colab":{"base_uri":"https://localhost:8080/","height":34}},"source":["ngrok.kill()\n","public_url = ngrok.connect(port='80'); public_url"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"},"text/plain":["'http://c41fc2bf36a0.ngrok.io'"]},"metadata":{"tags":[]},"execution_count":31}]},{"cell_type":"code","metadata":{"id":"qdBxCylu1ZEY"},"source":["!rasa run -p 80"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"yLzYBzWf31-n"},"source":["# Twilio Endpoint\n","# http://c41fc2bf36a0.ngrok.io/webhooks/twilio/webhook"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"UlUzJhhGPZTI"},"source":["!mv /content/*.py /content/rasa-for-beginners/files\n","!mv /content/*.ipynb /content/rasa-for-beginners/files"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"h1HbDOtLRFms","executionInfo":{"status":"ok","timestamp":1601372977683,"user_tz":-330,"elapsed":1626,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"}},"outputId":"5c0fad2d-e924-418a-896d-3bb1da273eb4","colab":{"base_uri":"https://localhost:8080/","height":34}},"source":["%cd /content"],"execution_count":null,"outputs":[{"output_type":"stream","text":["/content\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"hAn-zB4yRKbY"},"source":["# !mkdir -p /content/chatbots/wellnessTracker\n","# !mv -v /content/rasa-for-beginners/* /content/chatbots/wellnessTracker/\n","# !rm -r /content/chatbots/wellnessTracker/.git"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["## RASA Action server"],"metadata":{"id":"uuQPV-sfX5lA"}},{"cell_type":"code","metadata":{"id":"PEVk_s57RAZf"},"source":["# !pip install rasa\n","# !pip3 install python-dotenv"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"kGHY6Do_RXC0"},"source":["!git clone https://github.com/RasaHQ/rasa-for-beginners.git"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"yVo-1GLmROoC","executionInfo":{"status":"ok","timestamp":1601363760012,"user_tz":-330,"elapsed":3749,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"}},"outputId":"d8829330-8621-4fc9-b009-78a07811b1b0","colab":{"base_uri":"https://localhost:8080/","height":34}},"source":["%%writefile actions.py\n","\n","from typing import Any, Text, Dict, List, Union\n","from dotenv import load_dotenv\n","\n","from rasa_sdk import Action, Tracker\n","from rasa_sdk.executor import CollectingDispatcher\n","from rasa_sdk.forms import FormAction\n","\n","import requests\n","import json\n","import os\n","\n","load_dotenv()\n","\n","airtable_api_key='' #os.getenv(\"AIRTABLE_API_KEY\")\n","base_id='' #os.getenv(\"BASE_ID\")\n","table_name='TABLEX' #os.getenv(\"TABLE_NAME\")\n","\n","def create_health_log(confirm_exercise, exercise, sleep, diet, stress, goal):\n"," request_url=f\"https://api.airtable.com/v0/{base_id}/{table_name}\"\n","\n"," headers = {\n"," \"Content-Type\": \"application/json\",\n"," \"Accept\": \"application/json\",\n"," \"Authorization\": f\"Bearer {airtable_api_key}\",\n"," } \n"," data = {\n"," \"fields\": {\n"," \"Exercised?\": confirm_exercise,\n"," \"Type of exercise\": exercise,\n"," \"Amount of sleep\": sleep,\n"," \"Stress\": stress,\n"," \"Diet\": diet,\n"," \"Goal\": goal,\n"," }\n"," }\n"," try:\n"," response = requests.post(\n"," request_url, headers=headers, data=json.dumps(data)\n"," )\n"," response.raise_for_status()\n"," except requests.exceptions.HTTPError as err:\n"," raise SystemExit(err)\n"," \n"," return response\n"," print(response.status_code)\n","\n","class HealthForm(FormAction):\n","\n"," def name(self):\n"," return \"health_form\"\n","\n"," @staticmethod\n"," def required_slots(tracker):\n","\n"," if tracker.get_slot('confirm_exercise') == True:\n"," return [\"confirm_exercise\", \"exercise\", \"sleep\",\n"," \"diet\", \"stress\", \"goal\"]\n"," else:\n"," return [\"confirm_exercise\", \"sleep\",\n"," \"diet\", \"stress\", \"goal\"]\n","\n"," def slot_mappings(self) -> Dict[Text, Union[Dict, List[Dict]]]:\n"," \"\"\"A dictionary to map required slots to\n"," - an extracted entity\n"," - intent: value pairs\n"," - a whole message\n"," or a list of them, where a first match will be picked\"\"\"\n","\n"," return {\n"," \"confirm_exercise\": [\n"," self.from_intent(intent=\"affirm\", value=True),\n"," self.from_intent(intent=\"deny\", value=False),\n"," self.from_intent(intent=\"inform\", value=True),\n"," ],\n"," \"sleep\": [\n"," self.from_entity(entity=\"sleep\"),\n"," self.from_intent(intent=\"deny\", value=\"None\"),\n"," ],\n"," \"diet\": [\n"," self.from_text(intent=\"inform\"),\n"," self.from_text(intent=\"affirm\"),\n"," self.from_text(intent=\"deny\"),\n"," ],\n"," \"goal\": [\n"," self.from_text(intent=\"inform\"),\n"," ],\n"," }\n","\n"," def submit(\n"," self,\n"," dispatcher: CollectingDispatcher,\n"," tracker: Tracker,\n"," domain: Dict[Text, Any],\n"," ) -> List[Dict]:\n","\n"," confirm_exercise = tracker.get_slot(\"confirm_exercise\")\n"," exercise = tracker.get_slot(\"exercise\")\n"," sleep = tracker.get_slot(\"sleep\")\n"," stress = tracker.get_slot(\"stress\")\n"," diet = tracker.get_slot(\"diet\")\n"," goal = tracker.get_slot(\"goal\")\n","\n"," response = create_health_log(\n"," confirm_exercise=confirm_exercise,\n"," exercise=exercise,\n"," sleep=sleep,\n"," stress=stress,\n"," diet=diet,\n"," goal=goal\n"," )\n","\n"," dispatcher.utter_message(\"Thanks, your answers have been recorded!\")\n"," return []"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Overwriting actions.py\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"l8HpM34cQ94Q","executionInfo":{"status":"ok","timestamp":1601363765937,"user_tz":-330,"elapsed":2654,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"}},"outputId":"29a0ff19-65c4-4da9-c0f9-35d587e03f96","colab":{"base_uri":"https://localhost:8080/","height":34}},"source":["# !pip install -q pyngrok\n","# from pyngrok import ngrok\n","# !ngrok authtoken \n","ngrok.kill()\n","public_url = ngrok.connect(port='5055'); public_url"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"},"text/plain":["'http://d40440ffde45.ngrok.io'"]},"metadata":{"tags":[]},"execution_count":18}]},{"cell_type":"code","metadata":{"id":"CJC5-67zRw2l","executionInfo":{"status":"ok","timestamp":1601373399992,"user_tz":-330,"elapsed":7284826,"user":{"displayName":"Sparsh Agarwal","photoUrl":"","userId":"13037694610922482904"}},"outputId":"9cb32b23-f095-4a9e-88a3-5e4422d92e55","colab":{"base_uri":"https://localhost:8080/","height":138}},"source":["!rasa run actions"],"execution_count":null,"outputs":[{"output_type":"stream","text":["2020-09-29 07:16:10 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa_sdk.endpoint\u001b[0m - Starting action endpoint server...\n","2020-09-29 07:16:10 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa_sdk.executor\u001b[0m - Registered function for 'health_form'.\n","2020-09-29 07:16:10 \u001b[1;30mINFO \u001b[0m \u001b[34mrasa_sdk.endpoint\u001b[0m - Action endpoint is up and running on http://localhost:5055\n","2020-09-29 09:13:26 \u001b[1;30mERROR \u001b[0m \u001b[34mrasa_sdk.endpoint\u001b[0m - \u001b[31mFailed to extract slot confirm_exercise with action health_form\u001b[0m\n","2020-09-29 09:15:14 \u001b[1;30mERROR \u001b[0m \u001b[34mrasa_sdk.endpoint\u001b[0m - \u001b[31mFailed to extract slot confirm_exercise with action health_form\u001b[0m\n","2020-09-29 09:32:13 \u001b[1;30mERROR \u001b[0m \u001b[34mrasa_sdk.endpoint\u001b[0m - \u001b[31mFailed to extract slot stress with action health_form\u001b[0m\n","2020-09-29 09:34:28 \u001b[1;30mERROR \u001b[0m \u001b[34mrasa_sdk.endpoint\u001b[0m - \u001b[31mFailed to extract slot exercise with action health_form\u001b[0m\n"],"name":"stdout"}]}]}