NotImplementedError: A form must implement required slots that it has to fill

Hello, everyone.

I’m still new to Rasa. I figured I should run an actions server for any custom actions I create. I then proceeded to make a FormAction custom action to ask several questions each time I find a specific intent.

The answer to these questions would be fixed buttons. By the end, I want to generate an answer (via my custom action) if certain slots were checked during this procedure.

I did specify which slots I want the form to fill. However, I’m getting this error in my actions prompt:

Exception occurred while handling uri: 'http://localhost:5055/webhook'
Traceback (most recent call last):
  File "c:\anaconda3\envs\redflagv1\lib\site-packages\sanic\app.py", line 942, in handle_request
response = await response
  File "c:\anaconda3\envs\redflagv1\lib\site-packages\rasa_sdk\endpoint.py", line 86, in webhook
result = await executor.run(action_call)
  File "c:\anaconda3\envs\redflagv1\lib\site-packages\rasa_sdk\executor.py", line 280, in run
events = action(dispatcher, tracker, domain)
  File "c:\anaconda3\envs\redflagv1\lib\site-packages\rasa_sdk\forms.py", line 511, in run
events = self._activate_if_required(dispatcher, tracker, domain)
  File "c:\anaconda3\envs\redflagv1\lib\site-packages\rasa_sdk\forms.py", line 452, in _activate_if_required
for slot_name in self.required_slots(tracker):
  File "c:\anaconda3\envs\redflagv1\lib\site-packages\rasa_sdk\forms.py", line 34, in required_slots
"A form must implement required slots that it has to fill"
NotImplementedError: A form must implement required slots that it has to fill

Here’s my actions file:

from typing import Dict, Text, Any, List, Union, Optional

from rasa_sdk import ActionExecutionRejection
from rasa_sdk import Tracker
from rasa_sdk.events import SlotSet
from rasa_sdk.executor import CollectingDispatcher
from rasa_sdk.forms import FormAction, REQUESTED_SLOT

class FormDorToracica(FormAction):
	def name(self) -> Text:

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

			return ["slot_tempo", "slot_tipo", "slot_irradiacao", "slot_fatores_piora", "slot_outros_sintomas"]

		def submit(
			self,
			dispatcher: CollectingDispatcher,
			tracker: Tracker,
			domain: Dict[Text, Any],
		) -> List[Dict]:
			"""Define what the form has to do
				after all required slots are filled"""

		if tracker.get_slot('slot_tempo') == 'minutos':
			return [SlotSet("dor_toracica_final","pronto_atendimento")]
    		        dispatcher.utter_message(template="utter_dor_toracica_resposta_pronto_atendimento")	

This is my domain:

intents:
- tchau
- oi
- cardiovasc_dor_toracica
- cardiovasc_dor_toracica_tempo
- cardiovasc_dor_toracica_tipo
- cardiovasc_dor_toracica_irradiacao
- cardiovasc_dor_toracica_fatores_piora
- cardiovasc_dor_toracica_outros_sintomas
- negacao
- afirmacao
entities:
- sintoma
- quem
- topografia
- slot_tipo
- slot_tempo
- slot_irradiacao
- slot_fatores_piora
- slot_outros_sintomas
slots:
  dor_toracica_final:
    type: categorical
    values:
- pronto_atendimento
- ambulatorio
  slot_fatores_piora:
type: unfeaturized
  slot_irradiacao:
type: unfeaturized
  slot_outros_sintomas:
type: unfeaturized
  slot_tempo:
type: unfeaturized
  slot_tipo:
type: unfeaturized
templates:
  utter_oi:
  - text: Olá! Diga o que você está sentindo e vou te ajudar a descobrir onde você
  deve procurar atendimento médico.
  utter_tchau:
  - text: Até mais!
  utter_inicio_questoes:
  - text: Certo. Eu vou fazer algum as perguntas sobre este sintoma para entender
  melhor.
  utter_ask_slot_tempo:
  - text: Há quanto tempo essa dor começou?
buttons:
- title: Há alguns minutos
  payload: '/cardiovasc_dor_toracica_tempo{"slot_tempo": "minutos"}'
- title: Há algumas horas
  payload: '/cardiovasc_dor_toracica_tempo{"slot_tempo": "horas"}'
- title: Mais de um dia
  payload: '/cardiovasc_dor_toracica_tempo{"slot_tempo": "mais_de_um_dia"}'
- title: Mais de um mês
  payload: '/cardiovasc_dor_toracica_tempo{"slot_tempo": "mais_de_um_mes"}'
  utter_ask_slot_tipo:
  - text: Qual o tipo da sua dor?
