ไลบรารีนี้ได้รับแรงบันดาลใจจากไดอะล็อกโฟลว์/ไดอะล็อกโฟลว์-fulfillment-nodejs
รองรับคำขอและการตอบกลับ webhook 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 ());
หรือใน Laravel
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 ' )
)
);
หากต้องการบันทึกตัวเลือกที่ผู้ใช้เลือก ให้สร้าง Intent ของ 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 ' )
)
);
หากต้องการตรวจสอบว่าผู้ใช้ให้ข้อมูลแก่คุณแล้วเข้าถึงข้อมูลหรือไม่ ให้สร้าง Intent ของ 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) ภาพหมุนการเรียกดูจะคงอยู่บนพื้นผิว Assistant ของผู้ใช้เพื่อการเรียกดูในภายหลัง
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 ' ));
โปรดดูเอกสารที่นี่
การตอบสนองของสื่อทำให้การดำเนินการของคุณเล่นเนื้อหาเสียงที่มีระยะเวลาการเล่นนานกว่า SSML ที่จำกัด 120 วินาที องค์ประกอบหลักของการตอบสนองของสื่อคือการ์ดเพลงเดี่ยว
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 ' ]));
หากต้องการตรวจสอบว่าผู้ใช้ให้ข้อมูลแก่คุณแล้วเข้าถึงข้อมูลหรือไม่ ให้สร้าง Intent ของ 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? ' ));
หากต้องการตรวจสอบว่าผู้ใช้ให้สิทธิ์เข้าถึงแล้วเข้าถึงข้อมูลหรือไม่ ให้สร้าง Intent Dialogflow ด้วยเหตุการณ์ actions_intent_DATETIME
สมมติว่าคุณตั้งชื่อ Intent เป็น 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 ' ));
หากต้องการตรวจสอบว่าผู้ใช้ให้สิทธิ์เข้าถึงแล้วเข้าถึงข้อมูลหรือไม่ ให้สร้าง Intent ของ Dialogflow ด้วยเหตุการณ์ actions_intent_PLACE
สมมติว่าคุณตั้งชื่อ Intent ว่า 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? ' ));
หากต้องการตรวจสอบว่าผู้ใช้ยืนยันหรือไม่ ให้สร้าง Intent 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 เพื่อควบคุมและกำหนดขอบเขตการสนทนาของคุณอย่างเหมาะสม
$ 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
}