Problem in form action

After filling the slot ‘first name’. Form is deactivated. after that my next intent deny (NO). When I am giving the input as No. Then form is activated automatically and filled the slot ‘first name’ with ‘No’. Why it is behaving like that I don’t understand . Please explain

Hm, can you show your code for your FormAction, and perhaps the core debug logs also? It seems weird that it received another request to run the insurance form immediately after completing it the first time.

Hi @erohmensing, Thanks for the response.

story_Auto2

  • get_started
    • utter_welcome
  • Car
    • utter_user
  • New User
    • utter_start
    • insurance_form
    • form{“name”: “insurance_form”}
    • slot{“requested_slot”: “firstname”}
  • form: inform{“firstname”: “chaitanya”}
    • form: insurance_form
    • slot{“firstname”: “chaitanya”}
    • slot{“requested_slot”: “lastname”}
  • form: inform{“lastname”: “Kumar”}
    • form: insurance_form
    • slot{“lastname”: “Kumar”}
    • slot{“requested_slot”: “gender”}
  • form: inform{“gender”: “Male”}
    • form: insurance_form
    • slot{“gender”: “Male”}
    • slot{“requested_slot”: “dob”}
  • form: inform{“dob”: “11-04-1995”}
    • form: insurance_form
    • slot{“dob”: “11-04-1995”}
    • slot{“requested_slot”: “email”}
  • form: inform{“email”: “james33@gmail.com”}
    • form: insurance_form
    • slot{“email”: “james33@gmail.com”}
    • slot{“requested_slot”: “contact”}
  • form: inform{“contact”: “9642432730”}
    • form: insurance_form
    • slot{“contact”: “9642432730”}
    • slot{“requested_slot”: “address”}
  • form: inform{“address”: “Address: 11111 ne , 9th pl, apt no 18-854”}
    • form: insurance_form
    • slot{“address”: “Address: 11111 ne , 9th pl, apt no 18-854”}
    • slot{“requested_slot”: “city”}
  • form: inform{“city”: “Dallas”}
    • form: insurance_form
    • slot{“city”: “Dallas”}
    • slot{“requested_slot”: “state”}
  • form: inform{“state”: “California”}
    • form: insurance_form
    • slot{“state”: “California”}
    • slot{“requested_slot”: “zipcode”}
  • form: inform{“zipcode”: “53368”}
    • form: insurance_form
    • slot{“zipcode”: “53368”}
    • slot{“requested_slot”: “ssn”}
  • form: inform{“ssn”: “750-02-1422”}
    • form: insurance_form
    • slot{“ssn”: “750-02-1422”}
    • form{“name”: null}
    • slot{“requested_slot”: null}
  • affirm
    • utter_askfield
  • field
    • action_reset
    • insurance_form
    • form{“name”: “insurance_form”}
    • slot{“requested_slot”: “firstname”}
  • form: inform{“firstname”: “chaitanya”}
    • form: insurance_form
    • slot{“firstname”: “chaitanya”}
    • form{“name”: null}
    • slot{“requested_slot”: null}
  • deny
    • cardetails_form
    • form{“name”: “cardetails_form”}
    • slot{“requested_slot”: “carmaker”}
  • form: inform{“carmaker”: “Honda”}
    • form: cardetails_form
    • slot{“carmaker”: “Honda”}
    • slot{“requested_slot”: “car_model”}
  • form: inform{“car_model”: “Honda Amaze”}
    • form: cardetails_form
    • slot{“car_model”: “Honda Amaze”}
    • slot{“requested_slot”: “year_of_mfg”}
  • form: inform{“year_of_mfg”: “2015”}
    • form: cardetails_form
    • slot{“year_of_mfg”: “2015”}
    • slot{“requested_slot”: “driving_experience_US”}
  • form: inform{“driving_experience_US”: “2”}
    • form: cardetails_form
    • slot{“driving_experience_US”: “2”}
    • slot{“requested_slot”: “driving_exp_outside”}
  • form: inform{“driving_exp_outside”: “4”}
    • form: cardetails_form
    • slot{“driving_exp_outside”: “4”}
    • slot{“requested_slot”: “driving_licence”}
  • form: inform{“driving_licence”: “53427891932”}
    • form: cardetails_form
    • slot{“driving_licence”: “53427891932”}
    • slot{“requested_slot”: “family”}
  • form: inform{“family”: “Yes”}
    • form: insurance_form
    • slot{“family”: “Yes”}
    • form{“name”: null}
    • slot{“requested_slot”: null}
  • deny
    • utter_plan
    • action_plan

action.py:

class insuranceform(FormAction):

def name(self):
	return 'insurance_form'

@staticmethod
def required_slots(tracker):
	return ["firstname","lastname","gender","dob","email","contact","address","city","state","zipcode","ssn"]

