The complete code of handoff. When an user requests handoff, or bot failed to assist the customer, i want to transfer to human agent (support): Whatsapp API is not working anymore on groups, i dont want any other messenger. The only solution i have is to have chat web portal, flow will be like that: bot->customer->web portal. Can u assist me to send/receive messages from chatbot<=>web portal via webhook or anyn possible solution? You can reach anytime on my whatsapp +961 79 138 607 or Skype paolo_1st
The handoff is working now using Rasa database: chatbot<=>customer<=>support web portal.
I am sending the message from support to chatbot using API POST request: http://192.168.214.166:5005/webhooks/rest/webhook { “sender”: “0b83b3494194403a94cc103059123a0c”, “message”: “Hi Client, kifak? ma3ak Charbel min proactive.” }
In Rasa database, there is field “type_name”: bot, user… One question is how to update this field using the above API?
Hi @paolo_1st , were you able to completely hand off from bot to a human assistant without changing the chatbox messenger? I am new and I would like to explore this solution. Thanks
yes it’s working, but when human sends greetings or any known intent, the conversation is not paused anymore. i m checking it. You can add this class to custom action, add “action_handoff” under domain file…:
class ActionTalkToHuman(Action): def name(self): return “action_handoff”
def run(self, dispatcher, tracker, domain):
text =conversation_id=last_msg_time=new_msg_time=last_msg=new_msg=""
conversation_id=tracker.sender_id
text = get_text_from_lang(
tracker,
['We are transferring you to a human agent...',
'Nous vous transférons vers un agent humain ...',
'نقوم بتحويلك إلى وكيل بشري ...',
'Մենք ձեզ տեղափոխում ենք մարդկային գործակալ ...'])
dispatcher.utter_message(text)
db = Database_Connection(db_info = db0)
last_msg = db.Select("select data from events where sender_id='"+conversation_id+"' order by id desc limit 0,1")
if(len(last_msg)>0):
x=y=""
x=str(last_msg[0]).split(",")
if(len(x)>0):
if x[1]!="":
y=x[1].split(":")
if(len(y)>0):
last_msg_time=y[1]
while new_msg!="/unpause" and new_msg!="/end_chat" and new_msg_time>last_msg_time:
nm=""
nm = db.Select("select data from events where sender_id='"+conversation_id+"' order by id desc limit 0,1")
if(len(nm)>0):
x=y=""
x=str(last_msg[0]).split(",")
if(len(x)>0):
if x[1]!="":
y=x[1].split(":")
if(len(y)>0):
new_msg_time=y[1]
if new_msg_time>last_msg_time:
#dispatcher.utter_message("Human agent: {}".format(message))
dispatcher.utter_message("Human agent is talking")
time.sleep(10)
return [ConversationPaused()]
i am reading messages from databases. On the other side, i built a web portal for human messages, communicating with Rasa database.
updated version:
class ActionTalkToHuman(Action): def name(self): return “action_handoff”
def run(self, dispatcher, tracker, domain):
text =conversation_id=last_msg_time=new_msg_time=last_msg=new_msg=""
tracker._paused = True
conversation_id=tracker.sender_id
text = get_text_from_lang(
tracker,
['You have been transferred to a human agent.',
'Vous avez été transféré à un agent humain.',
'لقد تم نقلك إلى وكيل بشري.',
'Դուք տեղափոխվել եք մարդկային գործակալ:'])
dispatcher.utter_message(text)
db = Database_Connection(db_info = db0)
last_msg = db.Select("select data from events where sender_id='"+conversation_id+"' order by id desc limit 0,1")
if(len(last_msg)>0):
x=y=""
x=str(last_msg[0]).split(",")
if(len(x)>0):
if x[1]!="":
y=x[1].split(":")
if(len(y)>0):
last_msg_time=y[1]
while new_msg!="/unpause" and new_msg!="/end_chat" and new_msg_time>last_msg_time:
nm=""
nm = db.Select("select data from events where sender_id='"+conversation_id+"' order by id desc limit 0,1")
if(len(nm)>0):
x=y=""
x=str(last_msg[0]).split(",")
if(len(x)>0):
if x[1]!="":
y=x[1].split(":")
if(len(y)>0):
new_msg_time=y[1]
if new_msg_time>last_msg_time:
#dispatcher.utter_message("Human agent: {}".format(message))
dispatcher.utter_message("Human agent is talking")
time.sleep(10)
return [ConversationPaused()]
Hi @paolo_1st , many thanks for sharing that. Just to be sure the steps to follow: Documentation says that I need to name my class and using same name in the return string “action_classname” of the name method. As far as I understood you name your class as ‘TalkToHuman’, but in the ‘name’ method you’re using a different name into the string “action_handoff”. Since the same string, you need to define it into the domains.yml file. I think it should be clear if you align both names into your class just like: " Class ActionHandoff … def name(self): return “action_Handoff" so that into the domains file you’ll write under section actions: - action_Handoff. If I am wrong , please tell me if the following steps are correct:
- Cut&Paste all you class "ActionTalkToHuman(Action) " that you named “action_handoff” , into the actions.py file
- I go to domains.yml file and under "actions " sections I add: - action_handoff Is that correct?
- is " get_text_from_lang" a built-in method in RASA or I need to define it myself?
- what chatbox widget (front-end) are you using? I would like to use RASA chatbot with a chatbox widget for some web pages. Thanks again
-
yes
-
intents:
- trigger_handoff
- human_handoff
- handoff
actions:
- action_handoff
- sorry, it’s custom action, u can replace it by: dispatcher.utter_message(msg)
where msg=any message you want to display to the user.
- In local mode, i m using Rasa X. For customers, i will use chatbox widget. For handoff between clients and support, i developed my own web app to communicate with Rasa database.
All is working fine.
Can you please give a code snippet
- right
- right
- you can ignore it and use dispatcher.utter_message(…)
- chatroom widget, u can find it on github
to vivek22122014 and Ayantika1: i already shared the code above.
Hello i have tried it with tkinter and socket, you can find the code here GitHub - neelkantnewra/rasa-human-handoff: I have used socket io and rest api to apply human hand off
Correction for the class of human handoff, most important key is return [ConversationPaused()] to pause the conversation. In my case, i developed a web portal to communicate between humans and chatbot during the handoff (using rasa database itself).
‘’’’ class ActionTalkToHuman(Action): def name(self): return “action_handoff”
def run(self, dispatcher, tracker, domain):
text =conversation_id=last_msg_time=new_msg_time=last_msg=new_msg=""
tracker._paused = True
conversation_id = tracker.sender_id
email = Email()
email.Email_handoff_notification(tracker)
text = get_text_from_lang(
tracker,
['You have been transferred to a human agent.',
'Vous avez été transféré à un agent humain.',
'لقد تم نقلك إلى وكيل بشري.',
'Դուք տեղափոխվել եք մարդկային գործակալ:'])
dispatcher.utter_message(text)
return [ConversationPaused()]
‘’’’