Nachfrage bei Auswahl von bestimmten Slot Type Values

Hier wird über die Entwicklung von Skills diskutiert.
Antworten

Themenstarter
eric

Mo 5. Mär 2018, 22:09

Hallo zusammen.

Ich bin Neuling in der Entwicklung von Skills für Alexa und stehe gerade vor einer Herausforderung, für die ich bisher keine Lösung finden konnte.

Mein Skill soll folgende Funktion erfüllen: Abfrage von Informationen zu einer Stadt unter Angabe eines Datums. Mir geht es dabei erst einmal nur um die Entwicklung des Dialogs mit Abfrage von Informationen über eine Schnittstelle für mein eigenes Verständnis.

Die Liste der Städte, zu denen es Informationen gibt, habe ich in einem Slot Type abgelegt. Das Datum frage ich über einen Slot mit amazon.date ab. Das klappt alles soweit prima. In meinem node.js-Script bekomme ich das vom Benutzer angegebene Datum und die Stadt übermittelt um weiter damit arbeiten zu können.

Jetzt möchte ich gerne einen "Sonderfall" implementieren, quasi eine "Rückfrage" bei bestimmten (und von mir definierten) Einträgen in meinem Slot Type der Städte. Dies könnten beispielsweise Stadtteile sein. Beantwortet der Benutzer auf die Frage der Stadt mit "Berlin", soll Alexa nach dem Stadteil fragen. Diese Stadteile könnten in einem weiteren Slot Type abgelegt sein. Bei der Beantwortung der Frage nach der Stadt mit "Buxdehude" soll nicht weiter nachgefragt werden.

Bitte stört euch nicht am recht statischen Aufbau - mir ist klar, dass ich nicht alle deutschen Städte ablegen sollte. Es geht mir hierbei eher um das Prinzip des Dialogs und der Ausnahme für die Rückfrage. Die Städte könnten z.B. auch Lebensmittel sein, bei denen manche eindeutig sind, manche aber Variationen haben.

Mein derzeitiges Script habe ich mir aus Beispielen zusammengesucht bzw. auf https://skillinator.io/ erzeugen lassen.
Für den Intent getInfo sieht das derzeit so aus:

Code: Alles auswählen

'getInfo': function () {
    //delegate to Alexa to collect all the required slot values
    var filledSlots = delegateSlotCollection.call(this);
    speechOutput = '';
	
	//any intent slot variables are listed here for convenience
	var datumSlotRaw = this.event.request.intent.slots.datum.value;
	console.log(datumSlotRaw);
	
	var datumSlot = resolveCanonical(this.event.request.intent.slots.datum);
	console.log(datumSlot);
	
	var locationSlotRaw = this.event.request.intent.slots.location.value;
	console.log(locationSlotRaw);
	
	var locationSlot = resolveCanonical(this.event.request.intent.slots.location);
	console.log(locationSlot);
	//Your custom intent handling goes here
    
    if (locationSlot == "berlin") {
        var speechOutput = "für welchen stadtteil in berlin möchtest du das wissen";
    } else {
        var speechOutput = "du hast nach "+locationSlot+" für datum "+datumSlot+" gefragt";
    }
    
    this.emit(':tell', speechOutput, speechOutput);
}

Code: Alles auswählen

function delegateSlotCollection(){
  console.log("in delegateSlotCollection");
  console.log("current dialogState: "+this.event.request.dialogState);
    if (this.event.request.dialogState === "STARTED") {
      console.log("in Beginning");
	  var updatedIntent= null;
	  // updatedIntent=this.event.request.intent;
      //optionally pre-fill slots: update the intent object with slot values for which
      //you have defaults, then return Dialog.Delegate with this updated intent
      // in the updatedIntent property
      //this.emit(":delegate", updatedIntent); //uncomment this is using ASK SDK 1.0.9 or newer
	  
	  //this code is necessary if using ASK SDK versions prior to 1.0.9 
	  if(this.isOverridden()) {
			return;
		}
		this.handler.response = buildSpeechletResponse({
			sessionAttributes: this.attributes,
			directives: getDialogDirectives('Dialog.Delegate', updatedIntent, null),
			shouldEndSession: false
		});
		this.emit(':responseReady', updatedIntent);
		
    } else if (this.event.request.dialogState !== "COMPLETED") {
      console.log("in not completed");
      // return a Dialog.Delegate directive with no updatedIntent property.
      //this.emit(":delegate"); //uncomment this is using ASK SDK 1.0.9 or newer
	  
	  //this code necessary is using ASK SDK versions prior to 1.0.9
		if(this.isOverridden()) {
			return;
		}
		this.handler.response = buildSpeechletResponse({
			sessionAttributes: this.attributes,
			directives: getDialogDirectives('Dialog.Delegate', updatedIntent, null),
			shouldEndSession: false
		});
		this.emit(':responseReady');
		
    } else {
      console.log("in completed");
      console.log("returning: "+ JSON.stringify(this.event.request.intent));
      // Dialog is now complete and all required slots should be filled,
      // so call your normal intent handler.
      return this.event.request.intent;
    }
}
Über Tipps und Anregungen würde ich mich freuen!

Viele Grüße
Eric
0 x
Benutzeravatar

Fonzo
Beiträge: 1690
Registriert: Fr 24. Feb 2017, 00:06

Di 6. Mär 2018, 00:10

eric hat geschrieben:
Mo 5. Mär 2018, 22:09
Die Liste der Städte, zu denen es Informationen gibt, habe ich in einem Slot Type abgelegt.
Du solltest keinen Custom Slot Type nutzten sondern AMAZON.DE_CITY und diesen erweitern wenn Dir was fehlt. Ansonsten musst Du Dich entscheiden was Du mit einem Skript prüfen willst bzw. was sich so schon mit dem Interaktion Modell abbilden lässt. Wenn Du auf Slot Confirmation gehst kannst Du einfache Nachfragen auch schon direkt im Interaktion Modell abbilden ohne überhaupt erst Daten weiterreichen zu müssen.
0 x
Antworten

Zurück zu „Fähigkeiten (Skills) entwickeln“

  • Information