def validate(self, dispatcher, tracker, domain):
	slot_values = self.extract_other_slots(dispatcher, tracker, domain)

	
	slot_to_fill = tracker.get_slot(REQUESTED_SLOT)
	
	if slot_to_fill:
		slot_values.update(self.extract_requested_slot(dispatcher, tracker, domain))
	#response1 = "HELLOHELLO "
	#dispatcher.utter_message(response1)
	for slot, value in slot_values.items():
		#dispatcher.utter_message("line3")

		if slot == 'firstname':
			if value.replace(" ","").isalpha() == False:
				dispatcher.utter_template('utter_wrong_firstname', tracker)
				slot_values[slot] = None
			else:
				dispatcher.utter_message("Hi {}".format(value))
		elif slot == 'lastname':
			if value.replace(" ","").isalpha() == False:
				dispatcher.utter_template('utter_wrong_lastname', tracker)
				slot_values[slot] = None
		elif slot == 'gender':
			if value.lower() not in ["male","female"]:
				dispatcher.utter_template('utter_wrong_gender', tracker)
				slot_values[slot] = None
		elif slot == 'dob':
			try:
				datetime.strptime(value, '%d-%m-%Y')
			except ValueError:
				dispatcher.utter_template('utter_wrong_dob', tracker)
				slot_values[slot] = None
		elif slot == 'email':
			email = re.compile(r'(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)')
			mo = email.search(value)
			if mo == None:
				dispatcher.utter_template('utter_wrong_email', tracker)
				slot_values[slot] = None
		elif slot == 'contact':
			if len(value) != 10 or value.isdigit() == False:
				dispatcher.utter_template('utter_wrong_contact', tracker)
				slot_values[slot] = None
		elif slot == 'city':
			if value.replace(" ","").isalpha() == False:
				dispatcher.utter_template('utter_wrong_city', tracker)
				slot_values[slot] = None
		elif slot == 'state':
			if value.replace(" ","").isalpha() == False:
				dispatcher.utter_template('utter_wrong_state', tracker)
				slot_values[slot] = None
		elif slot == 'zipcode':
			if len(value) != 5 or value.isdigit() == False:
				dispatcher.utter_template('utter_wrong_zipcode', tracker)
				slot_values[slot] = None
		elif slot == 'ssn':
			ssn = re.compile(r'^\d{3}-\d{2}-\d{4}$')
			mo = ssn.search(value)
			if mo == None:
				dispatcher.utter_template('utter_wrong_ssn', tracker)
				slot_values[slot] = None


	return [SlotSet(slot, value) for slot, value in slot_values.items()]

  	def submit(self, dispatcher, tracker, domain):
	#response1 = "HELLOHELLOaa "	
	#dispatcher.utter_message(response1)
	firstname=tracker.get_slot("firstname")
	lastname=tracker.get_slot("lastname")
	gender=tracker.get_slot("gender")
	dob=tracker.get_slot("dob")
	email=tracker.get_slot("email")
	contact=tracker.get_slot("contact")
	address=tracker.get_slot("address")
	city=tracker.get_slot("city")
	state=tracker.get_slot("state")
	zipcode=tracker.get_slot("zipcode")
	ssn=tracker.get_slot("ssn")
	SlotSet('zipcode', None)
	SlotSet('zipcode', "11111")
	dispatcher.utter_message("Here is the details you have entered.Please review")
	dispatcher.utter_message('''First Name : {}
							 \nLast Name : {} 
							 \nGender : {} 
							 \nDOB : {} 
							 \nEmail : {} 
							 \nContact : {} 
							 \nAddress : {} 
							 \nCity : {}  
							 \nstate : {} 
							 \nZip code : {} 
							 \nSSN : {}'''.format(firstname,lastname,gender,dob,email,contact,address,city,state,zipcode,ssn))
	
	dispatcher.utter_button_message("Do you want to change any field", [{"title": "Yes", "payload": "/affirm"},{"title": "No", "payload": "/deny"}])
	return []

class ResetSlot(Action):

def name(self):
	return 'action_reset'

def run(self, dispatcher, tracker, domain):

	message = tracker.latest_message.get('text')
	change_fields = []
	actual_fields = ("firstname","lastname","gender","email","dob","contact","address","city","state","zipcode","ssn")
	for each in actual_fields :
		if each in message.lower().replace(" ",""):
			change_fields.append(SlotSet(each, None))
	return change_fields

log file: log.txt (16.9 KB)

Hm, what version are you running? The manner of validating forms has changed in sdk 0.13.3 or so.

Is this error occurring in the first part of your form story, or the second part after the action_reset?

rasa-nlu==0.13.8

rasa-core==0.12.3

rasa-core-sdk==0.12.1

Problem occurs after action_reset

Hi @erohmensing, please respond.

Hi @Chaitanya, I apologize for the late response. We have a lot of issues to respond to as a result of Tuesday’s release.

Your versions are very old, can you upgrade to Core 0.14.4, NLU 0.15.0 and SDK 0.14.0 (or more ideally, rasa 1.0.1 and sdk 1.0.1)? It’s possible this has been fixed already in the meantime. If it still persists, any bug fixes will require updating in any case.

hi i am facing a similar problem while implementing forms in rasa :