My bot asks question and then user writes a numeric answer. Now bot needs to check if answer is correct or not. I have made custom action functions which check then and then reply if answer is correct or not. But it doesn’t work.
Here is my custom actions
from typing import Any, Text, Dict, List
from rasa_sdk.events import SlotSet
from rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcher
from rasa_sdk.types import DomainDict
class kysymyksienTarkistus1(Action):
def name(self) -> Text:
return "action_tarkista_kysymys_01"
def run(
self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
vastaus = tracker.latest_message["text"]
# tarkistetaan onko vastaus oikein
if vastaus == "puolikas":
dispatcher.utter_message(response = "utter_kysymys01_oikein")
#dispatcher.utter_message(text=f"vastaus oikein")
return []
else:
dispatcher.utter_message(response = "utter_kysymys01_vaarin")
#dispatcher.utter_message(text=f"vastaus väärin")
return []
class kysymyksienTarkistus2(Action):
def name(self) -> Text:
return "action_tarkista_kysymys_02"
def run(
self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
vastaus = tracker.latest_message["text"]
# tarkistetaan onko vastaus oikein
if vastaus == "100":
dispatcher.utter_message(response = "utter_kysymys02_oikein")
return []
else:
dispatcher.utter_message(response = "utter_kysymys02_vaarin")
return []
class kysymyksienTarkistus4(Action):
def name(self) -> Text:
return "action_tarkista_kysymys_04"
def run(
self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
vastaus = tracker.latest_message["text"]
# tarkistetaan onko vastaus oikein
if vastaus == "100":
dispatcher.utter_message(response = "utter_kysymys01_oikein")
return []
else:
dispatcher.utter_message(response = "utter_kysymys04_vaarin")
return []
class kysymyksienTarkistus5(Action):
def name(self) -> Text:
return "action_tarkista_kysymys_04"
def run(
self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
vastaus = tracker.latest_message["text"]
# tarkistetaan onko vastaus oikein
if vastaus == "100":
dispatcher.utter_message(response = "utter_kysymys01_oikein")
return []
else:
dispatcher.utter_message(response = "utter_kysymys05_vaarin")
return []
Everything looks correct except in the name method of class kysymyksienTarkistus5 you are returning "action_tarkista_kysymys_04" instead of "action_tarkista_kysymys_05".
Hi, I corrected the typo but still not working. It just starts and stops. I’m using docker to start it, here is my command
docker run -v $(pwd)/actions:/app/actions --net action-link --name action-server-prod rasa/rasa-sdk:2.2.0
Here is output
2021-08-31 16:54:59 INFO rasa_sdk.endpoint - Starting action endpoint server...-net action-link --name action-server-prod rasa/rasa-sdk:2.2.0
2021-08-31 16:54:59 ERROR rasa_sdk.executor - Failed to register package 'actions'.
Traceback (most recent call last):
File "/app/rasa_sdk/executor.py", line 254, in register_package
self._import_submodules(package)
File "/app/rasa_sdk/executor.py", line 217, in _import_submodules
self._import_module(full_name)
File "/app/rasa_sdk/executor.py", line 231, in _import_module
module = importlib.import_module(name)
File "/usr/local/lib/python3.7/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/app/actions/actions.py", line 5, in <module>
from rasa_sdk.types import DomainDict
File "/app/rasa_sdk/types.py", line 3, in <module>
from typing_extensions import TypedDict
ModuleNotFoundError: No module named 'typing_extensions'
Here is Docker file that I used to create action server
# Extend the official Rasa SDK image
FROM rasa/rasa-sdk:2.2.0
#COPY * /app/
# Use subdirectory as working directory
WORKDIR /app
# Copy any additional custom requirements, if necessary (uncomment next line)
# COPY actions/requirements-actions.txt ./
# Change back to root user to install dependencies
USER root
# Install extra requirements for actions code, if necessary (uncomment next line)
#RUN pip install -r .requirements-actions.txt
# RUN pip install typing_extensions
# Copy actions folder to working directory
COPY ./actions /app/actions
RUN python -m pip install --upgrade pip
RUN pip install --no-cache-dir typing_extensions
# By best practices, don't run the code with root user
USER 1003
Thanks I got it working in my testbed (virtualbox Ubuntun 18:04) but not in my production environment (Azure cloud Ubuntu 18:04). I noticed some difference in pip and python versions but finally this solved problem. I compared what docker images it created, in virtualbox
linttu@linttu-VirtualBox:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rasa-sdk 2.2.0 d759afb1e947 3 hours ago 165MB
rasa/rasa-sdk 2.2.0 f6dfbf329eb3 2 days ago 165MB
rasa/rasa 2.2.0-full a298c0d73278 8 months ago 1.91GB
rasa/rasa-sdk <none> a1c9443b5df6 8 months ago 151MB
and in Azure
[paulii@vetbot-v4 /pilleribot TUOTANTO]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rasa-sdk 2.2.0 3c7b6ec49eff 40 minutes ago 165MB
rasa/rasa 2.6.0-full 80efe1ff431a 3 months ago 2.03GB
rasa/rasa 2.2.0-full a298c0d73278 8 months ago 1.91GB
rasa/rasa-sdk 2.2.0 a1c9443b5df6 8 months ago 151MB
I noticed that rasa/saras-sdk 2.2.0 is 8 months old and rasa-sdk 2.2.0 newer, so I tried this command
docker run -d -v $(pwd)/actions:/app/actions --net action-link --name action-server-prod rasa-sdk:2.2.0
instead of rasa/rasa-sdk:2.2.0 and it started to work!!
I don´t know why it creates two versions, maybe someone who understands better can explain.