Hi there, I tried to implement an action to response to a pre-settled slot value, such as “open google website”, or “open facebook website”, I read the https://rasa.com/docs/ hard, and learned into several examples in rasa/examples at main · RasaHQ/rasa · GitHub, but failed to find a proper example for me.
Could someone help me out? thanks a lot.
Here are some code snippet of my project.
nlu.yml
version: "3.1"
nlu:
- intent: open_web
examples: |
- open [Google](web_name) website
- open [Microsoft](web_name) website
- open [Facebook](web_name) website
- open [Twitter](web_name) website
ruls.yml
version: "3.1"
policies:
- name: RulePolicy
rules:
- rule: activate open web form
steps:
- intent: open_web
- action: open_web_form
- active_loop: open_web_form
stories.yml
version: "3.1"
stories:
- story: open_web
steps:
- intent: open_web
- slot_was_set:
- web_name: Google
- action: open_web_form
- active_loop: open_web_form
- active_loop: null
- action: action_open_web
domain.yml
version: '3.1'
intents:
- open_web
actions:
- action_open_web
entities:
- web_name
- url
slots:
web_name:
type: text
mappings:
- type: from_entity
entity: web_name
url:
type: text
mappings:
- type: from_entity
entity: url
responses:
utter_greet:
- text: Hi you back.
session_config:
session_expiration_time: 60
carry_over_slots_to_new_session: true
forms:
open_web_form:
required_slots:
- web_name
- url
actions.py
from typing import Any, Text, Dict, List
from requests_html import HTMLSession
from rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcher
import subprocess
import logging
logging.basicConfig(level="DEBUG")
session = HTMLSession()
class ActionOpenWeb(Action):
def name(self) -> Text:
return "action_open_web"
def run(self, dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
# web_name = tracker.get_slot('web_name')
web_name = tracker.slots.get('web_name')
msg = "web_name: " + str(web_name)
dispatcher.utter_message(msg)
print(msg)
print(tracker.slots.values())
# url = tracker.get_slot('url')
url = tracker.slots.get('url')
msg = "url: " + str(url)
dispatcher.utter_message(msg)
print(msg)
if web_name:
# search_url = f"https://cn.bing.com/search?q={web_name}官网"
search_url = f"https://cn.bing.com/search?q={web_name}"
r = session.get(search_url)
cite = r.html.find('cite', first=True).text
web_url = cite
go_to(web_url)
tracker.slots = {'web_name':''}
dispatcher.utter_message("Here we go: " + web_url)
elif url:
go_to(url)
tracker.slots = {'url':''}
dispatcher.utter_message("Here we go: " + url)
else:
dispatcher.utter_message("Sorry, this website can not be recognized!")
return []