Perpustakaan ini terinspirasi oleh dialogflow/dialogflow-fulfillment-nodejs.
Ini mendukung permintaan dan respons JSON webhook pemenuhan Dialogflow untuk agen v1 dan v2.
Untuk referensi kelas lengkap silakan merujuk ke dokumen.
Instal melalui komposer: composer require eristemena/dialogflow-fulfillment-webhook-php
.
Untuk memulai agen, gunakan konstruktor DialogflowWebhookClient
dengan parameter input sebagai larik permintaan yang berasal dari Dialogflow.
Di Vanilla PHP, ini bisa dilakukan sebagai berikut,
use Dialogflow WebhookClient ;
$ agent = new WebhookClient ( json_decode ( file_get_contents ( ' php://input ' ), true ));
// or
$ agent = WebhookClient :: fromData ( $ _POST );
atau jika Anda menggunakan 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
, dll) $ originalRequest = $ agent -> getRequestSource ();
$ originalRequest = $ agent -> getOriginalRequest ();
$ agentVersion = $ agent -> getAgentVersion ();
Untuk mengirim balasan, gunakan metode reply()
.
$ agent -> reply ( ' Hi, how can I help? ' );
Kemudian gunakan render()
untuk mendapatkan respons dalam array. Yang harus Anda lakukan adalah mencetak array sebagai JSON,
header ( ' Content-type: application/json ' );
echo json_encode ( $ agent -> render ());
atau di Laravel,
return response ()-> json ( $ agent -> render ());
Payload respons akan secara otomatis diformat sesuai dengan Versi Agen permintaan.
$ 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
]));
}
Pustaka ini juga mendukung fungsi khusus Actions on Google. Ini masih dalam pengembangan, jadi lebih banyak fitur akan ditambahkan di masa depan.
Untuk menggunakan objek Percakapan Actions on Google Dialogflow, Anda harus terlebih dahulu memastikan requestSource
berasal dari Asisten Google,
if ( $ agent -> getRequestSource ()== ' google ' ) {
$ conv = $ agent -> getActionConversation ();
// here you can use the rest of Actions on Google responses and helpers
$ agent -> reply ( $ conv );
}
atau Anda cukup memanggil metode getActionConversation()
, dan metode tersebut akan mengembalikan null
jika permintaan tidak datang dari Asisten 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
}
Menggunakan objek Dialogflow Conversation, Anda dapat mengirim balasan dengan dua cara,
$ conv -> close ( ' Have a nice day! ' );
$ conv -> ask ( ' Hi, how can I help? ' );
Silakan lihat dokumentasinya di sini.
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 ' ));
Silakan lihat dokumentasinya di sini.
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/ ' )
);
Silakan lihat dokumentasinya di sini.
Daftar pilihan tunggal menyajikan kepada pengguna daftar vertikal beberapa item dan memungkinkan pengguna untuk memilih satu item. Memilih item dari daftar menghasilkan permintaan pengguna (gelembung obrolan) yang berisi judul item daftar.
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 ' )
)
);
Untuk menangkap opsi yang dipilih oleh pengguna, buat maksud Dialogflow dengan peristiwa actions_intent_OPTION
. Dengan asumsi Anda menamai maksudnya sebagai Get Option
, Anda bisa mendapatkan argumen sebagai berikut,
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 ;
}
}
Silakan lihat dokumentasinya di sini.
Korsel bergulir secara horizontal dan memungkinkan untuk memilih satu item. Dibandingkan dengan pemilih daftar, ia memiliki ubin besar yang memungkinkan konten lebih kaya. Ubin yang membentuk carousel mirip dengan kartu dasar dengan gambar. Memilih item dari carousel hanya akan menghasilkan gelembung obrolan sebagai respons seperti halnya pemilih daftar.
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 ' )
)
);
Untuk memeriksa apakah pengguna memberi Anda informasi dan kemudian mengakses data, buat maksud Dialogflow dengan peristiwa actions_intent_OPTION
. Dengan asumsi Anda menamai maksudnya sebagai Get Option
, Anda bisa mendapatkan argumen sebagai berikut,
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 ;
}
}
Silakan lihat dokumentasinya di sini.
Korsel penjelajahan adalah respons yang kaya, mirip dengan respons korsel yang bergulir secara horizontal dan memungkinkan pengguna memilih ubin. Korsel penjelajahan dirancang khusus untuk konten web dengan membuka ubin yang dipilih di browser web (atau browser AMP jika semua ubin mendukung AMP). Carousel penjelajahan juga akan tetap ada di permukaan Asisten pengguna untuk penjelajahan nanti.
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 ' )
)
);
Pemenuhan tindak lanjut tidak diperlukan untuk interaksi pengguna dengan item carousel penelusuran, karena carousel menangani handoff browser.
Silakan lihat dokumentasinya di sini.
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 ' ));
Silakan lihat dokumentasinya di sini.
Respons media memungkinkan Actions Anda memutar konten audio dengan durasi pemutaran lebih lama dari batas SSML 120 detik. Komponen utama dari respon media adalah single-track card.
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 ' ]));
Silakan lihat dokumentasinya di sini.
use Dialogflow Action Questions Permission ;
$ conv -> ask ( Permission :: create ( ' To address you by name and know your location ' , [ ' NAME ' , ' DEVICE_PRECISE_LOCATION ' ]));
Untuk memeriksa apakah pengguna memberi Anda informasi dan kemudian mengakses data, buat maksud Dialogflow dengan peristiwa actions_intent_PERMISSION
. Dengan asumsi Anda memberi nama maksudnya sebagai Get Permission
, Anda bisa mendapatkan informasi sebagai berikut,
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 ' );
}
}
Silakan lihat dokumentasinya di sini.
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? ' ));
Untuk memeriksa apakah pengguna memberikan akses dan kemudian mengakses data, buat maksud Dialogflow dengan peristiwa actions_intent_DATETIME
. Dengan asumsi Anda menamai maksudnya sebagai Get Date Time
, Anda bisa mendapatkan informasi sebagai berikut,
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 ' );
}
}
Silakan lihat dokumentasinya di sini.
use Dialogflow Action Questions Place ;
$ conv -> ask ( new Place ( ' Where do you want to have lunch? ' , ' To find lunch locations ' ));
Untuk memeriksa apakah pengguna memberikan akses dan kemudian mengakses data, buat maksud Dialogflow dengan peristiwa actions_intent_PLACE
. Dengan asumsi Anda menamai maksudnya sebagai Get Place
, Anda bisa mendapatkan informasi sebagai berikut,
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 ' );
}
}
Silakan lihat dokumentasinya di sini.
use Dialogflow Action Questions Confirmation ;
$ conv -> ask ( new Confirmation ( ' Can you confirm? ' ));
Untuk memeriksa apakah pengguna mengonfirmasi atau tidak, buat maksud Dialogflow dengan peristiwa actions_intent_CONFIRMATION
. Dengan asumsi Anda memberi nama maksudnya sebagai Get Confirmation
, Anda bisa mendapatkan informasi sebagai berikut,
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 ' );
}
}
Asisten Google dapat digunakan di berbagai platform seperti perangkat seluler yang mendukung pengalaman audio dan tampilan atau perangkat Google Home yang mendukung pengalaman audio saja.
Untuk merancang dan membangun percakapan yang berfungsi dengan baik di semua platform, gunakan kemampuan permukaan untuk mengontrol dan menjangkau percakapan Anda dengan benar.
$ 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
}