buttons:
- title: Queimação
  payload: '/cardiovasc_dor_toracica_tipo{"slot_tipo": "queimacao"}'
- title: Há algumas horas
  payload: '/cardiovasc_dor_toracica_tipo{"slot_tipo": "aperto"}'
- title: Mais de um dia
  payload: '/cardiovasc_dor_toracica_tipo{"slot_tipo": "pontada"}'
  utter_ask_slot_irradiacao:
  - text: A dor irradia (corre) para algum lugar?
buttons:
- title: Sim, para a mandíbula
  payload: '/cardiovasc_dor_toracica_irradiacao{"slot_irradiacao": "mandibula"}'
- title: Sim, para o braço esquerdo
  payload: '/cardiovasc_dor_toracica_irradiacao{"slot_irradiacao": "braco_esquerdo"}'
- title: Sim, para o braço direito
  payload: '/cardiovasc_dor_toracica_irradiacao{"slot_irradiacao": "braco_direito"}'
- title: Sim, para as costas
  payload: '/cardiovasc_dor_toracica_irradiacao{"slot_irradiacao": "costas"}'
- title: Sim, para o abdôme
  payload: '/cardiovasc_dor_toracica_irradiacao{"slot_irradiacao": "abdome"}'
- title: Sim, para outro lugar
  payload: '/cardiovasc_dor_toracica_irradiacao{"slot_irradiacao": "outro"}'
  utter_ask_slot_fatores_piora:
  - text: A dor piora com alguma ação destas abaixo?
buttons:
- title: Aos esforços
  payload: 'cardiovasc_dor_toracica_fatores_piora{"slot_fatores_piora": "esforcos"}'
- title: Ao movimento
  payload: 'cardiovasc_dor_toracica_fatores_piora{"slot_fatores_piora": "movimento"}'
- title: Quando puxo o ar
  payload: 'cardiovasc_dor_toracica_fatores_piora{"slot_fatores_piora": "puxoar"}'
- title: Quando solto o ar
  payload: 'cardiovasc_dor_toracica_fatores_piora{"slot_fatores_piora": "soltoar"}'
- title: Quando tosse
  payload: 'cardiovasc_dor_toracica_fatores_piora{"slot_fatores_piora": "tosse"}'
- title: Quando deita
  payload: 'cardiovasc_dor_toracica_fatores_piora{"slot_fatores_piora": "deita"}'
- title: A dor não piora com nenhuma destas ações
  payload: 'cardiovasc_dor_toracica_fatores_piora{"slot_fatores_piora": "nenhum"}'
  utter_dor_toracica_resposta_pronto_atendimento:
  - text: Você precisa ir para o pronto atendimento!
  utter_ask_slot_outros_sintomas:
  - text: Além da dor, você tem algum outro desses sintomas?
buttons:
- title: Falta de ar
  payload: 'cardiovasc_dor_toracica_outros_sintomas{"slot_outros_sintomas": "falta_ar"}'
- title: Tontura
  payload: 'cardiovasc_dor_toracica_outros_sintomas{"slot_outros_sintomas": "tontura"}'
- title: Sonolência
  payload: 'cardiovasc_dor_toracica_outros_sintomas{"slot_outros_sintomas": "sonolencia"}'
- title: Náuseas ou vômitos
  payload: 'cardiovasc_dor_toracica_outros_sintomas{"slot_outros_sintomas": "nauseas_vomitos"}'
- title: Desmaios
  payload: 'cardiovasc_dor_toracica_outros_sintomas{"slot_outros_sintomas": "desmaios"}'
- title: Sonolência
  payload: 'cardiovasc_dor_toracica_outros_sintomas{"slot_outros_sintomas": "sonolencia"}'
- title: Sudorese (suor frio)
  payload: 'cardiovasc_dor_toracica_outros_sintomas{"slot_outros_sintomas": "sudorese"}'
actions:
- utter_oi
- utter_tchau
- utter_entendi
- utter_inicio_questoes
- action_dor_toracica_PA
- utter_ask_slot_tempo
- utter_ask_slot_tipo
- utter_ask_slot_irradiacao
- utter_ask_slot_fatores_piora
- utter_ask_slot_outros_sintomas
- utter_dor_toracica_resposta_pronto_atendimento
forms:
- form_dor_toracica

Can anyone help me figuring out what’s going on? Thanks!

Is the indentation in this post the same that you have in your py files? If it is, the problem is that all of your functions are nested inside name. Correct the indentation and try again.