Эта библиотека вдохновлена диалоговым потоком/dialogflow-fulfillment-nodejs.
Он поддерживает запросы и ответы JSON веб-перехватчика Dialogflow для агентов v1 и v2.
Полную информацию о классе можно найти в документе.
Установите через композитор: composer require eristemena/dialogflow-fulfillment-webhook-php
.
Чтобы инициировать агент, используйте конструктор DialogflowWebhookClient
с входным параметром в качестве массива запроса, поступающего от Dialogflow.
В Vanilla PHP это можно сделать следующим образом:
use Dialogflow WebhookClient ;
$ agent = new WebhookClient ( json_decode ( file_get_contents ( ' php://input ' ), true ));
// or
$ agent = WebhookClient :: fromData ( $ _POST );
или если вы используете 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
и т. д.) $ originalRequest = $ agent -> getRequestSource ();
$ originalRequest = $ agent -> getOriginalRequest ();
$ agentVersion = $ agent -> getAgentVersion ();
Чтобы отправить ответ, используйте метод reply()
.
$ agent -> reply ( ' Hi, how can I help? ' );
Затем используйте render()
чтобы получить ответ в массиве. Все, что вам нужно сделать, это распечатать массив в формате JSON.
header ( ' Content-type: application/json ' );
echo json_encode ( $ agent -> render ());
или в Ларавеле,
return response ()-> json ( $ agent -> render ());
Полезные данные ответа будут автоматически отформатированы в соответствии с версией агента запроса.
$ 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
]));
}
Эта библиотека также поддерживает специальные функции Actions on Google. Он все еще находится в стадии разработки, поэтому в будущем будут добавлены дополнительные функции.
Чтобы использовать Actions on Google Dialogflow Conversation, вам сначала необходимо убедиться, что requestSource
поступает из Google Assistant,
if ( $ agent -> getRequestSource ()== ' google ' ) {
$ conv = $ agent -> getActionConversation ();
// here you can use the rest of Actions on Google responses and helpers
$ agent -> reply ( $ conv );
}
или вы можете просто вызвать метод getActionConversation()
, и он вернет null
если запрос поступает не от Google Assistant.
$ 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
}
Используя объект диалога Dialogflow, вы можете отправить ответ двумя способами:
$ conv -> close ( ' Have a nice day! ' );
$ conv -> ask ( ' Hi, how can I help? ' );
Пожалуйста, ознакомьтесь с документацией здесь.
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 ' ));
Пожалуйста, ознакомьтесь с документацией здесь.
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/ ' )
);
Пожалуйста, ознакомьтесь с документацией здесь.
Список с одним выбором представляет пользователю вертикальный список из нескольких элементов и позволяет пользователю выбрать один. При выборе элемента из списка генерируется пользовательский запрос (пузырь чата), содержащий заголовок элемента списка.
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 ' )
)
);
Чтобы захватить выбранную пользователем опцию, создайте намерение Dialogflow с событием actions_intent_OPTION
. Предполагая, что вы называете намерение Get Option
, вы можете получить аргумент следующим образом:
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 ;
}
}
Пожалуйста, ознакомьтесь с документацией здесь.
Карусель прокручивается горизонтально и позволяет выбрать один элемент. По сравнению с селектором списка, он имеет большие плитки, что позволяет отображать более богатый контент. Плитки, составляющие карусель, аналогичны базовой карточке с изображением. Выбор элемента из карусели просто создаст всплывающее окно чата в качестве ответа, как и при выборе списка.
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 ' )
)
);
Чтобы проверить, предоставил ли пользователь вам информацию, а затем получить доступ к данным, создайте намерение Dialogflow с событием actions_intent_OPTION
. Предполагая, что вы называете намерение Get Option
, вы можете получить аргумент следующим образом:
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 ;
}
}
Пожалуйста, ознакомьтесь с документацией здесь.
Карусель просмотра — это расширенный ответ, похожий на ответ карусели, поскольку он прокручивается по горизонтали и позволяет пользователям выбирать плитку. Карусели просмотра созданы специально для веб-контента: выбранная плитка открывается в веб-браузере (или в браузере AMP, если все плитки поддерживают AMP). Карусель просмотра также сохранится на поверхности Ассистента пользователя для последующего просмотра.
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 ' )
)
);
Никакого последующего выполнения не требуется для взаимодействия пользователя с элементами карусели просмотра, поскольку карусель обрабатывает передачу браузера.
Пожалуйста, ознакомьтесь с документацией здесь.
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 ' ));
Пожалуйста, ознакомьтесь с документацией здесь.
Ответы мультимедиа позволяют вашим действиям воспроизводить аудиоконтент, длительность воспроизведения которого превышает 120-секундный предел SSML. Основным компонентом реакции СМИ является однопутная карточка.
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 ' ]));
Пожалуйста, ознакомьтесь с документацией здесь.
use Dialogflow Action Questions Permission ;
$ conv -> ask ( Permission :: create ( ' To address you by name and know your location ' , [ ' NAME ' , ' DEVICE_PRECISE_LOCATION ' ]));
Чтобы проверить, предоставил ли пользователь вам информацию, а затем получить доступ к данным, создайте намерение Dialogflow с событием actions_intent_PERMISSION
. Предполагая, что вы называете намерение Get Permission
, вы можете получить информацию следующим образом:
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 ' );
}
}
Пожалуйста, ознакомьтесь с документацией здесь.
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? ' ));
Чтобы проверить, предоставил ли пользователь доступ, а затем получить доступ к данным, создайте намерение Dialogflow с событием actions_intent_DATETIME
. Предполагая, что вы называете намерение Get Date Time
, вы можете получить информацию следующим образом:
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 ' );
}
}
Пожалуйста, ознакомьтесь с документацией здесь.
use Dialogflow Action Questions Place ;
$ conv -> ask ( new Place ( ' Where do you want to have lunch? ' , ' To find lunch locations ' ));
Чтобы проверить, предоставил ли пользователь доступ, а затем получить доступ к данным, создайте намерение Dialogflow с событием actions_intent_PLACE
. Предполагая, что вы называете намерение Get Place
, вы можете получить информацию следующим образом:
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 ' );
}
}
Пожалуйста, ознакомьтесь с документацией здесь.
use Dialogflow Action Questions Confirmation ;
$ conv -> ask ( new Confirmation ( ' Can you confirm? ' ));
Чтобы проверить, подтвердил ли пользователь или нет, создайте намерение Dialogflow с событием actions_intent_CONFIRMATION
. Предполагая, что вы называете намерение Get Confirmation
, вы можете получить информацию следующим образом:
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 ' );
}
}
Google Assistant можно использовать на различных поверхностях, например на мобильных устройствах, которые поддерживают звук и отображение, или на устройстве Google Home, которое поддерживает только звук.
Чтобы проектировать и создавать беседы, которые хорошо работают на всех поверхностях, используйте возможности поверхности для правильного управления и масштабирования бесед.
$ 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
}