!pip install rasa !git clone https://github.com/RasaHQ/rasa-for-beginners.git cd rasa-for-beginners !rasa train # !pip install colab_ssh from colab_ssh import launch_ssh launch_ssh('', '') !pip install -q pyngrok from pyngrok import ngrok !ngrok authtoken ngrok.kill() public_url = ngrok.connect(port='80'); public_url !rasa run -p 80 # Twilio Endpoint # http://c41fc2bf36a0.ngrok.io/webhooks/twilio/webhook !mv /content/*.py /content/rasa-for-beginners/files !mv /content/*.ipynb /content/rasa-for-beginners/files %cd /content # !mkdir -p /content/chatbots/wellnessTracker # !mv -v /content/rasa-for-beginners/* /content/chatbots/wellnessTracker/ # !rm -r /content/chatbots/wellnessTracker/.git # !pip install rasa # !pip3 install python-dotenv !git clone https://github.com/RasaHQ/rasa-for-beginners.git %%writefile actions.py from typing import Any, Text, Dict, List, Union from dotenv import load_dotenv from rasa_sdk import Action, Tracker from rasa_sdk.executor import CollectingDispatcher from rasa_sdk.forms import FormAction import requests import json import os load_dotenv() airtable_api_key='' #os.getenv("AIRTABLE_API_KEY") base_id='' #os.getenv("BASE_ID") table_name='TABLEX' #os.getenv("TABLE_NAME") def create_health_log(confirm_exercise, exercise, sleep, diet, stress, goal): request_url=f"https://api.airtable.com/v0/{base_id}/{table_name}" headers = { "Content-Type": "application/json", "Accept": "application/json", "Authorization": f"Bearer {airtable_api_key}", } data = { "fields": { "Exercised?": confirm_exercise, "Type of exercise": exercise, "Amount of sleep": sleep, "Stress": stress, "Diet": diet, "Goal": goal, } } try: response = requests.post( request_url, headers=headers, data=json.dumps(data) ) response.raise_for_status() except requests.exceptions.HTTPError as err: raise SystemExit(err) return response print(response.status_code) class HealthForm(FormAction): def name(self): return "health_form" @staticmethod def required_slots(tracker): if tracker.get_slot('confirm_exercise') == True: return ["confirm_exercise", "exercise", "sleep", "diet", "stress", "goal"] else: return ["confirm_exercise", "sleep", "diet", "stress", "goal"] def slot_mappings(self) -> Dict[Text, Union[Dict, List[Dict]]]: """A dictionary to map required slots to - an extracted entity - intent: value pairs - a whole message or a list of them, where a first match will be picked""" return { "confirm_exercise": [ self.from_intent(intent="affirm", value=True), self.from_intent(intent="deny", value=False), self.from_intent(intent="inform", value=True), ], "sleep": [ self.from_entity(entity="sleep"), self.from_intent(intent="deny", value="None"), ], "diet": [ self.from_text(intent="inform"), self.from_text(intent="affirm"), self.from_text(intent="deny"), ], "goal": [ self.from_text(intent="inform"), ], } def submit( self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, Any], ) -> List[Dict]: confirm_exercise = tracker.get_slot("confirm_exercise") exercise = tracker.get_slot("exercise") sleep = tracker.get_slot("sleep") stress = tracker.get_slot("stress") diet = tracker.get_slot("diet") goal = tracker.get_slot("goal") response = create_health_log( confirm_exercise=confirm_exercise, exercise=exercise, sleep=sleep, stress=stress, diet=diet, goal=goal ) dispatcher.utter_message("Thanks, your answers have been recorded!") return [] # !pip install -q pyngrok # from pyngrok import ngrok # !ngrok authtoken ngrok.kill() public_url = ngrok.connect(port='5055'); public_url !rasa run actions