I have set up a rasa bot (v. 1.10.17) for an online shop but I keep getting the error that slots are not extracted despite having a slot custom mapping in my actions.py. I have searched for similar issue on this forum and applied their solution but still I still have the “slot not extracted error”. My actions.py file:
class ActionFormInfo(FormAction): def name(self) -> Text: """Unique identifier of the form""" return "form_filling" @staticmethod def required_slots(tracker: Tracker) -> List[Text]: """A list of required slots that the form has to fill""" if tracker.get_slot('PICKUP') == 'YES': # if service contains . display a # form for maintenace/purchase if "." not in tracker.get_slot('SERVICE'): return ["KG", "FULLNAME", "PHONE", "PICKUP", "ADDRESS"] else: return ["FULLNAME", "PHONE", "PICKUP", "ADDRESS"] else: if "." not in tracker.get_slot('SERVICE'): return ["KG", "FULLNAME", "PHONE", "PICKUP"] else: return ["FULLNAME", "PHONE", "PICKUP"] ################################# form validation section ############################## ####################################################################################### ###################################################################################### ########################## validate input for cylinder kg ########################### @staticmethod def kg_db() -> List[Text]: return [ 1,2,3,5,6,10, 12.5,15, 20, 50 ] def validate_KG( self, value: Text, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, Any], ) -> Dict[Text, Any]: """Validate cylinder Kg value.""" text_strip = value.strip() text_to_num = int(text_strip) if text_to_num in self.kg_db(): return {"KG": value} else: print(value) dispatcher.utter_message(template="utter_wrong_kg_value") return {"KG": None} ########################## validate input for phone number ############################## def validate_PHONE( self, value: Text, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, Any], ) -> Dict[Text, Any]: """Validate Phone number value.""" digit_count = len(value) digit_strip = value.strip() digit_to_num_check = int(digit_strip) if digit_count == 11 and digit_to_num_check: return {"PHONE": value} else: print(value) dispatcher.utter_message(template="utter_wrong_phone_value") return {"PHONE": None} ########################## validate input of pickup form field ############################## @staticmethod def pickup_db() -> List[Text]: """Database of supported pickup response""" return [ "YES", "NO" ] def validate_PICKUP( self, value: Text, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, Any], ) -> Dict[Text, Any]: value_stripe = value.strip() value_upper = value_stripe.upper() if value_upper in self.pickup_db(): return {"PICKUP": value_upper} else: dispatcher.utter_message(template="utter_wrong_pickup_value") return {"PICKUP": None} ################################# Slot mapping section ################################# ####################################################################################### ###################################################################################### def slot_mappings(self) -> Dict[Text, Union[Dict, List[Dict]]]: return { "kg": [self.from_entity(entity="KG"), self.from_text()], "fullname": self.from_text(intent=None), "phonenumber": self.from_text(intent=None), "staffpick": self.from_text(intent=None), "pickupaddress": self.from_text(intent=None), "total": self.from_text(intent=None), "service" : [ self.from_entity( entity="SERVICE", intent=["cylinder_refill", "cylinder_purchase", "cylinder_painting", "maintenance_table_gas", "maintenance_single_knub", "maintenance_double_knub", "maintenance_camping_burner", "maintenance_top_ignation", "maintenance_cooker_ignation", "maintenance_top_stand", "buy_camping_burner", "buy_metal_burner", "buy_aluminum_burner", "buy_burner_control", "buy_cap_burner", "buy_std_reg", "buy_ind_reg", "buy_cap_reg", "buy_hose"] ), ], } ################################# form submit section ################################# ####################################################################################### ###################################################################################### def submit( self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, Any], ) -> List[Dict]: ########## get record from SERVICE slot ########## distance = 0 if tracker.get_slot("PICKUP") == "YES": ########## get the the pickup address ########## pickup_address = tracker.get_slot('ADDRESS') ########## call function to calculate km ########## distance = calculate_km('pickup_address') ########## save cal KM to slot ########## SlotSet("KILOMETER", distance) ########## calculate delivery fee section ########## #################################################### ########## remove trailing space from cal km if any ########## distance = distance.strip() transport_fee = float(distance) * (50*2) ########## get service fee from api ########## product_fee =3000 total = int(transport_fee ) + product_fee ########## save fee to slot depending on the PICKUP ########## if tracker.get_slot('PICKUP') == "Yes": SlotSet('FEE', total) else: SlotSet('FEE', product_fee) ########## display submit button based on PICKUP ########## Guage = tracker.get_slot('KG') if tracker.get_slot('PICKUP') == 'YES': if "." in tracker.get_slot('SERVICE'): dispatcher.utter_message( template="utter_submit_utility", fullname=tracker.get_slot('FULLNAME'), phonenumber=tracker.get_slot('PHONE'), staffpick=tracker.get_slot('PICKUP'), pickupaddress=tracker.get_slot('ADDRESS'), total=tracker.get_slot('FEE'), service = tracker.get_slot('SERVICE')) else: dispatcher.utter_message( template="utter_submit", kg=Guage, fullname=tracker.get_slot('FULLNAME'), phonenumber=tracker.get_slot('PHONE'), staffpick=tracker.get_slot('PICKUP'), pickupaddress=tracker.get_slot('ADDRESS'), total=tracker.get_slot('FEE'), service = tracker.get_slot('SERVICE')) else: if "." in tracker.get_slot('SERVICE'): dispatcher.utter_message( template="utter_submit_reponse_no_utility", fullname=tracker.get_slot('FULLNAME'), phonenumber=tracker.get_slot('PHONE'), staffpick=tracker.get_slot('PICKUP'), total=tracker.get_slot('FEE'), service = tracker.get_slot('SERVICE') ) else: dispatcher.utter_message( template="utter_submit_reponse_no", kg=Guage, fullname=tracker.get_slot('FULLNAME'), phonenumber=tracker.get_slot('PHONE'), staffpick=tracker.get_slot('PICKUP'), total=tracker.get_slot('FEE'), service = tracker.get_slot('SERVICE') ) return []
The story, nlu and domain files are available at: GitHub - edmundrotimi/rasabot.
I am not asking for any code snippet, all I am kindly asking for is a pointer to what I am currently doing wrong that is causing the slot extraction error. Thanks in earnest expectation.