How do I set a slot by clicking on buttons?

Hi, I’m trying to build a price negotiator bot using rasa.

I want to ask the user whether he is ok with the deal every time the bot presents him with a new offer. For this, I’m building a custom action that gets triggered on form submit.

def run(self,dispatcher,tracker: Tracker,domain: "DomainDict",) -> List[Dict[Text, Any]]:

        dispatcher.utter_message(text = "Ok! Let me see what I can do!")

        i = 0
        product_price = 500
        platform_bargain_percentage = 10
        vendor_bargain_percentage = 10
        min_bargain = 2
        max_bargain = platform_bargain_percentage + vendor_bargain_percentage

        offer_price = int(tracker.get_slot("price"))
        quantity = int(tracker.get_slot("quantity"))

        user_asked_percentage = (offer_price / product_price) * 100
  
        current_bargain = [*range(min_bargain,max_bargain)][0]
        deal = False


        while user_asked_percentage > current_bargain and deal != True and i<= len([*range(min_bargain,max_bargain)]):

            buttons = [
                {"payload":'/inform_intent{"deal":True}',"title":"Yup!"},
                {"payload":'/inform_intent{"deal":False}',"title":"Nope!"}
            ]

            dispatcher.utter_message(text = "Okay so I just checked and sorry but we can't give away for that price!")

            dispatcher.utter_message(text = f"How about {str(((current_bargain)/100) * product_price)}?")

            dispatcher.utter_message(text = "Are you ok with this deal?",buttons = buttons)

            deal = tracker.get_slot("deal")
            i = i + 1
            current_bargain = [*range(min_bargain,max_bargain)][i]

Here I intend to set the slot “deal” to True or False when the user clicks the button. So basically I want to modify this part to set directly into a slot instead of setting into an entity:

buttons = [ {“payload”:‘/inform_intent{“deal”:True}’,“title”:“Yup!”}, {“payload”:‘/inform_intent{“deal”:False}’,“title”:“Nope!”} ]

If there is no way to set a slot directly, how can I set the entity value into a slot in rules.yml?

Here is my current rules.yml:

- rule: start bargaining
  steps:
  - intent: user_negotiation_initiate
  - action: utter_start_negotiation
  - action: user_offer_form
  - active_loop: user_offer_form

- rule: submit form
  condition:
  - active_loop: user_offer_form
  steps:
  - action: user_offer_form
  - active_loop: null
  - slot_was_set:
    - requested_slot: null
  - action: action_get_offer

And this is my current form definition in domain.yml:

forms:
  user_offer_form:
    quantity:
      - type: from_text
    price:
      - type: from_text

Any help would be appreciated!! Thanks!

Yeah this is how to do it.

Create a slot called “deal”, set a few examples with this entity in the NLU, set autofill to true for this slot in the domain,

I think what you have to change is the quotes around True and False:

buttons = [
    {"payload": '/inform_intent{"deal": "true"}', "title": "Yup!"},
    {"payload": '/inform_intent{"deal": "false"}', "title": "Nope!"}
]