Email Validation buggy

So instead of receiving the couldn’t create message for response ’ utter_none" i want the bot to say invalid email please retype.

this is my code

class ValidateEmailForm(FormValidationAction):
    def name(self) -> Text:
        return "validate_email_form"

    def validate_email(
        self,
        value: Text,
        dispatcher: "CollectingDispatcher",
        tracker: "Tracker",
        domain: "DomainDict",
    ) -> Dict[str, str]:
        if(re.fullmatch(regex,value)):
            dispatcher.utter_message(text=f"Geldig email")
            return {"email": value}
        else:
            dispatcher.utter_message(text=f"Ongeldig email")
            return {"requested_slot": "email"}


    def validate_confirm_details(
        self,
        value: Text,
        dispatcher: "CollectingDispatcher",
        tracker: "Tracker",
        domain: "DomainDict",
    ) -> Dict[str, str]:
        intent_name = tracker.get_intent_of_latest_message()
        if value is not None:
            if intent_name in ["affirm", "deny"]:
                return {"confirm_details": intent_name}
        else:
            return {"requested_slot": "confirm_details"}


class ActionSubmitEmailForm(Action):
    def name(self) -> Text:
        return "action_submit_email_form"
    def run(
        self,
        dispatcher: "CollectingDispatcher",
        tracker: Tracker,
        domain: "DomainDict",
    ) -> List[Dict[Text, Any]]:
        confirm_details = tracker.get_slot("confirm_details")
        email = tracker.get_slot("email")
        message = tracker.get_slot("message")
        if confirm_details == "affirm":
            sendmessage = Mail(
            from_email='somting',
            to_emails='somting',
            subject='[Handoff Helpdesk] Vraag van potentiele klant',
            html_content=message)
            try:

                sg = SendGridAPIClient('')
                response = sg.send(sendmessage)
                print(response.status_code)
                print(response.body)
                print(response.headers)
                dispatcher.utter_message("je bericht werd verstuurd")
            except Exception as e:
                print("An Error occured while sending email.",e)
        else:
            dispatcher.utter_message(response="utter_mail_canceled")
            return []

@aymane258 can you please share the form code (domain.yml), stories.yml and nlu.yml file with us.

OR

Please follow this demo code:

class ValidateEmailForm(FormValidationAction):
    def name(self) -> Text:
        return "validate_email_form"

   @staticmethod
   def required_slots( tracker: Tracker) -> List[EventType]: return ["email"])

   def slot_mapping(self): 
         return {"email": self.from_entity( entity="email", intent=["email"])}


    def validate_email(
        self,
        value: Text,
        dispatcher: "CollectingDispatcher",
        tracker: "Tracker",
        domain: "DomainDict",
    ) -> Dict[Text, Any]:
        value = tracker.get_slot('email')
        if re.match(r"[a-zA-Z0-9_.±]+@[a-zA-Z]+.[^@]+", str(value)):
            dispatcher.utter_message(text=f"Geldig email")
            return {"email": value}
        else:
            dispatcher.utter_message(text=f"Ongeldig email")
            return {"email": None}

I hope this will solve your issue, please do check your regex for email :slight_smile: and other supporting codes.

File “C:\Users\ayman\Desktop\base_rasa\actions\actions.py”, line 51, in ValidateEmailForm def required_slots( tracker: Tracker) → List[EventType]: return [“email”] NameError: name ‘EventType’ is not defined

Domain

version: '2.0'
config:
  store_entities_as_slots: true
session_config:
  session_expiration_time: 60
  carry_over_slots_to_new_session: true
intents:
- greet:
    use_entities: true
- goodbye:
    use_entities: true
- affirm:
    use_entities: true
- deny:
    use_entities: true
- faq:
    use_entities: true
- give_webinar_date:
    use_entities: true
- outofscope:
    use_entities: true
- provide_email:
    use_entities: true
- send_email:
    use_entities: true
entities:
- place
- email
slots:
  email:
    type: rasa.shared.core.slots.TextSlot
    initial_value: null
    auto_fill: true
    influence_conversation: false
  message:
    type: rasa.shared.core.slots.TextSlot
    initial_value: null
    auto_fill: true
    influence_conversation: false
  confirm_details:
    type: rasa.shared.core.slots.AnySlot
    initial_value: null
    auto_fill: true
    influence_conversation: false
  requested_slot:
    type: rasa.shared.core.slots.UnfeaturizedSlot
    initial_value: null
    auto_fill: true
    influence_conversation: false
