Esta biblioteca está inspirada en dialogflow/dialogflow-fulfillment-nodejs.
Admite solicitudes y respuestas JSON del webhook de cumplimiento de Dialogflow para agentes v1 y v2.
Para obtener una referencia completa de la clase, consulte el documento.
Instalar a través del compositor: composer require eristemena/dialogflow-fulfillment-webhook-php
.
Para iniciar el agente, use el constructor DialogflowWebhookClient
con el parámetro de entrada como matriz de solicitud proveniente de Dialogflow.
En Vanilla PHP, esto se puede hacer de la siguiente manera:
use Dialogflow WebhookClient ;
$ agent = new WebhookClient ( json_decode ( file_get_contents ( ' php://input ' ), true ));
// or
$ agent = WebhookClient :: fromData ( $ _POST );
o si estás usando Laravel,
$ agent = Dialogflow WebhookClient :: fromData ( $ request -> json ()-> all ());
$ intent = $ agent -> getIntent ();
$ action = $ agent -> getAction ();
$ query = $ agent -> getQuery ();
$ parameters = $ agent -> getParameters ();
$ session = $ agent -> getSession ();
$ contexts = $ agent -> getContexts ();
$ language = $ agent -> getLocale ();
google
, facebook
, slack
, etc.) $ originalRequest = $ agent -> getRequestSource ();
$ originalRequest = $ agent -> getOriginalRequest ();
$ agentVersion = $ agent -> getAgentVersion ();
Para enviar una respuesta, utilice el método reply()
.
$ agent -> reply ( ' Hi, how can I help? ' );
Luego use render()
para obtener la respuesta en una matriz. Todo lo que tienes que hacer es imprimir la matriz como JSON,
header ( ' Content-type: application/json ' );
echo json_encode ( $ agent -> render ());
o en Laravel,
return response ()-> json ( $ agent -> render ());
La carga útil de respuesta se formateará automáticamente según la versión del agente de la solicitud.
$ text = Dialogflow RichMessage Text :: create ()
-> text ( ' This is text ' )
-> ssml ( ' <speak>This is <say-as interpret-as="characters">ssml</say-as></speak> ' )
;
$ agent -> reply ( $ text );
$ image = Dialogflow RichMessage Image :: create ( ' https://www.example.com/image.png ' );
$ agent -> reply ( $ image );
$ card = Dialogflow RichMessage Card :: create ()
-> title ( ' This is title ' )
-> text ( ' this is text body ' )
-> image ( ' https://www.example.com/image.png ' )
-> button ( ' This is a button ' , ' https://docs.dialogflow.com/ ' )
;
$ agent -> reply ( $ card );
$ suggestion = Dialogflow RichMessage Suggestion :: create ([ ' Suggestion one ' , ' Suggestion two ' ]);
$ agent -> reply ( $ suggestion );
if ( $ agent -> getRequestSource ()== ' google ' ) {
$ agent -> reply ( Dialogflow RichMessage Payload :: create ([
' expectUserResponse ' => false
]));
}
Esta biblioteca también admite funcionalidades específicas de Acciones en Google. Todavía está en desarrollo, por lo que se agregarán más funciones en el futuro.
Para utilizar Acciones en el objeto de conversación de Google Dialogflow, primero debe asegurarse de que la requestSource
provenga del Asistente de Google.
if ( $ agent -> getRequestSource ()== ' google ' ) {
$ conv = $ agent -> getActionConversation ();
// here you can use the rest of Actions on Google responses and helpers
$ agent -> reply ( $ conv );
}
o simplemente puede llamar al método getActionConversation()
y devolverá null
si la solicitud no proviene del Asistente de Google.
$ conv = $ agent -> getActionConversation ();
if ( $ conv ) {
// here you can use the rest of Actions on Google responses and helpers
} else {
// the request does not come from Google Assistant
}
Usando el objeto Conversación de Dialogflow, puede enviar una respuesta de dos maneras:
$ conv -> close ( ' Have a nice day! ' );
$ conv -> ask ( ' Hi, how can I help? ' );
Por favor consulte la documentación aquí.
use Dialogflow Action Responses SimpleResponse ;
$ conv -> ask ( SimpleResponse :: create ()
-> displayText ( ' Hello, how can i help? ' )
-> ssml ( ' <speak>Hello,<break time="0.5s"/> <prosody rate="slow">how can i help?</prosody></speak> ' )
);
use Dialogflow Action Responses Image ;
$ conv -> close ( Image :: create ( ' https://picsum.photos/400/300 ' ));
Por favor consulte la documentación aquí.
use Dialogflow Action Responses BasicCard ;
$ conv -> close ( BasicCard :: create ()
-> title ( ' This is a title ' )
-> formattedText ( ' This is a subtitle ' )
-> image ( ' https://picsum.photos/400/300 ' )
-> button ( ' This is a button ' , ' https://docs.dialogflow.com/ ' )
);
Por favor consulte la documentación aquí.
La lista de selección única presenta al usuario una lista vertical de varios elementos y le permite seleccionar uno solo. Al seleccionar un elemento de la lista se genera una consulta de usuario (burbuja de chat) que contiene el título del elemento de la lista.
use Dialogflow Action Questions ListCard ;
use Dialogflow Action Questions ListCard Option ;
$ conv -> ask ( ' Please choose below ' );
$ conv -> ask ( ListCard :: create ()
-> title ( ' This is a title ' )
-> addOption ( Option :: create ()
-> key ( ' OPTION_1 ' )
-> title ( ' Option 1 ' )
-> synonyms ([ ' option one ' , ' one ' ])
-> description ( ' Select option 1 ' )
-> image ( ' https://picsum.photos/48/48 ' )
)
-> addOption ( Option :: create ()
-> key ( ' OPTION_2 ' )
-> title ( ' Option 2 ' )
-> synonyms ([ ' option two ' , ' two ' ])
-> description ( ' Select option 2 ' )
-> image ( ' https://picsum.photos/48/48 ' )
)
);
Para capturar la opción seleccionada por el usuario, cree una intención de Dialogflow con el evento actions_intent_OPTION
. Suponiendo que nombre la intención como Get Option
, puede obtener el argumento de la siguiente manera:
if ( ' Get Option ' == $ agent -> getIntent ()) {
$ conv = $ agent -> getActionConversation ();
$ option = $ conv -> getArguments ()-> get ( ' OPTION ' );
switch ( $ option ) {
case ' OPTION_1 ' :
$ conv -> close ( ' You choose option 1 ' );
break ;
case ' OPTION_2 ' :
$ conv -> close ( ' You choose option 2 ' );
break ;
default :
$ conv -> close ( ' Sorry, i do not understand ' );
break ;
}
}
Por favor consulte la documentación aquí.
El carrusel se desplaza horizontalmente y permite seleccionar un elemento. En comparación con el selector de listas, tiene mosaicos grandes, lo que permite un contenido más rico. Los mosaicos que componen un carrusel son similares a la tarjeta básica con imagen. Seleccionar un elemento del carrusel simplemente generará una burbuja de chat como respuesta, al igual que con el selector de lista.
use Dialogflow Action Questions Carousel ;
use Dialogflow Action Questions Carousel Option ;
$ conv -> ask ( ' Please choose below ' );
$ conv -> ask (
Carousel :: create ()
-> Option (
Option :: create ()
-> key ( ' OPTION_1 ' )
-> title ( ' Option 1 ' )
-> synonyms ([ ' option one ' , ' one ' ])
-> description ( ' Select option 1 ' )
-> image ( ' https://picsum.photos/300/300 ' )
)
-> Option (
Option :: create ()
-> key ( ' OPTION_2 ' )
-> title ( ' Option 2 ' )
-> synonyms ([ ' option two ' , ' two ' ])
-> description ( ' Select option 2 ' )
-> image ( ' https://picsum.photos/300/300 ' )
)
-> Option (
Option :: create ()
-> key ( ' OPTION_3 ' )
-> title ( ' Option 3 ' )
-> synonyms ([ ' option three ' , ' three ' ])
-> description ( ' Select option 3 ' )
-> image ( ' https://picsum.photos/300/300 ' )
)
-> Option (
Option :: create ()
-> key ( ' OPTION_4 ' )
-> title ( ' Option 4 ' )
-> synonyms ([ ' option four ' , ' four ' ])
-> description ( ' Select option 4 ' )
-> image ( ' https://picsum.photos/300/300 ' )
)
);
Para verificar si el usuario le otorgó la información y luego acceder a los datos, cree una intención de Dialogflow con el evento actions_intent_OPTION
. Suponiendo que nombre la intención como Get Option
, puede obtener el argumento de la siguiente manera:
if ( ' Get Option ' == $ agent -> getIntent ()) {
$ conv = $ agent -> getActionConversation ();
$ option = $ conv -> getArguments ()-> get ( ' OPTION ' );
switch ( $ option ) {
case ' OPTION_1 ' :
$ conv -> close ( ' You choose option 1 ' );
break ;
case ' OPTION_2 ' :
$ conv -> close ( ' You choose option 2 ' );
break ;
case ' OPTION_3 ' :
$ conv -> close ( ' You choose option 3 ' );
break ;
case ' OPTION_4 ' :
$ conv -> close ( ' You choose option 4 ' );
break ;
default :
$ conv -> close ( ' Sorry, i do not understand ' );
break ;
}
}
Por favor consulte la documentación aquí.
Un carrusel de navegación es una respuesta enriquecida, similar a la respuesta del carrusel, ya que se desplaza horizontalmente y permite a los usuarios seleccionar un mosaico. Los carruseles de navegación están diseñados específicamente para contenido web al abrir el mosaico seleccionado en un navegador web (o en un navegador AMP si todos los mosaicos están habilitados para AMP). El carrusel de navegación también persistirá en la superficie del Asistente del usuario para navegar más tarde.
use Dialogflow Action Responses BrowseCarousel ;
use Dialogflow Action Responses BrowseCarousel Option ;
$ conv -> ask ( ' Please choose below ' );
$ conv -> ask (
BrowseCarousel :: create ()
-> imageDisplayOptions ( ' CROPPED ' )
-> addOption (
Option :: create ()
-> title ( ' Title of item 1 ' )
-> description ( ' Description of item 1 ' )
-> footer ( ' Item 1 footer ' )
-> url ( ' http://www.example.com ' )
-> image ( ' https://picsum.photos/300/300 ' )
)
-> addOption (
Option :: create ()
-> title ( ' Title of item 2 ' )
-> description ( ' Description of item 2 ' )
-> footer ( ' Item 2 footer ' )
-> url ( ' http://www.example.com ' )
-> image ( ' https://picsum.photos/300/300 ' )
)
-> addOption (
Option :: create ()
-> title ( ' Title of item 3 ' )
-> description ( ' Description of item 3 ' )
-> footer ( ' Item 3 footer ' )
-> url ( ' http://www.example.com ' )
-> image ( ' https://picsum.photos/300/300 ' )
)
-> addOption (
Option :: create ()
-> title ( ' Title of item 4 ' )
-> description ( ' Description of item 4 ' )
-> footer ( ' Item 4 footer ' )
-> url ( ' http://www.example.com ' )
-> image ( ' https://picsum.photos/300/300 ' )
)
);
No es necesario realizar ningún seguimiento para las interacciones del usuario con los elementos del carrusel de exploración, ya que el carrusel maneja la transferencia del navegador.
Por favor consulte la documentación aquí.
use Dialogflow Action Responses LinkOutSuggestion ;
use Dialogflow Action Responses Suggestions ;
$ conv -> ask ( ' Please choose ' );
$ conv -> ask ( new Suggestions ([ ' Suggestion 1 ' , ' Suggestion 2 ' ]));
$ conv -> ask ( new Suggestions ( ' Suggestion 3 ' ));
$ conv -> ask ( new LinkOutSuggestion ( ' Website ' , ' http://www.example.com ' ));
Por favor consulte la documentación aquí.
Las respuestas multimedia permiten que sus acciones reproduzcan contenido de audio con una duración de reproducción superior al límite de 120 segundos de SSML. El componente principal de una respuesta de los medios es la tarjeta de vía única.
use Dialogflow Action Responses MediaObject ;
use Dialogflow Action Responses MediaResponse ;
use Dialogflow Action Responses Suggestions ;
$ conv -> ask ( ' Here you go ' );
$ conv -> ask (
new MediaResponse (
MediaObject :: create ( ' http://storage.googleapis.com/automotive-media/Jazz_In_Paris.mp3 ' )
-> name ( ' Jazz in Paris ' )
-> description ( ' A funky Jazz tune ' )
-> icon ( ' http://storage.googleapis.com/automotive-media/album_art.jpg ' )
-> image ( ' http://storage.googleapis.com/automotive-media/album_art.jpg ' )
)
);
$ conv -> ask ( new Suggestions ([ ' Pause ' , ' Stop ' , ' Start over ' ]));
Por favor consulte la documentación aquí.
use Dialogflow Action Questions Permission ;
$ conv -> ask ( Permission :: create ( ' To address you by name and know your location ' , [ ' NAME ' , ' DEVICE_PRECISE_LOCATION ' ]));
Para verificar si el usuario le otorgó la información y luego acceder a los datos, cree una intención de Dialogflow con el evento actions_intent_PERMISSION
. Suponiendo que nombre la intención como Get Permission
, puede obtener la información de la siguiente manera:
if ( ' Get Permission ' == $ agent -> getIntent ()) {
$ conv = $ agent -> getActionConversation ();
$ approved = $ conv -> getArguments ()-> get ( ' PERMISSION ' );
if ( $ approved ) {
$ name = $ conv -> getUser ()-> getName ()-> getDisplay ();
$ latlng = $ conv -> getDevice ()-> getLocation ()-> getCoordinates ();
$ lat = $ latlng -> getLatitude ();
$ lng = $ latlng -> getLongitude ();
$ conv -> close ( ' Got it, your name is ' . $ name . ' and your coordinates are ' . $ lat . ' , ' . $ lng );
} else {
$ conv -> close ( ' Never mind then ' );
}
}
Por favor consulte la documentación aquí.
use Dialogflow Action Questions DateTime ;
$ conv -> ask ( new DateTime ( ' When do you want to come in? ' , ' What is the best date to schedule your appointment? ' , ' What time of day works best for you? ' ));
Para comprobar si el usuario concedió acceso y luego acceder a los datos, cree una intención de Dialogflow con el evento actions_intent_DATETIME
. Suponiendo que nombre la intención como Get Date Time
, puede obtener la información de la siguiente manera:
if ( ' Get Date Time ' == $ agent -> getIntent ()) {
$ conv = $ agent -> getActionConversation ();
$ date = $ conv -> getArguments ()-> get ( ' DATETIME ' );
if ( $ date ) {
$ conv -> close ( ' Ok, got it, i will see you at ' . $ date -> format ( ' r ' ));
} else {
$ conv -> close ( ' Never mind then ' );
}
}
Por favor consulte la documentación aquí.
use Dialogflow Action Questions Place ;
$ conv -> ask ( new Place ( ' Where do you want to have lunch? ' , ' To find lunch locations ' ));
Para comprobar si el usuario concedió acceso y luego acceder a los datos, cree una intención de Dialogflow con el evento actions_intent_PLACE
. Suponiendo que nombre la intención como Get Place
, puede obtener la información de la siguiente manera:
if ( ' Get Place ' == $ agent -> getIntent ()) {
$ conv = $ agent -> getActionConversation ();
$ place = $ conv -> getArguments ()-> get ( ' PLACE ' );
if ( $ place ) {
$ conv -> close ( ' Ok, got it, we ' ll meet at ' . $ place -> getFormattedAddress ());
} else {
$ conv -> close ( ' Never mind then ' );
}
}
Por favor consulte la documentación aquí.
use Dialogflow Action Questions Confirmation ;
$ conv -> ask ( new Confirmation ( ' Can you confirm? ' ));
Para verificar si el usuario confirmó o no, cree una intención de Dialogflow con el evento actions_intent_CONFIRMATION
. Suponiendo que nombre la intención como Get Confirmation
, puede obtener la información de la siguiente manera:
if ( ' Get Confirmation ' == $ agent -> getIntent ()) {
$ conv = $ agent -> getActionConversation ();
$ confirmed = $ conv -> getArguments ()-> get ( ' CONFIRMATION ' );
if ( $ confirmed ) {
$ conv -> close ( ' Ok, it is confirmed ' );
} else {
$ conv -> close ( ' Alright then, it is canceled ' );
}
}
El Asistente de Google se puede utilizar en una variedad de superficies, como dispositivos móviles que admiten experiencias de audio y visualización o un dispositivo Google Home que admite experiencias de solo audio.
Para diseñar y crear conversaciones que funcionen bien en todas las superficies, utilice las capacidades de la superficie para controlar y definir el alcance de sus conversaciones correctamente.
$ surface = $ conv -> getSurface ();
if ( $ surface -> hasScreen ()) {
// surface has screen
} elseif ( $ surface -> hasAudio ()) {
// surface has audio
} elseif ( $ surface -> hasMediaPlayback ()) {
// surface can play audio
} elseif ( $ surface -> hasWebBrowser ()) {
// user can interact with the content in a web browser
}