Alexa Skills Dialog Management: come ripetere l'ultimo intento senza specificarne nuovamente le espressioni
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
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.

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.