responses:
  utter_greet:
  - text: Hallo, hoe kan ik je helpen?
  utter_faq/solar_interesting:
  - text: |-
      Ook in 2021 blijft het interessant om te investeren in zonnepanelen voor je eigen groene stroom. We weten dat er wat verandert in 2021, maar hier zijn ook voordelen aan verbonden.
      Iedereen die zonnepanelen installeert in 2021 valt onder de nieuwe tariefstructuur. Je hebt geen recht meer op een terugdraaiende meter, maar je betaalt ook geen prosumententarief meer. Je betaalt enkel de nettarieven voor wat je nog van het net afhaalt.
      Bovendien geeft de Vlaamse Overheid premies uit voor installaties vanaf 2021. Lees hier meer over deze premie.
  utter_outofscope:
  - text: Sorry, ik kon het niet begrijpen. Zou je het alsjeblieft kunnen herformuleren?
  utter_goodbye:
  - text: dazag
  utter_ask_email:
  - text: Wat is je email adress?
  utter_ask_message:
  - text: Wat zijn je vragen?
  utter_ask_confirm_details:
  - buttons:
    - payload: Yes
      title: Yes
    - payload: No
      title: No
    text: |-
      Dit zijn de details die ik heb vastgelegd. Bevestig ze hieronder a.u.b.:
      Email: {email}
      Message: {message}
  utter_mail_success:
  - text: Ik heb alle details naar ons team gemaild.
  utter_mail_canceled:
  - text: Ik heb de mail geannuleerd. Wil je nog ergens hulp bij?
actions:
- action_show_webinar_date
- action_submit_email_form
- validate_email_form
forms:
  email_form:
    required_slots:
      email:
      - entity: email
        type: from_entity
      message:
      - type: from_text
      confirm_details:
      - intent: affirm
        type: from_intent
        value: yes
      - intent: deny
        type: from_intent
        value: no
e2e_actions: []

language: nl

pipeline:
 - name: WhitespaceTokenizer
 - name: RegexFeaturizer
 - name: LexicalSyntacticFeaturizer
 - name: CountVectorsFeaturizer
 - name: CountVectorsFeaturizer
   analyzer: char_wb
   min_ngram: 1
   max_ngram: 4
 - name: DIETClassifier
   epochs: 100
 - name: EntitySynonymMapper
 - name: ResponseSelector
   epochs: 100
 - name: ResponseSelector
   epochs: 100
   retrieval_intent: faq
 - name: ResponseSelector
   epochs: 100
   retrieval_intent: chitchat
 - name: DucklingEntityExtractor
   dimensions: ["email", "number"]
   url: "http://localhost:8000"
 - name: FallbackClassifier
   threshold: 0.3
   ambiguity_threshold: 0.1

policies:
 - name: MemoizationPolicy
 - name: TEDPolicy
   max_history: 5
   epochs: 100
 - name: RulePolicy

version: “2.0”

version: "2.0"
nlu:
- intent: give_webinar_date
  examples: |
    - Wanneer word de volgende webinar georganiseerd
    - wanneer is de volgende webinar
    - wanneer is de volgende webinar in [Antwerpen](place)
    - wanneer is de volgende webinar in [Limburg](place)
    - wanneer is de volgende webinar in [Brussel](place)
    - wanneer is de volgende webinar in [brussel](place)
    - wanneer is de volgende webinar in [antwerpen](place)
    - [limburg](place)
    - wanneer is de volgende webinar in [limburg](place)
    - [antwerpen](place)
    - in [antwerpen](place)
    - ik wou eigenlijk weten wanneer de volgende webinar plaatsvindt?
- intent: send_email
  examples: |
    - I want to to send email
    - Send an email
    - Send email
    - email
    - ik wil iemand van de helpdesk spreken
    - send email
    - send mail
- intent: greet
  examples: |
    - Hallo
    - hallo
    - hey ik heb hulp nodig
    - hello
- intent: goodbye
  examples: |
    - good afternoon
    - cu
    - good by
    - cee you later
    - good night
    - bye
    - goodbye
    - have a nice day
    - see you around
    - bye bye
    - see you later
- intent: affirm
  examples: |
    - yes
    - y
    - indeed
    - of course
    - that sounds good
    - correct
- intent: deny
  examples: |
    - no
    - n
    - never
    - I don't think so
    - don't like that
    - no way
- lookup: place
  examples: |
    - antwerpen
    - brussel
    - limburg

version: "2.0"
rules:
- rule: respond to FAQs
  steps:
  - intent: faq
  - action: utter_faq
- rule: Give the webinar date
  steps:
  - intent: give_webinar_date
  - action: action_show_webinar_date

- rule: out of scope
  steps:
  - intent: outofscope
  - action: utter_outofscope

- rule: Say goodbye anytime the user says goodbye
  steps:
  - intent: goodbye
  - action: utter_goodbye

- rule: Activate Form
  steps:
    - intent: send_email
    - action: email_form
    - active_loop: email_form

- rule: Submit form
  condition:
  # Condition that form is active.
  - active_loop: email_form
  steps:
  # Form is deactivated
  - action: email_form
  - active_loop: null
  - slot_was_set:
    - requested_slot: null
  # The actions we want to run when the form is submitted.
  - action: action_submit_email_form

from typing import Any, Text, Dict, List
from rasa_sdk import Action, Tracker, FormValidationAction
from rasa_sdk.executor import CollectingDispatcher
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail
from rasa_sdk.types import DomainDict
from typing import Any, Text, Dict, List
import re
regex = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
region_db = {
    'brussels': '17 januari 2022 om 9:50', 
    'antwerpen': '17 februari 2022 om 9:50',
    'limburg': '13 december 2021 om 9:50',
}

