Alexa Skills Dialog Management: come ripetere l'ultimo intento senza specificarne nuovamente le espressioni

Aug 21 2020

Sto sviluppando la mia prima skill Alexa e voglio provare a migliorarne la gestione dei dialoghi.
La mia abilità ha diversi intenti: uno per ottenere la temperatura interna, uno per ottenere l'umidità e così via.
Ogni intento ha uno slot che rappresenta il pavimento/la stanza della mia casa, quindi la tipica domanda ad Alexa è "Qual è la temperatura al primo piano?"

Ogni volta che viene eseguito l'intento, memorizza lo slot in un attributo di sessione in modo da poter gestire una conversazione come questa:

io: "Alexa qual è la temperatura al primo piano?"
Alexa: "La temperatura al primo piano è di 24 gradi"
io: "e l'umidità?"
Alexa: "L'umidità al primo piano è del 50%"


Il passo successivo che sto cercando di implementare è questo tipo di dialogo:

io: "Alexa qual è la temperatura al primo piano?"
Alexa: "La temperatura al primo piano è di 24 gradi"
io: "e al secondo piano?"
Alexa: "La temperatura al secondo piano è di 26 gradi"

In pratica, devo lanciare l'ultimo intento eseguito senza pronunciarne le espressioni.
Stavo pensando di creare un nuovo intento generico che riceve solo lo slot e quindi invia la richiesta all'ultimo intento eseguito.
Posso tenere traccia dell'ultimo intento eseguito salvando il suo ID in un attributo di sessione.

C'è un modo migliore per farlo?
Ogni suggerimento è benvenuto perché sto sviluppando le abilità di Alexa da lunedì scorso! :-)

Molte grazie.

Risposte

1 LetMyPeopleCode Aug 22 2020 at 16:00

Sei sulla strada giusta. La cosa da ricordare è che puoi avere un intento per più slot e NON richiederli tutti.

Ecco come puoi creare un unico intento per tutto.

Le espressioni di esempio sono:

How are things on the {floor}
And on the {floor}
What is the {condition}
What is the {condition} on the {floor}

Quindi crei i tipi di slot "condizione" e "piano", riempiendoli con valori di esempio appropriati come "temperatura" per condizione e "primo piano" per pavimento. Quindi assicurati di assegnare quei tipi di slot agli slot nel tuo intento.

Quindi il codice del tuo gestore è simile a questo...

    const conditionIntentHandler = {
      canHandle(handlerInput) {
            return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
                && Alexa.getIntentName(handlerInput.requestEnvelope) === 'conditionIntent';
        },
        handle(handlerInput) {
          var speakOutput = "";
          var condition = "";
          var floor = "";
          const attributesManager = handlerInput.attributesManager;
          const attributes = attributesManager.getSessionAttributes();
          
          if (handlerInput.requestEnvelope.request.intent.slots.condition.hasOwnProperty('value')) {
            condition = handlerInput.requestEnvelope.request.intent.slots.condition.value;
          } else if (attributes.hasOwnProperty('condition')) {
            if(attributes.condition !== "") condition = attributes.condition;
          }    
            
          if (handlerInput.requestEnvelope.request.intent.slots.floor.hasOwnProperty('value')) {
            floor = handlerInput.requestEnvelope.request.intent.slots.floor.value;
          } else if (attributes.hasOwnProperty('floor')) {
            if(attributes.floor !== "") floor = attributes.floor;
          }    
        
          if (floor !== "" && condition === ""){
              speakOutput = "Here's the conditions for the " + floor; 
          }  else if (floor === "" && condition !== ""){
              speakOutput = "Here's the " + condition + " throughout the house";
          } else if (floor !== "" && condition !== ""){
              speakOutput = "Here's the " + condition + " on the " + floor;
          } else {
              speakOutput = "I have no idea what you're saying. Are you okay?"
          }

          attributes.floor = floor;
          attributes.condition = condition;
          attributesManager.setSessionAttributes(attributes);
          
            return handlerInput.responseBuilder
                .speak(speakOutput)
                .reprompt('What else can I tell you?')
                .getResponse();
        }
    };

Non ho scritto il codice effettivo per presentare i valori, solo risposte segnaposto, ma dovresti farti un'idea. Aggiungi più frasi portante che contengono uno o entrambi i tipi di slot per gestire più modi in cui le persone potrebbero chiedere queste informazioni.