#Get Webinar Date
class ActionGetWebinarDate(Action):

    def name(self) -> Text:
        return "action_show_webinar_date"

    def run(self, dispatcher: CollectingDispatcher,
            tracker: Tracker,
            domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
        current_place = next(tracker.get_latest_entity_values("place"), None)
        
        if not current_place:
            msg = f"In welke regio?"
            buttons = []
            buttons = [{"title": "brussels", "payload": "brussels"}, {"title": "antwerpen", "payload": "antwerpen"}, {"title": "limburg", "payload": "limburg"}]
            dispatcher.utter_message(text=msg, buttons=buttons)
            return []
        
        tz_string = region_db.get(current_place, None)
        if not tz_string:
            msg = f"I didn't recognize {current_place}. Is it spelled correctly?"
            dispatcher.utter_message(text=msg)
            return []
                
        msg = f"De volgende webinar in {current_place} is op {region_db[current_place]}"
        dispatcher.utter_message(text=msg)
        
        return []


class ValidateEmailForm(FormValidationAction):
    def name(self) -> Text:
        return "validate_email_form"
    @staticmethod
    def required_slots(tracker: Tracker) -> List[EventType]: return ["email"]

    def slot_mapping(self): 
            return {"email": self.from_entity( entity="email", intent=["email"])}

    def validate_email(
        self,
        value: Text,
        dispatcher: "CollectingDispatcher",
        tracker: "Tracker",
        domain: "DomainDict",
    ) -> Dict[Text, Any]:
        value = tracker.get_slot('email')
        if re.match(r"[a-zA-Z0-9_.±]+@[a-zA-Z]+.[^@]+", str(value)):
            dispatcher.utter_message(text=f"Geldig email")
            return {"email": value}
        else:
            dispatcher.utter_message(text=f"Ongeldig email")
            return {"email": None}


    def validate_confirm_details(
        self,
        value: Text,
        dispatcher: "CollectingDispatcher",
        tracker: "Tracker",
        domain: "DomainDict",
    ) -> Dict[str, str]:
        intent_name = tracker.get_intent_of_latest_message()
        if value is not None:
            if intent_name in ["affirm", "deny"]:
                return {"confirm_details": intent_name}
        else:
            return {"requested_slot": "confirm_details"}


class ActionSubmitEmailForm(Action):
    def name(self) -> Text:
        return "action_submit_email_form"
    def run(
        self,
        dispatcher: "CollectingDispatcher",
        tracker: Tracker,
        domain: "DomainDict",
    ) -> List[Dict[Text, Any]]:
        confirm_details = tracker.get_slot("confirm_details")
        email = tracker.get_slot("email")
        message = tracker.get_slot("message")
        if confirm_details == "affirm":
            sendmessage = Mail(
            from_email='aymane.abdellah@ichoosr.com',
            to_emails='aymane.abdellah@ichoosr.com',
            subject='[Handoff Helpdesk] Vraag van potentiele klant',
            html_content=message)
            try:

                sg = SendGridAPIClient('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')
                response = sg.send(sendmessage)
                print(response.status_code)
                print(response.body)
                print(response.headers)
                dispatcher.utter_message("je bericht werd verstuurd")
            except Exception as e:
                print("An Error occured while sending email.",e)
        else:
            dispatcher.utter_message(response="utter_mail_canceled")
            return []








I asked to cross check the supporting code, please add this in your code.

from rasa_sdk.events import EventType

i know, i didn’t have a clue what the import was called though :smiley:

Exception occurred while handling uri: ‘http://localhost:5055/webhook’ Traceback (most recent call last): File “C:\Users\ayman\AppData\Roaming\Python\Python38\site-packages\sanic\app.py”, line 939, in handle_request response = await response File “C:\Users\ayman\anaconda3\envs\rasa\lib\site-packages\rasa_sdk\endpoint.py”, line 104, in webhook result = await executor.run(action_call) File “C:\Users\ayman\anaconda3\envs\rasa\lib\site-packages\rasa_sdk\executor.py”, line 397, in run events = await utils.call_potential_coroutine( File “C:\Users\ayman\anaconda3\envs\rasa\lib\site-packages\rasa_sdk\utils.py”, line 230, in call_potential_coroutine return await coroutine_or_return_value File “C:\Users\ayman\anaconda3\envs\rasa\lib\site-packages\rasa_sdk\forms.py”, line 695, in run extraction_events = await self.extract_custom_slots(dispatcher, tracker, domain) File “C:\Users\ayman\anaconda3\envs\rasa\lib\site-packages\rasa_sdk\forms.py”, line 734, in extract_custom_slots slots_to_extract = await self.required_slots( TypeError: required_slots() takes 1 positional argument but 4 were given

Your input → /send_email 2021-10-27 15:56:03 ERROR rasa.core.processor - Encountered an exception while running action ‘email_form’.Bot will continue, but the actions events are lost. Please check the logs of your action server for more information.

@aymane258 can you please see this : Forms and update your story. PS: you need to check how we can set the required_slot or requested_slot

@aymane258 please share the action logs screenshot and do format the above codes, using. “”" “”"