├── LANGS.md ├── ko-KR ├── cover.jpg ├── _layouts │ ├── ebook │ │ ├── page.html │ │ ├── pdf_header.html │ │ └── pdf_footer.html │ └── layout.html ├── Develop │ ├── Assets │ │ ├── Images │ │ │ ├── CEK_Tutorial_Test.png │ │ │ ├── CEK_Concept_Diagram.png │ │ │ ├── CEK_Tutorial_NewIntent.png │ │ │ ├── DevConsole_Plus_Button.png │ │ │ ├── CEK_Interaction_Structure.png │ │ │ ├── CEK_Tutorial_SpeechExample.png │ │ │ ├── CEK_Tutorial_Builtin_Intent_Test.png │ │ │ ├── CEK_Tutorial_Builtin_Type_Slot_Test.png │ │ │ ├── CEK_Components_And_Operation_Structure.png │ │ │ ├── CEK_Tutorial_Builtin_Type_Slots_Add_Slot.png │ │ │ ├── CEK_Tutorial_Builtin_Type_Slots_Set_Slot.png │ │ │ ├── CEK_Tutorial_Builtin_Type_Slots_Register_Slot_Type.png │ │ │ ├── CEK_Tutorial_Builtin_Type_Slots_Sample_Utterance.png │ │ │ └── CEK_Account_Linking_Setup_Sequence_Diagram.svg │ │ └── PUMLs │ │ │ ├── CEK_Account_Linking_Setup_Sequence_Diagram.puml │ │ │ ├── CEK_Custom_Extension_Sequence_Diagram.puml │ │ │ └── CEK_Custom_Extension_Multi-turn_Sequence_Diagram.puml │ ├── Tutorials │ │ ├── BasicInformation │ │ │ └── DICE_Sample_Dialog.md │ │ ├── Introduction.md │ │ ├── Handle_Builtin_Intents.md │ │ ├── Use_Builtin_Type_Slots.md │ │ └── Build_Simple_Extension.md │ ├── Guides │ │ ├── RequiredComponents │ │ │ ├── Authorization_Server.md │ │ │ ├── Interaction_Model.md │ │ │ └── Extension_Server.md │ │ ├── BuildCustomExtension │ │ │ ├── Preparation.md │ │ │ ├── Validating_Request_Message.md │ │ │ ├── Return_Custom_Extension_Response.md │ │ │ └── Handle_Custom_Extension_Request.md │ │ ├── Build_Custom_Extension.md │ │ ├── Do_Multiturn_Dialog.md │ │ ├── Monitor_TTS_Playback_Status.md │ │ └── Link_User_Account.md │ ├── References │ │ └── HTTP_Message.md │ ├── CEK_Overview.md │ └── Examples │ │ └── Extension_Examples.md ├── DevConsole │ ├── Assets │ │ └── Images │ │ │ ├── DevConsole-Plus_Button.png │ │ │ ├── DevConsole-Test_Menu.png │ │ │ ├── DevConsole-Test_Result.png │ │ │ ├── DevConsole-Check_Button.png │ │ │ ├── DevConsole-Concept_Diagram.png │ │ │ ├── DevConsole-Remove_Extension.png │ │ │ ├── DevConsole-Cancel_Submission.png │ │ │ ├── DevConsole-Entering_CEK_Menu.png │ │ │ ├── DevConsole-Submit_Extension_1.png │ │ │ ├── DevConsole-Submit_Extension_2.png │ │ │ ├── DevConsole-Add_Custom_Intent_1.png │ │ │ ├── DevConsole-Add_Custom_Intent_2.png │ │ │ ├── DevConsole-Add_Custom_Intent_3.png │ │ │ ├── DevConsole-Add_Custom_Intent_4.png │ │ │ ├── DevConsole-Add_Custom_Intent_5.png │ │ │ ├── DevConsole-Built-in_Intent_List.png │ │ │ ├── DevConsole-Extension_LifeCycle.png │ │ │ ├── DevConsole-Add_Built-in_Slot_Type.png │ │ │ ├── DevConsole-Add_Custom_Slot_Type_1.png │ │ │ ├── DevConsole-Add_Custom_Slot_Type_2.png │ │ │ ├── DevConsole-Add_Custom_Slot_Type_3.png │ │ │ ├── DevConsole-Added_Custom_Slot_Type.png │ │ │ ├── DevConsole-Added_Interaction_Model.png │ │ │ ├── DevConsole-Build_Interaction_Model.png │ │ │ ├── DevConsole-Interaction_Model_Menu.png │ │ │ ├── DevConsole-Test_Utterance_Example.png │ │ │ ├── DevConsole-Added_Built-in_Slot_Type.png │ │ │ ├── DevConsole-Show_Submission_Feedback.png │ │ │ ├── DevConsole-Submission_Request_Message.png │ │ │ ├── DevConsole-Create_New_Custom_Extension.png │ │ │ ├── DevConsole-Custom_Extension_Policy_Menu.png │ │ │ ├── DevConsole-Extension_Submission_Process.png │ │ │ ├── DevConsole-First_Look_of_Extension_List.png │ │ │ ├── DevConsole-Interaction_Model_Dashboard.png │ │ │ ├── DevConsole-Extension_List_After_Submission.png │ │ │ ├── DevConsole-Extension_Submission_Rejected.png │ │ │ ├── DevConsole-Input_Custom_Extension_Policy.png │ │ │ ├── DevConsole-Branch_Chart_For_Extension_Update.png │ │ │ ├── DevConsole-Custom_Extension_Server_Settings.png │ │ │ ├── DevConsole-Store_UI_Example-Extension_Policy.png │ │ │ ├── DevConsole-Add_Tester_ID_For_Custom_Extension.png │ │ │ ├── DevConsole-Custom_Extension_List_After_Creation.png │ │ │ ├── DevConsole-Custom_Extension_Deployment_Info_Menu.png │ │ │ ├── DevConsole-Custom_Slot_Upload_and_Download_Button.png │ │ │ ├── DevConsole-Input_Custom_Extension_Deployment_Info.png │ │ │ ├── DevConsole-Store_UI_Example-Custom_Extension_Page.png │ │ │ ├── DevConsole-Redirect_URI_for_Extension_Accoun_Linking.png │ │ │ ├── DevConsole-Custom_Extension_Accoun_Linking_Settings_1.png │ │ │ ├── DevConsole-Custom_Extension_Accoun_Linking_Settings_2.png │ │ │ ├── DevConsole-Store_UI_Example-Custom_Extension_Store_Home.png │ │ │ ├── DevConsole-Utterance_Example_Upload_and_Download_Button.png │ │ │ └── DevConsole-Agree_Terms_of_Use_and_Collecting_Personal_Info.png │ ├── Guides │ │ ├── Remove_Custom_Extension.md │ │ ├── Update_Custom_Extension.md │ │ ├── Test_Custom_Extension.md │ │ ├── Deploy_Custom_Extension.md │ │ ├── Register_Custom_Extension.md │ │ └── Register_Interaction_Model.md │ └── ClovaDevConsole_Overview.md ├── Design │ ├── Assets │ │ └── Images │ │ │ ├── Extension_Design-Design_Interaction_Model.png │ │ │ ├── Extension_Design-Diagram_for_Utterance_Example.png │ │ │ └── Extension_Design-Interaction_Model_Analysis_Diagram.png │ └── Supported_Audio_Format.md ├── Copyright.md ├── styles │ ├── PlantUML_StyleSheet.puml │ ├── pdf.css │ └── website.css ├── README.md ├── TermsAndPolicy │ └── Terms_And_Policy.md ├── book.json ├── Glossary.md ├── SUMMARY.md └── Document_Info.md ├── styles └── website.css ├── scripts ├── remove-design.sh ├── remove-cek.sh ├── remove-cic.sh ├── remove-devcenter.sh ├── remove-clovahome.sh ├── broken-link-check.sh └── ko-KR-project-wide-update.sh ├── book.json ├── .gitignore ├── .github └── ISSUE_TEMPLATE │ └── clova-custom-extension-developer-guide-deployment.md └── README.md /LANGS.md: -------------------------------------------------------------------------------- 1 | # Languages 2 | 3 | * [ko-KR](ko-KR/) 4 | -------------------------------------------------------------------------------- /ko-KR/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/cover.jpg -------------------------------------------------------------------------------- /styles/website.css: -------------------------------------------------------------------------------- 1 | 2 | .book-langs-index .inner .languages li { 3 | float: none; 4 | width: 100%; 5 | } 6 | -------------------------------------------------------------------------------- /ko-KR/_layouts/ebook/page.html: -------------------------------------------------------------------------------- 1 | {% extends template.self %} 2 | 3 | {% block body %} 4 | {{ super() }} 5 | {% endblock %} 6 | -------------------------------------------------------------------------------- /scripts/remove-design.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | echo "Remove Design from SUMMARY.md" 4 | sed -i -e '/デザイン/d' ./SUMMARY.md 5 | sed -i -e '/\/Design\//d' ./SUMMARY.md 6 | -------------------------------------------------------------------------------- /scripts/remove-cek.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | echo "Remove CEK from SUMMARY.md" 4 | sed -i -e '/\/CEK\//d' ./SUMMARY.md 5 | sed -i -e '/Clova\ Extensions\ Kit/d' ./SUMMARY.md 6 | -------------------------------------------------------------------------------- /scripts/remove-cic.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | echo "Remove CIC from SUMMARY.md" 4 | sed -i -e '/\/CIC\//d' ./SUMMARY.md 5 | sed -i -e '/Clova\ Interface\ Connect/d' ./SUMMARY.md 6 | -------------------------------------------------------------------------------- /ko-KR/Develop/Assets/Images/CEK_Tutorial_Test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/Develop/Assets/Images/CEK_Tutorial_Test.png -------------------------------------------------------------------------------- /ko-KR/Develop/Assets/Images/CEK_Concept_Diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/Develop/Assets/Images/CEK_Concept_Diagram.png -------------------------------------------------------------------------------- /ko-KR/Develop/Assets/Images/CEK_Tutorial_NewIntent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/Develop/Assets/Images/CEK_Tutorial_NewIntent.png -------------------------------------------------------------------------------- /ko-KR/Develop/Assets/Images/DevConsole_Plus_Button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/Develop/Assets/Images/DevConsole_Plus_Button.png -------------------------------------------------------------------------------- /scripts/remove-devcenter.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | echo "Remove DevConsole from SUMMARY.md" 4 | sed -i -e '/DevConsole/d' ./SUMMARY.md 5 | sed -i -e '/Clova\ Developer\ Center/d' ./SUMMARY.md 6 | -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Plus_Button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Plus_Button.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Test_Menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Test_Menu.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Test_Result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Test_Result.png -------------------------------------------------------------------------------- /ko-KR/Develop/Assets/Images/CEK_Interaction_Structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/Develop/Assets/Images/CEK_Interaction_Structure.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Check_Button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Check_Button.png -------------------------------------------------------------------------------- /ko-KR/Develop/Assets/Images/CEK_Tutorial_SpeechExample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/Develop/Assets/Images/CEK_Tutorial_SpeechExample.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Concept_Diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Concept_Diagram.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Remove_Extension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Remove_Extension.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Cancel_Submission.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Cancel_Submission.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Entering_CEK_Menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Entering_CEK_Menu.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Submit_Extension_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Submit_Extension_1.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Submit_Extension_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Submit_Extension_2.png -------------------------------------------------------------------------------- /ko-KR/Develop/Assets/Images/CEK_Tutorial_Builtin_Intent_Test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/Develop/Assets/Images/CEK_Tutorial_Builtin_Intent_Test.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Add_Custom_Intent_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Add_Custom_Intent_1.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Add_Custom_Intent_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Add_Custom_Intent_2.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Add_Custom_Intent_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Add_Custom_Intent_3.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Add_Custom_Intent_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Add_Custom_Intent_4.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Add_Custom_Intent_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Add_Custom_Intent_5.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Built-in_Intent_List.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Built-in_Intent_List.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Extension_LifeCycle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Extension_LifeCycle.png -------------------------------------------------------------------------------- /ko-KR/Develop/Assets/Images/CEK_Tutorial_Builtin_Type_Slot_Test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/Develop/Assets/Images/CEK_Tutorial_Builtin_Type_Slot_Test.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Add_Built-in_Slot_Type.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Add_Built-in_Slot_Type.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Add_Custom_Slot_Type_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Add_Custom_Slot_Type_1.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Add_Custom_Slot_Type_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Add_Custom_Slot_Type_2.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Add_Custom_Slot_Type_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Add_Custom_Slot_Type_3.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Added_Custom_Slot_Type.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Added_Custom_Slot_Type.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Added_Interaction_Model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Added_Interaction_Model.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Build_Interaction_Model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Build_Interaction_Model.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Interaction_Model_Menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Interaction_Model_Menu.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Test_Utterance_Example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Test_Utterance_Example.png -------------------------------------------------------------------------------- /ko-KR/Design/Assets/Images/Extension_Design-Design_Interaction_Model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/Design/Assets/Images/Extension_Design-Design_Interaction_Model.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Added_Built-in_Slot_Type.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Added_Built-in_Slot_Type.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Show_Submission_Feedback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Show_Submission_Feedback.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Submission_Request_Message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Submission_Request_Message.png -------------------------------------------------------------------------------- /ko-KR/Develop/Assets/Images/CEK_Components_And_Operation_Structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/Develop/Assets/Images/CEK_Components_And_Operation_Structure.png -------------------------------------------------------------------------------- /ko-KR/Develop/Assets/Images/CEK_Tutorial_Builtin_Type_Slots_Add_Slot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/Develop/Assets/Images/CEK_Tutorial_Builtin_Type_Slots_Add_Slot.png -------------------------------------------------------------------------------- /ko-KR/Develop/Assets/Images/CEK_Tutorial_Builtin_Type_Slots_Set_Slot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/Develop/Assets/Images/CEK_Tutorial_Builtin_Type_Slots_Set_Slot.png -------------------------------------------------------------------------------- /book.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": ["-search", "-lunr", "page-toc-button", "search-plus"], 3 | "pluginsConfig": { 4 | "page-toc-button": { 5 | "maxTocDepth": 4, 6 | "minTocSize": 2 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Create_New_Custom_Extension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Create_New_Custom_Extension.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Custom_Extension_Policy_Menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Custom_Extension_Policy_Menu.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Extension_Submission_Process.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Extension_Submission_Process.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-First_Look_of_Extension_List.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-First_Look_of_Extension_List.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Interaction_Model_Dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Interaction_Model_Dashboard.png -------------------------------------------------------------------------------- /ko-KR/Design/Assets/Images/Extension_Design-Diagram_for_Utterance_Example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/Design/Assets/Images/Extension_Design-Diagram_for_Utterance_Example.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Extension_List_After_Submission.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Extension_List_After_Submission.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Extension_Submission_Rejected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Extension_Submission_Rejected.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Input_Custom_Extension_Policy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Input_Custom_Extension_Policy.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Branch_Chart_For_Extension_Update.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Branch_Chart_For_Extension_Update.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Custom_Extension_Server_Settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Custom_Extension_Server_Settings.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Store_UI_Example-Extension_Policy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Store_UI_Example-Extension_Policy.png -------------------------------------------------------------------------------- /ko-KR/Design/Assets/Images/Extension_Design-Interaction_Model_Analysis_Diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/Design/Assets/Images/Extension_Design-Interaction_Model_Analysis_Diagram.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Add_Tester_ID_For_Custom_Extension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Add_Tester_ID_For_Custom_Extension.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Custom_Extension_List_After_Creation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Custom_Extension_List_After_Creation.png -------------------------------------------------------------------------------- /ko-KR/Develop/Assets/Images/CEK_Tutorial_Builtin_Type_Slots_Register_Slot_Type.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/Develop/Assets/Images/CEK_Tutorial_Builtin_Type_Slots_Register_Slot_Type.png -------------------------------------------------------------------------------- /ko-KR/Develop/Assets/Images/CEK_Tutorial_Builtin_Type_Slots_Sample_Utterance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/Develop/Assets/Images/CEK_Tutorial_Builtin_Type_Slots_Sample_Utterance.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Custom_Extension_Deployment_Info_Menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Custom_Extension_Deployment_Info_Menu.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Custom_Slot_Upload_and_Download_Button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Custom_Slot_Upload_and_Download_Button.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Input_Custom_Extension_Deployment_Info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Input_Custom_Extension_Deployment_Info.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Store_UI_Example-Custom_Extension_Page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Store_UI_Example-Custom_Extension_Page.png -------------------------------------------------------------------------------- /scripts/remove-clovahome.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | echo "Remove ClovaHome from SUMMARY.md" 4 | sed -i -e '/Home/d' ja-JP/SUMMARY.md 5 | echo "Remove ClovaHome related contents." 6 | grep -rl . -e '^' -e '^tags\:.*ClovaHome.*' 7 | -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Redirect_URI_for_Extension_Accoun_Linking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Redirect_URI_for_Extension_Accoun_Linking.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Custom_Extension_Accoun_Linking_Settings_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Custom_Extension_Accoun_Linking_Settings_1.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Custom_Extension_Accoun_Linking_Settings_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Custom_Extension_Accoun_Linking_Settings_2.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Store_UI_Example-Custom_Extension_Store_Home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Store_UI_Example-Custom_Extension_Store_Home.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Utterance_Example_Upload_and_Download_Button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Utterance_Example_Upload_and_Download_Button.png -------------------------------------------------------------------------------- /ko-KR/DevConsole/Assets/Images/DevConsole-Agree_Terms_of_Use_and_Collecting_Personal_Info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/naver/clova-custom-extension-developer-guide/document/ko-KR/DevConsole/Assets/Images/DevConsole-Agree_Terms_of_Use_and_Collecting_Personal_Info.png -------------------------------------------------------------------------------- /ko-KR/_layouts/ebook/pdf_header.html: -------------------------------------------------------------------------------- 1 | {% extends "./page.html" %} 2 | 3 | {% block body %} 4 |
{{ page.title }}  {{ book.DocMeta.ClassifiedInfo }}
5 | {% endblock %} 6 | -------------------------------------------------------------------------------- /ko-KR/Develop/Tutorials/BasicInformation/DICE_Sample_Dialog.md: -------------------------------------------------------------------------------- 1 | >

"클로바, 샘플 주사위에 주사위 굴려달라고 해."

2 | >

"주사위를 1 개 던집니다. 결과는 5입니다."

3 | >

"클로바, 샘플 주사위에서 주사위 2 개 던져줘."

4 | >

"주사위를 2 개 던집니다. 결과는 2, 5이며 합은 7입니다."

5 | -------------------------------------------------------------------------------- /ko-KR/Develop/Guides/RequiredComponents/Authorization_Server.md: -------------------------------------------------------------------------------- 1 | * **인증 서버** 2 | 3 | 음악, 쇼핑, 금융 서비스와 같이 사용자 계정 인증이 필요한 외부 서비스를 제공하는 custom extension이나 CLOVA Home extension을 만든다면 사용자 계정을 연결해야 합니다. 사용자 계정 연결을 위해서 반드시 인증 서버를 구축해야 합니다. 자세한 내용은 [사용자 계정 연결하기](/Develop/Guides/Link_User_Account.md)를 참조합니다. 4 | -------------------------------------------------------------------------------- /ko-KR/_layouts/ebook/pdf_footer.html: -------------------------------------------------------------------------------- 1 | {% extends "./page.html" %} 2 | 3 | {% block body %} 4 | 5 | {% endblock %} 6 | -------------------------------------------------------------------------------- /ko-KR/Develop/Guides/BuildCustomExtension/Preparation.md: -------------------------------------------------------------------------------- 1 | ## 사전 준비사항 {#Preparation} 2 | Custom extension 개발자는 다음을 미리 준비해야 합니다. 3 | 4 | {% include "/Develop/Guides/RequiredComponents/Interaction_Model.md" %} 5 | 6 | {% include "/Develop/Guides/RequiredComponents/Extension_Server.md" %} 7 | 8 | {% include "/Develop/Guides/RequiredComponents/Authorization_Server.md" %} 9 | -------------------------------------------------------------------------------- /ko-KR/Develop/Guides/RequiredComponents/Interaction_Model.md: -------------------------------------------------------------------------------- 1 | * **Interaction 모델** 2 | 3 | CLOVA developer console에 등록할 custom extension의 interaction 모델입니다. 사용자와 CLOVA의 대화 시나리오 같은 것이라고 볼 수 있는 interaction 모델은, 사용자가 질문할 만한 문장들을 정의하고 각 문장이 어떤 의도를 나타내는지와 어떤 정보를 가지고 있는지를 설정합니다. 4 | 5 | Interaction 모델을 정의하는 상세한 방법은 [Interaction 모델 정의](/Design/Design_Custom_Extension.md#DefineInteractionModel)에서 볼 수 있습니다. 6 | -------------------------------------------------------------------------------- /ko-KR/Develop/Guides/RequiredComponents/Extension_Server.md: -------------------------------------------------------------------------------- 1 | * **Extension 서버** 2 | 3 | Extension이 실행되는 웹 서버로서 CLOVA developer console에 등록됩니다. CLOVA가 사용자의 발화를 분석한 결과나 기본적으로 제공하는 의도를 전달했을 때 extension 서버는 이를 처리하여 알맞은 응답을 반환해야 합니다. Extension 서버는 요청을 처리할 때 **HTTPS 프로토콜**을 사용해야 합니다. 4 | 5 |
6 |

Note!

7 |

테스트 단계에서는 HTTP도 가능하나 정식 서비스를 위해서는 HTTPS여야 합니다. Extension 서버는 HTTP일 때 80 번 포트를 HTTPS일 때 443 번 포트를 사용해야 합니다.

8 |
9 | -------------------------------------------------------------------------------- /scripts/broken-link-check.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | npm install blc 4 | gitbook serve & 5 | gitbook_serve_pid=$! 6 | 7 | for i in {0..9} 8 | do 9 | sleep 10 10 | HTTP_RESPONSE=`curl -s http://localhost:4000 -o /dev/null -w "%{http_code}\n"` 11 | if [ ${HTTP_RESPONSE} -eq 200 ]; then 12 | echo "Server started" 13 | break 14 | fi 15 | done 16 | 17 | if [ ${HTTP_RESPONSE} -eq 200 ]; then 18 | echo "Start broken link check" 19 | date > broken-link-check.log 20 | blc http://localhost:4000/ -roe >> broken-link-check.log 21 | else 22 | echo "Can't start broken link check" 23 | fi 24 | 25 | kill $gitbook_serve_pid 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # Compiled binary addons (http://nodejs.org/api/addons.html) 20 | build/Release 21 | 22 | # Dependency directory 23 | # Deployed apps should consider commenting this line out: 24 | # see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git 25 | node_modules 26 | 27 | book.pdf 28 | book.epub 29 | book.mobi 30 | _book 31 | book/ 32 | 33 | .DS_Store 34 | 35 | package-lock.json 36 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/clova-custom-extension-developer-guide-deployment.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Clova Custom Extension Developer Guide deployment 3 | about: Template for announcing document deployment 4 | title: Deploy Clova Custom Extension Developer Guide 2000-00-00 5 | labels: Deployment 6 | assignees: jeongil-kang 7 | 8 | --- 9 | 10 | To: @okgosu-exp, @lee-tirano , @my-jeong , @ykkim-kim , @insil-lee , @leejungho84 , @junghwa-lim , @soonikkim , @j-h-lee , @j-a , @chris-choi , @ljeun-lee , @youngjin-yoon, @jm-lee 11 | 12 | Clova Custom Extension Developer Guide v2000-00-00을(를) 배포합니다. 13 | - 대상 파트너 : 파트너 및 일반 개발자 14 | - 문서 형태 : Web 15 | 16 | ## 업데이트 사항 17 | - Update here 18 | 19 | ## 참고 사항 20 | - XX님이 기술 리뷰함. 21 | 22 | ## Download 23 | 24 | 한국 비즈니스용 영문 문서 25 | - []() 26 | -------------------------------------------------------------------------------- /ko-KR/Develop/Tutorials/Introduction.md: -------------------------------------------------------------------------------- 1 | # 튜토리얼 2 | 여러분의 서비스를 CLOVA와 연동하려면 extension을 개발해야 합니다. 이 튜토리얼은 [주사위 놀이](/Develop/Examples/Extension_Examples.md#DiceDrawer) 예제를 통해 extension을 개발하는 기본적인 과정을 순서대로 짚어보면서 CLOVA를 처음 접하는 개발자가 개발 방법을 익힐 수 있도록 도와줍니다. 3 | 4 | 주사위 놀이 extension은 이름처럼 주사위를 굴려 그 결과를 알려주는 extension 입니다. 5 | 여기서는 실제로 서비스되고 있는 "주사위 놀이"와 중복되지 않도록 "샘플 주사위"라는 이름으로 만듭니다. 6 | 7 | 사용자는 다음과 같이 샘플 주사위를 사용할 수 있습니다. 8 | 9 | {% include "/Develop/Tutorials/BasicInformation/DICE_Sample_Dialog.md" %} 10 | 11 | 이 튜토리얼을 따라하면 다음과 같은 것을 익힐 수 있습니다. 12 | * [첫 번째 튜토리얼: 기초적인 extension 만들고 테스트하기](/Develop/Tutorials/Build_Simple_Extension.md) 13 | * [두 번째 튜토리얼: 예, 아니오 같은 기본적인 의사 표현 처리하기](/Develop/Tutorials/Handle_Builtin_Intents.md) 14 | * [세 번째 튜토리얼: 사용자가 입력한 정보 활용하기](/Develop/Tutorials/Use_Builtin_Type_Slots.md) 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 소개 2 | 3 | 이 저장소는 [NAVER 개발자 센터](https://developers.naver.com/main/)에 [Clova Custom Extension Developer Guide](https://developers.naver.com/docs/clova/custom_ext/) 문서를 배포하기 위해 생성되었습니다. 4 | 5 | 문서에 대한 피드백은 [NAVER 개발자 센터 포럼](http://forum.developers.naver.com/)을 이용하거나 이 저장소에 대한 [이슈](https://github.com/naver/clova-custom-extension-developer-guide/issues)를 등록해주시면 됩니다. 6 | 7 | ## 저작권 8 | 9 | ⓒ NAVER Corporation All Rights Reserved. 10 | 11 | 이 문서는 NAVER㈜의 지적 자산이므로 NAVER㈜의 승인 없이 이 문서를 다른 용도로 임의 변경하여 사용할 수 없습니다. 12 | 이 문서는 정보제공의 목적으로만 제공됩니다. NAVER㈜는 이 문서에 수록된 정보의 완전성과 정확성을 검증하기 위해 노력하였으나, 발생할 수 있는 내용상의 오류나 누락에 대해서는 책임지지 않습니다. 따라서 이 문서의 사용이나 사용 결과에 따른 책임은 전적으로 사용자에게 있으며, NAVER㈜는 이에 대해 명시적 혹은 묵시적으로 어떠한 보증도 하지 않습니다. 관련 URL 정보를 포함하여 이 문서에서 언급한 특정 소프트웨어 상품이나 제품은 해당 소유자의 저작권법을 따르며, 해당 저작권법을 준수하는 것은 사용자의 책임입니다. -------------------------------------------------------------------------------- /ko-KR/Copyright.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | # 저작권 6 | 7 | Copyright ⓒ {{book.DocMeta.ReleaseYear}}-present-present. {{ book.DocMeta.DocOwner }} Corporation All Rights Reserved. 8 | 9 | 이 문서는 {{ book.DocMeta.DocOwner }}㈜의 지적 자산이므로 {{ book.DocMeta.DocOwner }}㈜의 승인 없이 이 문서를 다른 용도로 임의 변경하여 사용할 수 없습니다. 10 | 이 문서는 정보제공의 목적으로만 제공됩니다. {{ book.DocMeta.DocOwner }}㈜는 이 문서에 수록된 정보의 완전성과 정확성을 검증하기 위해 노력하였으나, 발생할 수 있는 내용상의 오류나 누락에 대해서는 책임지지 않습니다. 따라서 이 문서의 사용이나 사용 결과에 따른 책임은 전적으로 사용자에게 있으며, {{ book.DocMeta.DocOwner }}㈜는 이에 대해 명시적 혹은 묵시적으로 어떠한 보증도 하지 않습니다. 관련 URI 정보를 포함하여 이 문서에서 언급한 특정 소프트웨어 상품이나 제품은 해당 소유자의 저작권법을 따르며, 해당 저작권법을 준수하는 것은 사용자의 책임입니다. 11 | 12 | {{ book.DocMeta.DocOwner }}㈜는 이 문서의 내용을 예고 없이 변경할 수 있습니다. 13 | 14 | 15 | -------------------------------------------------------------------------------- /ko-KR/Develop/Guides/Build_Custom_Extension.md: -------------------------------------------------------------------------------- 1 | # Custom extension 만들기 2 | 3 | Custom extension이란 CLOVA가 기본으로 제공하고 있는 기능이나 서비스가 아닌 개발자가 임의로 확장한 기능이나 외부 서비스를 제공해주는 extension입니다. 예를 들면, 웹 검색, 뉴스 클리핑과 같은 서비스 뿐만 사용자 계정의 인증이 필요한 음악, 쇼핑, 금융 서비스와 같은 외부 서비스를 제공하는 extension입니다. Custom extension은 CEK로부터 분석된 사용자의 발화 정보를 전달받게 되며, 이에 상응하는 내용을 처리하고 그 서비스 처리 결과를 반환해야 합니다. 4 | 5 | 이 절에서는 Custom extension을 만들기 위해 사전에 준비해야 할 것이 무엇이 있고 CEK와 어떤 메시지를 주고 받으면서 어떻게 동작을 수행해야 하는지 다음과 같은 내용을 설명합니다. 6 | 7 | * [사전 준비사항](#Preparation) 8 | * [Custom extension 요청 처리하기](#HandleCustomExtensionRequest) 9 | * [`LaunchRequest` 요청 처리](#HandleLaunchRequest) 10 | * [`IntentRequest` 요청 처리](#HandleIntentRequest) 11 | * [`SessionEndedRequest` 요청 처리](#HandleSessionEndedRequest) 12 | * [요청 메시지 검증](#RequestMessageValidation) 13 | * [Custom extension 응답 반환하기](#ReturnCustomExtensionResponse) 14 | 15 | {% include "/Develop/Guides/BuildCustomExtension/Preparation.md" %} 16 | 17 | {% include "/Develop/Guides/BuildCustomExtension/Handle_Custom_Extension_Request.md" %} 18 | 19 | {% include "/Develop/Guides/BuildCustomExtension/Validating_Request_Message.md" %} 20 | 21 | {% include "/Develop/Guides/BuildCustomExtension/Return_Custom_Extension_Response.md" %} 22 | -------------------------------------------------------------------------------- /ko-KR/DevConsole/Guides/Remove_Custom_Extension.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | # Custom extension 중지 및 삭제하기 6 | 7 | 심사 요청하기 이전 단계의 extension이라면 [기본 정보를 입력하는 메뉴](/DevConsole/Guides/Register_Custom_Extension.md#InputExtensionInfo)에서 해당 extension을 삭제할 수 있습니다. 8 | 9 | ![DevConsole-Remove_Extension](/DevConsole/Assets/Images/DevConsole-Remove_Extension.png) 10 | 11 | 다만, 다음과 같은 상태의 extension은 삭제할 수 없습니다. 12 | 13 | * 심사 중인 extension 14 | * 서비스 중인 extension 15 | 16 | 심사 중인 extension은 언제든지 심사를 취소하고 삭제할 수 있습니다. 17 | 18 | ![DevConsole-Cancel_Submission](/DevConsole/Assets/Images/DevConsole-Cancel_Submission.png) 19 | 20 | 만약, extension이 심사를 통과하여 서비스 중인 상태라면 서비스를 중지한 후에 extension을 삭제할 수 있습니다. 서비스를 중지하면 extension의 상태가 **{{ book.DevConsole.cek_status_dev }}**인 상태로 변경됩니다. 21 | 22 |
23 |

Note!

24 |

서비스를 중지할 때 CLOVA 운영팀의 확인이 필요합니다. 따라서, extension을 중지하려면 {{ book.ServiceEnv.ExtensionAdminEmail }}로 연락합니다.

25 |
26 | 27 | 28 | -------------------------------------------------------------------------------- /ko-KR/styles/PlantUML_StyleSheet.puml: -------------------------------------------------------------------------------- 1 | scale max 880 width 2 | skinparam sequenceMessageAlign center 3 | skinparam shadowing false 4 | skinparam roundcorner 10 5 | skinparam padding 10 6 | skinparam defaultFontSize 12 7 | skinparam defaultFontName "Noto Sans CJK KR" 8 | 9 | skinparam note { 10 | BackgroundColor #9EA0CA 11 | BorderColor #ffffff 12 | FontColor #ffffff 13 | FontSize 14 14 | FontStyle bold 15 | } 16 | 17 | skinparam sequence { 18 | ArrowColor #000000 19 | ActorBorderColor #000000 20 | ActorFontStyle Bolder 21 | 22 | 23 | LifeLineBorderColor #000000 24 | LifeLineBackgroundColor transparent 25 | ParticipantBorderColor transparent 26 | ParticipantFontSize 14 27 | ParticipantFontColor #ffffff 28 | ParticipantFontStyle bold 29 | 30 | BoxBorderColor #000000 31 | BoxFontColor #ffffff 32 | BoxFontSize 14 33 | BoxFontStyle bold 34 | } 35 | hide footbox 36 | 37 | skinparam activity { 38 | BackgroundColor #9EA0CA 39 | BarColor #ffffff 40 | BorderColor #ffffff 41 | DiamondBackgroundColor #05D686 42 | DiamondBorderColor #ffffff 43 | DiamondFontColor #ffffff 44 | DiamondFontSize 14 45 | DiamondFontStyle bold 46 | FontColor #ffffff 47 | FontSize 14 48 | FontStyle bold 49 | } -------------------------------------------------------------------------------- /ko-KR/_layouts/layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{ config.title }} 5 | 6 | 7 | 8 | 9 | 10 | {% if config.author %}{% endif %} 11 | {% if config.isbn %}{% endif %} 12 | {% block style %} 13 | {% for resource in plugins.resources.css %} 14 | {% if resource.url %} 15 | 16 | {% else %} 17 | 18 | {% endif %} 19 | {% endfor %} 20 | {% endblock %} 21 | {% block head %}{% endblock %} 22 | 23 | 24 | {% block body %}{% endblock %} 25 | {% block javascript %}{% endblock %} 26 | 27 | 28 | -------------------------------------------------------------------------------- /ko-KR/Develop/Assets/PUMLs/CEK_Account_Linking_Setup_Sequence_Diagram.puml: -------------------------------------------------------------------------------- 1 | !include ../../../styles/PlantUML_StyleSheet.puml 2 | 3 | actor "사용자" as user 4 | participant "클라이언트 앱\nor 페어링 앱" as app #9EA0CA 5 | participant CEK as cek #05D686 6 | actor "개발자" as dev #9EA0CA 7 | participant Extension as ext #9EA0CA 8 | participant "인증서버" as auth #9EA0CA 9 | 10 | dev ->> cek: 인증 관련 정보 사전 등록(OAuth 2.0)\l- Authorization URI\l- Client ID\l- Client Secret\l- Redirect URI\l- Access Token URI\l- ... 11 | 12 | activate cek 13 | deactivate cek 14 | 15 | user ->> app: Extension 활성화 16 | 17 | activate app 18 | app ->> cek: Authorization URI 요청 19 | 20 | activate cek 21 | cek -->> app: Authorization URI 반환 22 | deactivate cek 23 | 24 | app ->> auth: 로그인 페이지 요청(Authorization URI) 25 | 26 | activate auth 27 | auth -->> app: 로그인 페이지 반환 28 | deactivate auth 29 | 30 | app -> app: 로그인 페이지 표시 31 | user ->> app: 계정 인증(로그인) 32 | app ->> auth: 인증 요청 33 | 34 | activate auth 35 | auth -->> app: Authorization code와 함께 redirect URI 전달 36 | deactivate auth 37 | 38 | app ->> cek: Authorization code 반환 39 | deactivate app 40 | 41 | activate cek 42 | cek ->> auth: Access Token URI로 authorization code 파라미터로 전달 43 | activate auth 44 | auth -->> cek: access token 반환 45 | deactivate auth 46 | 47 | cek -> cek: 사용자 계정 정보에\naccess token 저장 48 | cek ->> ext: Access token과 함께 사용자 요청 전달 49 | deactivate cek 50 | activate ext 51 | -------------------------------------------------------------------------------- /ko-KR/Develop/References/HTTP_Message.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | # HTTP 메시지 6 | CEK와 extension이 통신할 때 HTTP/1.1 프로토콜을 사용하며, 기본적인 HTTP 요청과 HTTP 응답을 주고 받습니다. CEK와 extension이 서로 통신할 때 HTTP 메시지 본문(body)에는 JSON 포맷의 메시지가 포함되어 있습니다. 여기에서는 CEK와 extension 사이에서 주고 받는 HTTP 메시지가 어떻게 구성되는지 설명합니다. 7 | 8 | * [HTTP 헤더](#HTTPHeader) 9 | * [HTTP 본문](#HTTPBody) 10 | 11 | ## HTTP 헤더 {#HTTPHeader} 12 | CEK가 extension으로 분석된 사용자의 발화 정보를 보낼 때 HTTP 요청을 사용합니다. 이때 HTTP 요청 헤더는 다음과 같이 구성됩니다. 13 | 14 | {% raw %} 15 | 16 | ``` 17 | POST /APIpath HTTP/1.1 18 | Host: your.extension.endpoint 19 | Content-Type: application/json;charset-UTF-8 20 | Accept: application/json 21 | Accept-Charset: utf-8 22 | SignatureCEK: {{ SignatureCEK }} 23 | ``` 24 | {% endraw %} 25 | 26 | * HTTP/1.1 버전으로 HTTPS 통신을 수행하며, method로 POST 방식을 사용합니다. 27 | * Host와 요청 대상 path는 extension 개발자가 미리 정의해 둔 URI로 채워집니다. 28 | * 본문의 데이터 형식은 JSON 형식으로 UTF-8 인코딩으로 되어 있습니다. 29 | * `SignatureCEK` 필드와 RSA 공개 키를 이용하여 CLOVA로부터 전송된 요청인지 검증할 수 있습니다. 30 | 31 | 이와 반대로 extension이 CLOVA로 처리 결과를 보낼 때 HTTP 응답을 사용합니다. 이때 HTTP 응답 헤더는 다음과 같이 설정하면 됩니다. 32 | {% raw %} 33 | ``` 34 | HTTP/1.1 200 OK 35 | Content-Type: application/json;charset-UTF-8 36 | ``` 37 | {% endraw %} 38 | * CEK가 보낸 HTTP 요청에 대한 응답으로 처리 결과를 전달합니다. 39 | * 본문의 데이터 형식은 JSON 포맷으로 되어 있으며, UTF-8 인코딩을 사용합니다. 40 | 41 | ## HTTP 본문 {#HTTPBody} 42 | HTTP 요청 메시지와 응답 메시지의 본문은 JSON 포맷이며, 분석된 사용자의 발화 정보나 extension의 처리 결과가 담긴 정보입니다. 각 메시지의 구성은 어떤 종류의 extension을 사용하느냐에 따라 달라집니다. 메시지의 구성에 대한 자세한 정보는 [custom extension 메시지](#CustomExtMessage)를 참조합니다. 43 | 44 | 45 | -------------------------------------------------------------------------------- /ko-KR/Develop/Assets/PUMLs/CEK_Custom_Extension_Sequence_Diagram.puml: -------------------------------------------------------------------------------- 1 | !include ../../../styles/PlantUML_StyleSheet.puml 2 | 3 | participant "CLOVA 앱\nor 기기" as client #9EA0CA 4 | participant "CLOVA" as clova #05D686 5 | participant "날씨 알리미\nCustom Extension" as ext #9EA0CA 6 | 7 | group Session 8 | [->> client: 사용자 입력 수신 9 | activate client 10 | client ->> clova: "날씨 알리미에게 오늘 날씨 물어봐 줘" 11 | 12 | activate clova 13 | clova -> clova: 사용자 발화 분석\n(Interaction 모델) 14 | clova ->> ext: IntentRequest 전송(HTTP Request) 15 | 16 | activate ext 17 | ext -> ext: 사용자 요청 처리 18 | ext -->> clova: 응답 메시지 전달(HTTP Response) 19 | deactivate ext 20 | 21 | clova -->> client: "오늘 날씨는 맑아요" 22 | deactivate clova 23 | 24 | deactivate client 25 | end 26 | 27 | group Session 28 | [->> client: 사용자 입력 수신 29 | activate client 30 | client ->> clova: "날씨 알리미에게 내일 날씨 물어봐 줘" 31 | 32 | activate clova 33 | clova -> clova: 사용자 발화 분석\n(Interaction 모델) 34 | clova ->> ext: IntentRequest 전송(HTTP Request) 35 | 36 | activate ext 37 | ext -> ext: 사용자 요청 처리 38 | ext -->> clova: 응답 메시지 전달(HTTP Response) 39 | deactivate ext 40 | 41 | clova -->> client: "내일 날씨는 흐려요" 42 | deactivate clova 43 | 44 | deactivate client 45 | end 46 | 47 | group Session 48 | [->> client: 사용자 입력 수신 49 | activate client 50 | client ->> clova: "날씨 알리미에게 서울 날씨 물어봐 줘" 51 | 52 | activate clova 53 | clova -> clova: 사용자 발화 분석\n(Interaction 모델) 54 | clova ->> ext: IntentRequest 전송(HTTP Request) 55 | 56 | activate ext 57 | ext -> ext: 사용자 요청 처리 58 | ext -->> clova: 응답 메시지 전달(HTTP Response) 59 | deactivate ext 60 | 61 | clova -->> client: "서울 날씨는 맑아요" 62 | deactivate clova 63 | 64 | deactivate client 65 | end 66 | -------------------------------------------------------------------------------- /ko-KR/Design/Supported_Audio_Format.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 플랫폼 지원 오디오 포맷 4 | 5 | Custom extension을 통해 오디오 콘텐츠를 제공한다면 반드시 CLOVA가 지원하는 오디오 압축 포맷으로 음원을 제공해야 합니다. 6 | 7 | 8 | 9 | CLOVA가 지원하는 오디오 압축 포맷(codec)은 다음과 같습니다. 10 | 11 | | 오디오 압축 포맷 | 라이선스 비용 | 12 | |----------------------------------|-----------| 13 | | MPEG-1 or MPEG-2 Audio Layer III | 무료 | 14 | 15 | CLOVA가 지원하는 파일 확장자와 MIME 타입은 다음과 같습니다. 16 | 17 | | 파일확장자 | MIME 타입 | 비고 | 18 | |-------------|-------------------------------|-------------------------------| 19 | | MP3 | audio/mpeg | | 20 | | M3U8 | application/vnd.apple.mpegurl | HTTP Live Streaming 사용 | 21 | 22 | 23 | 24 |
25 |

Tip!

26 |

CLOVA가 지원하는 오디오 압축 포맷은 더 늘어날 수 있습니다.

27 |
28 | 29 |
30 |

Warning!

31 |

CLOVA가 지원하지 않는 오디오 압축 포맷으로 음원을 제공하면 클라이언트가 정상적으로 음원을 재생하지 못할 수 있습니다.

32 |
33 | 34 | 제공하려는 오디오 콘텐츠 타입에 따라 다음과 같은 음질 관련 속성과 음량(loudness)을 따르도록 권고합니다. 35 | 36 | | 오디오 콘텐츠 타입 | 샘플링 주파수, 비트 심도, 채널 | 음량(loudness) | 비고 | 37 | |-----------------------|-------------------------|--------------- |----------------------------------------| 38 | | 음악 | 44100Hz, 16bit, stereo | -10(±1) LUFS | 비트 박스 형태의 음악은 -17(±1) LUFS로 맞춥니다. | 39 | | 음향효과 | 44100Hz, 16bit, stereo | -18(±1) LUFS | | 40 | | 오디오 북 | 44100Hz, 16bit, stereo | -12(±1) LUFS | | 41 | | 앰비언트 장르 음악이나 소리 | 44100Hz, 16bit, stereo | -25(±1) LUFS | 파도 소리, 빗소리와 같은 형태의 오디오 콘텐츠이며, 각 콘텐츠의 특성에 따라 적절히 음량을 조절해야 합니다. | 42 | -------------------------------------------------------------------------------- /scripts/ko-KR-project-wide-update.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | echo "Clova -> CLOVA" 4 | egrep -lRZ '([^/|^_|^`]|^)(Clova)([^/|^_|^\.|^"|^`|^;])' ./ko-KR | xargs -0 sed -i '' -e 's#\([^/_`]\)\(Clova\)\([^/_\."`;]\)#\1CLOVA\3#g' 5 | 6 | egrep -lRZ '^(Clova)([^/|^_|^\.|^"|^`|^;])' ./ko-KR | xargs -0 sed -i '' -e 's#^\(Clova\)\([^/_\."`;]\)#CLOVA\2#g' 7 | 8 | egrep -lRZ 'participant\s"Clova' ./ko-KR | xargs -0 sed -i '' -e 's#participant "Clova#participant "CLOVA#g' 9 | 10 | egrep -lRZ '\[CLOVA\]\(\/Develop\/References\/MessageInterfaces\/Clova\.md\)' ./ko-KR | xargs -0 sed -i '' -e 's#\[CLOVA\](/Develop/References/MessageInterfaces/Clova\.md)#[Clova](/Develop/References/MessageInterfaces/Clova.md)#g' 11 | 12 | egrep -lRZ '(CLOVA\s)(인터페이스|네임스페이스)' ./ko-KR | xargs -0 sed -i '' -e 's#CLOVA 인터페이스#Clova 인터페이스#g' -e 's#CLOVA 네임스페이스#Clova 네임스페이스#g' 13 | 14 | egrep -lRZ 'Hi,\smy\sname\sis\sClova' ./ko-KR | xargs -0 sed -i '' -e 's#Hi, my name is Clova#Hi, my name is CLOVA#g' 15 | 16 | egrep -lRZ '("CLOVA)(Home|Skill)(")' ./ko-KR | xargs -0 sed -i '' -e 's#"CLOVAHome"#"ClovaHome"#g' -e 's#\"CLOVASkill"#"ClovaSkill"#g' 17 | 18 | egrep -lRZ 'X-CLOVA-Device-Tags' ./ko-KR | xargs -0 sed -i '' -e 's#X-CLOVA-Device-Tags#X-Clova-Device-Tags#g' 19 | 20 | egrep -lRZ 'X-CLOVA-Extension-' ./ko-KR | xargs -0 sed -i '' -e 's#X-CLOVA-Extension-#X-Clova-Extension-#g' 21 | 22 | echo "에게 -> 에" 23 | 24 | egrep -lRZ '(Clova|CLOVA|Clova\s앱|CLOVA\s앱|클라이언트\([^)]*\)|클라이언트|CIC|CEK|[E|e]xtension|기기|대상)에게' ./ko-KR | xargs -0 sed -i '' -e 's#\Clova에게#CLOVA에#g' -e 's#CLOVA에게#CLOVA에#g' -e 's#Clova 앱에게#CLOVA 앱에#g' -e 's#CLOVA 앱에게#CLOVA 앱에#g' -e 's#클라이언트에게#클라이언트에#g' -e 's#CIC에게#CIC에#g' -e 's#CEK에게#CEK에#g' -e 's#\([Ee]xtension\)에게#\1에#g' -e 's#대상에게#대상에#g' -e 's#기기에게#기기에#g' 25 | 26 | egrep -lRZ '(사용자|유저|개발자|담당자|운영자)(에)(\s)' ./ko-KR | xargs -0 sed -i '' -e 's#사용자에 #사용자에게 #g' -e 's#유저에 #유저에게 #g' -e 's#개발자에 #개발자에게 #g' -e 's#담당자에 #담당자에게 #g' -e 's#운영자에 #운영자에게 #g' 27 | 28 | egrep -lRZ '에게\s의해' ./ko-KR | xargs -0 sed -i '' -e 's#에게 의해#에 의해#g' -------------------------------------------------------------------------------- /ko-KR/DevConsole/Guides/Update_Custom_Extension.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | # Custom extension 업데이트하기 6 | 7 | Extension이 심사를 통과하여 extension 배포가 승인되면 extension은 **{{ book.DevConsole.cek_status_prd }}**인 상태가 됩니다. 이때, CLOVA developer console은 extension을 다음과 같이 두 가지 버전으로 만듭니다. 8 | 9 | * **{{ book.DevConsole.cek_version_service }}** 버전: 현재 **{{ book.DevConsole.cek_status_prd }}**인 extension의 원본 정보를 가진 버전이며, extension에 대한 정보를 조회만할 수 있습니다. 10 | * **{{ book.DevConsole.cek_version_test }}** 버전: 배포된 extension의 원본 정보를 복사하여 만든 버전이며, extension을 업데이트할 때 사용됩니다. 11 | 12 | ![DevConsole-Extension_List_After_Submission](/DevConsole/Assets/Images/DevConsole-Extension_List_After_Submission.png) 13 | 14 | **{{ book.DevConsole.cek_version_service }}** 버전의 extension 정보는 현재 서비스 중인 내용 반영하고 있으며 더 이상 수정할 수 없습니다. 따라서 복사된 **{{ book.DevConsole.cek_version_test }}** 버전을 이용하여 extension을 업데이트해야 합니다. extension에 다음과 같은 업데이트 사항이 생기면 이를 **{{ book.DevConsole.cek_version_test }}** 버전 extension 반영한 후 심사를 다시 신청하면 됩니다. 15 | 16 | 다음과 같은 것이 업데이트될 수 있습니다. 17 | 18 | * [기본 정보](/DevConsole/Guides/Register_Custom_Extension.md#InputExtensionInfo) 19 | * [서버 연동 정보](/DevConsole/Guides/Register_Custom_Extension.md#SetServerConnection) 20 | * [Interaction 모델](/DevConsole/Guides/Register_Interaction_Model.md) 21 | * [배포 정보](/DevConsole/Guides/Deploy_Custom_Extension.md) 22 | 23 | 심사를 통과하면 **{{ book.DevConsole.cek_version_service }}** 버전에 업데이트 사항이 반영된 **{{ book.DevConsole.cek_version_test }}** 버전으로 교체됩니다. 그리고 다시 **{{ book.DevConsole.cek_version_service }}** 버전의 extension 정보를 복사하여 새로운 **{{ book.DevConsole.cek_version_test }}** 버전의 extension 정보를 생성합니다. 24 | 25 | 다음 그림은 CLOVA developer console에서 extension이 업데이트되는 구조를 보여줍니다. 26 | 27 | ![DevConsole-Branch_Chart_For_Extension_Update](/DevConsole/Assets/Images/DevConsole-Branch_Chart_For_Extension_Update.png) 28 | 29 | 30 | -------------------------------------------------------------------------------- /ko-KR/Develop/CEK_Overview.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | # CEK 개요 6 | 이 문서는 CLOVA Extensions Kit(이하 CEK)에 대해 자세히 설명합니다. 이 문서를 통해 CEK가 무엇이고 어떻게 동작하는지 파악할 수 있으며, CEK와 관련된 가이드나 레퍼런스를 제공합니다. 7 | 8 | ## CEK란? {#WhatisCEK} 9 | CEK는 CLOVA와 CLOVA extension(이하 extension) 사이의 커뮤니케이션을 지원하는 플랫폼으로 extension을 개발 및 배포할 때 필요한 도구와 인터페이스를 제공합니다. 음악, 쇼핑, 금융 같은 외부 서비스(3rd party service)나 집 안 IoT 기기의 원격 제어와 같이 사용자가 CLOVA를 통해 더 많은 서비스와 기능을 경험할 수 있도록 CLOVA에 확장된 기능을 제공하는 애플리케이션입니다. 10 | 11 | ![CEK_Concept_Diagram](/Develop/Assets/Images/CEK_Concept_Diagram.png) 12 | 13 | ## CEK 구성 및 동작 구조 {#CEKComponentsAndOperationStructure} 14 | 15 | CEK는 [CLOVA developer console](/DevConsole/ClovaDevConsole_Overview.md)과 CEK 자연어 이해 엔진을 제공합니다. CLOVA developer console은 extension을 생성, 테스트, 배포하거나 interaction model을 등록할 수 있도록 UI를 제공하며, CEK 자연어 이해 엔진은 등록된 interaction model을 이용하여 사용자의 발화를 분석하고 그 결과를 extension에 전달합니다. 16 | 17 | Interaction model과, extension을 등록은 서비스 배포 전에 수행되어야 합니다. 배포 후 실행 시점에 CLOVA는 사용자의 발화를 인식하며, CEK를 통해 미리 등록된 [등록된 interaction 모델](/DevConsole/Guides/Register_Interaction_Model.md)을 참조하여 사용자의 발화를 분석합니다. CLOVA는 분석된 사용자의 발화 정보를 extension에 전달하며, extension은 사용자 요청에 대한 처리 결과를 응답으로 돌려줘야 합니다. 다음은 CEK의 동작 구조를 나타낸 다이어그램입니다. 18 | 19 | ![CEK_Components_And_Operation_Structure](/Develop/Assets/Images/CEK_Components_And_Operation_Structure.png) 20 | 21 | 다음은 각 구성 요소 사이에 어떤 요청과 응답이 오가는지를 중점적으로 나타낸 다이어그램입니다. 22 | 23 | ![CEK_Interaction_Structure](/Develop/Assets/Images/CEK_Interaction_Structure.png) 24 | 25 | 26 | ## Extension 종류 {#ExtensionType} 27 | CLOVA 플랫폼은 다음과 같은 두 종류의 extension을 지원 및 제공하고 있습니다. 28 | 29 | * [Custom extension](/Develop/Guides/Build_Custom_Extension.md): 임의의 확장된 기능을 제공하는 extension입니다. Custom extension을 사용하면 음악, 쇼핑, 금융과 같은 외부 서비스의 기능을 제공할 수 있습니다. 30 | * [CLOVA Home extension]({{ book.DocMeta.CLOVAHomeExtensionDeveloperGuideBaseURI }}/Develop/Guides/Build_Clova_Home_Extension.{{ book.DocMeta.FileExtensionForExternalLink }}): IoT 기기 제어 서비스를 제공하기 위한 extension입니다. 31 | 32 | 33 | -------------------------------------------------------------------------------- /ko-KR/Develop/Guides/BuildCustomExtension/Validating_Request_Message.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ### 요청 메시지 검증 {#RequestMessageValidation} 4 | 5 | 6 | 7 | Extension이 CEK로부터 HTTP 요청을 받을 때, 해당 요청이 제 3 자가 아닌 CLOVA로부터 전송된 신뢰할 수 있는 요청인지 검증할 필요가 있습니다. [HTTP 헤더](/Develop/References/HTTP_Message.md#HTTPHeader)에 있는 `SignatureCEK`와 RSA 공개 키를 사용하여 다음과 같이 요청 메시지를 검증할 수 있습니다. 8 | 9 |
    10 |
  1. CLOVA의 서명용 RSA 공개 키를 아래 URI에서 다운로드하십시오.
    11 |
    {{ book.ServiceEnv.PublicKeyURIforCEKMessageValidation }}
    12 |
  2. 13 |
  3. HTTP 헤더에서 SignatureCEK 필드의 값을 확보하십시오.
    14 | SignatureCEK 필드의 값은 HTTP 요청 메시지의 본문을 Base64로 인코딩한 RSA PKCS#1 v1.5 서명 값(signature)입니다.
  4. 15 |
  5. 1 번 항목에서 다운로드한 RSA 공개 키와 2 번 항목에서 획득한 SignatureCEK 헤더 값을 이용하여 검증(verify)하십시오.
  6. 16 |
17 | 18 | 다음은 요청 메시지를 검증하는 예제 코드입니다. 19 | ```java 20 | String signatureStr = req.getHeader("SignatureCEK"); 21 | byte[] body = getBody(req); 22 | 23 | String publicKeyStr = downloadPublicKey(); 24 | publicKeyStr = publicKeyStr.replaceAll("\\n", "") 25 | .replaceAll("-----BEGIN PUBLIC KEY-----", "") 26 | .replaceAll("-----END PUBLIC KEY-----", ""); 27 | X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyStr)); 28 | 29 | KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 30 | PublicKey pubKey = keyFactory.generatePublic(pubKeySpec); 31 | Signature sig = Signature.getInstance("SHA256withRSA"); 32 | sig.initVerify(pubKey); 33 | sig.update(body); 34 | 35 | byte[] signature = Base64.getDecoder().decode(signatureStr); 36 | boolean valid = sig.verify(signature); 37 | ``` 38 | 39 |
40 |

Note!

41 |

메시지 검증에 실패하면 해당 요청을 폐기해야 합니다.

42 |
43 | 44 | 45 | -------------------------------------------------------------------------------- /ko-KR/Develop/Assets/PUMLs/CEK_Custom_Extension_Multi-turn_Sequence_Diagram.puml: -------------------------------------------------------------------------------- 1 | !include ../../../styles/PlantUML_StyleSheet.puml 2 | 3 | participant "클라이언트 앱\nor 기기" as client #9EA0CA 4 | participant "CLOVA" as clova #05D686 5 | participant "Pizza-bot\nCustom extension" as ext #9EA0CA 6 | 7 | [->> client: 사용자 입력 수신 8 | 9 | activate client 10 | client ->> clova: "피자봇 시작해줘" 11 | hnote over client, clova: Extension 활성화 12 | 13 | activate clova 14 | clova -> clova: 사용자 발화 분석\l(Interaction 모델) 15 | 16 | group Session 17 | 18 | group Initiation 19 | clova ->> ext: LaunchRequest 전송(HTTP Request) 20 | 21 | activate ext 22 | ext -> ext: 사용자 요청 처리 23 | ext -->> clova: 응답 메시지 전달(HTTP Response) 24 | deactivate ext 25 | 26 | clova -->> client: "안녕하세요. 피자봇입니다.\l무엇을 도와드릴까요?" 27 | 28 | deactivate clova 29 | 30 | end 31 | 32 | [->> client: 사용자 입력 수신 33 | 34 | client ->> clova: "페퍼로니 피자 주문해줘." 35 | 36 | activate clova 37 | clova -> clova: 사용자 발화 분석\l(Interaction 모델) 38 | clova ->> ext: IntentRequest 전송(HTTP Request) 39 | 40 | activate ext 41 | ext -> ext: 사용자 요청 처리 42 | ext -->> clova: 응답 메시지 전달(HTTP Response) 43 | deactivate ext 44 | 45 | clova -->> client: "몇 판 주문할까요?" 46 | 47 | deactivate clova 48 | 49 | [->> client: 사용자 입력 수신 50 | 51 | client ->> clova: "두 판 주문해줘." 52 | 53 | activate clova 54 | clova -> clova: 사용자 발화 분석\l(Interaction 모델) 55 | clova ->> ext: IntentRequest 전송(HTTP Request) 56 | 57 | activate ext 58 | ext -> ext: 사용자 요청 처리 59 | ext -->> clova: 응답 메시지 전달(HTTP Response) 60 | deactivate ext 61 | 62 | clova -->> client: "어디로 배달할까요?" 63 | 64 | deactivate clova 65 | 66 | group Termination 67 | 68 | [->> client: 사용자 입력 수신 69 | 70 | client ->> clova: "그만 종료해줘." 71 | hnote over client, clova: Extension 사용 종료 72 | 73 | activate clova 74 | clova -> clova: "사용자 발화 분석\n(Interaction 모델)" 75 | clova ->> ext: SessionEndedRequest 전송(HTTP Request) 76 | deactivate clova 77 | 78 | activate ext 79 | ext -> ext: 종료 80 | activate ext 81 | deactivate ext 82 | deactivate ext 83 | end 84 | 85 | end 86 | -------------------------------------------------------------------------------- /ko-KR/DevConsole/ClovaDevConsole_Overview.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | # CLOVA developer console 개요 6 | 7 | [CLOVA developer console]({{ book.ServiceEnv.DeveloperConsoleURI }})은 CLOVA 플랫폼과 연동하는 기기나 서비스를 개발할 때 필요한 정보나 기능을 제공하는 웹 도구입니다. 클라이언트 개발자는 CLOVA developer console를 통해 개발하려는 클라이언트(기기 또는 앱)의 정보를 입력하고 해당 클라이언트가 CIC에 접속할 수 있도록 보안 정보를 설정합니다. Extension 개발자는 CEK와 extension이 메시지를 주고 받을 수 있도록 [extension 정보를 입력](/DevConsole/Guides/Register_Custom_Extension.md)하고, [interaction 모델을 등록](/DevConsole/Guides/Register_Interaction_Model.md)하게 됩니다. 뿐만 아니라 extension 개발자는 [extension 배포](/DevConsole/Guides/Deploy_Custom_Extension.md)를 위해 extension을 테스트하고 extension 심사도 신청해야 합니다. 8 | 9 | 클라이언트를 개발하거나 extension을 개발할 때 CLOVA developer console은 다음과 같은 구조로 사용됩니다. 10 | 11 | ![DevConsole-Concept_Diagram](/DevConsole/Assets/Images/DevConsole-Concept_Diagram.png) 12 | 13 | 위와 같이 CLOVA developer console을 통해 extension을 등록, 배포, 업데이트, 중지 및 삭제할 수 있습니다. 이 작업은 extension의 lifecyle과 관련이 있으며, CLOVA developer console에서 extension의 lifecycle은 다음 그림과 같습니다. 14 | 15 | ![DevConsole-Extension_LifeCycle](/DevConsole/Assets/Images/DevConsole-Extension_LifeCycle.png) 16 | 17 | 18 | 19 | CLOVA developer console의 CEK 메뉴를 통해 custom extension을 등록 및 관리할 수 있으며, [CEK](/Develop/CEK_Overview.md#WhatisCEK)와 연결하여 custom extension이나 interaction 모델을 테스트해볼 수 있습니다. 다음과 같이 왼쪽에 있는 **CLOVA Extensions Kit β** 메뉴나 중앙에 있는 바(bar) 형태의 메뉴를 누르면 CEK 메뉴로 진입합니다. 20 | 21 | ![DevConsole-Entering_CEK_Menu](/DevConsole/Assets/Images/DevConsole-Entering_CEK_Menu.png) 22 | 23 | CEK 메뉴를 통해 다음과 같은 작업을 처리할 수 있습니다. 24 | 25 | * [Custom extension 등록하기](/DevConsole/Guides/Register_Custom_Extension.md) 26 | * [Interaction 모델 등록하기](/DevConsole/Guides/Register_Interaction_Model.md) 27 | * [Custom extension 테스트하기](/DevConsole/Guides/Test_Custom_Extension.md) 28 | * [Custom extension 배포하기](/DevConsole/Guides/Deploy_Custom_Extension.md) 29 | * [Custom extension 업데이트하기](/DevConsole/Guides/Update_Custom_Extension.md) 30 | * [Custom extension 중지 및 삭제하기](/DevConsole/Guides/Remove_Custom_Extension.md) 31 | -------------------------------------------------------------------------------- /ko-KR/Develop/Examples/Extension_Examples.md: -------------------------------------------------------------------------------- 1 | # Extension 예제 2 | 3 | CLOVA를 통해 서비스되고 있는 일부 extension을 소개합니다. 간단한 동작을 수행하는 extension으로서 extension을 구현할 때 도움이 될만한 예제입니다. 4 | 5 | * [마법 구슬(Magic ball)](#MagicBall) 6 | * [빗소리(Rain sound)](#RainSound) 7 | * [주사위 놀이(Dice drawer)](#DiceDrawer) 8 | * [코인 헬퍼(Coin helper)](#CoinHelper) 9 | 10 | ## 마법 구슬(Magic ball) {#MagicBall} 11 | 12 | 마법 구슬은 사용자의 물음에 미리 정의해놓은 20 가지의 긍정 또는 부정 표현 중 하나를 응답으로 돌려주는 extension입니다. 13 | 14 | ### 특징 15 | * 사용자의 발화와 관계없이 응답을 선택해서 내려주기 때문에 interaction 모델이 간단합니다. 16 | * 서버 클라이언트 프로그래밍으로 보면 "echo" 수준의 예제라고 할 수 있습니다. 17 | * Go 언어로 구현되어 있습니다. 18 | 19 | ### GitHub 저장소 20 | {{ book.ServiceEnv.GitHubBaseURIforExtensionExample }}/clova-extension-sample-magicball 21 | 22 | ## 빗소리(Rain sound) {#RainSound} 23 | 24 | 빗소리는 사용자의 요청에 미리 녹음해둔 빗소리 음원 파일(.mp3)를 클라이언트가 재생하도록 응답하는 extension입니다. 25 | 26 | ### 특징 27 | * 사용자는 빗소리를 몇 번 반복해서 들을지 결정할 수 있으며, 이 extension의 interaction 모델은 반복 횟수에 대한 값을 slot으로 정의하고 있습니다. 28 | * 클라이언트가 음원을 재생할 수 있도록 [응답 메시지](/Develop/References/Custom_Extension_Message.md#CustomExtRequestType)에 안내 문구 뿐만 아니라 [`AudioPlayer.Play`]({{ book.DocMeta.CLOVAClientDeveloperGuideBaseURI }}/Develop/References/MessageInterfaces/AudioPlayer.{{ book.DocMeta.FileExtensionForExternalLink }}#Play) 지시 메시지를 포함시켜 CEK로 보내줍니다. 29 | * Node.js로 구현되어 있습니다. 30 | 31 | ### GitHub 저장소 32 | {{ book.ServiceEnv.GitHubBaseURIforExtensionExample }}/clova-extension-sample-rainsound 33 | 34 | ## 주사위 놀이(Dice drawer) {#DiceDrawer} 35 | 36 | 주사위 놀이는 사용자의 요청에 가상의 주사위를 굴려 나온 주사위의 눈과 눈의 합계를 알려주는 extension입니다. 37 | 38 | ### 특징 39 | * 사용자는 주사위를 몇 개 던질 지 결정할 수 있으며, 이 extension의 interaction 모델은 주사위 개수에 대한 값을 slot으로 정의하고 있습니다. 40 | * 굴릴 주사위 개수가 하나인지 두 개 이상 인지에 따라 응답으로 돌려주는 표현이 달라집니다. 41 | * Node.js로 구현되어 있습니다. 42 | 43 | ### GitHub 저장소 44 | {{ book.ServiceEnv.GitHubBaseURIforExtensionExample }}/clova-extension-sample-dice 45 | 46 | ## 코인 헬퍼(Coin helper) {#CoinHelper} 47 | 48 | 코인 헬퍼는 사용자의 요청에 외부 가상 화폐 거래소에서 제공하는 REST API를 호출하여 시세 정보를 돌려주는 extension입니다. 49 | 50 | ### 특징 51 | * 사용자는 어떤 거래소의 정보를 이용할지 어떤 가상화폐의 시세를 조회할지 결정할 수 있으며, 이 extension의 interaction 모델은 거래소와 가상 화폐 종목에 대한 값을 slot으로 정의하고 있습니다. 52 | * 외부 서비스의 REST API를 이용하여 다른 서비스로부터 데이터를 조회합니다. 53 | * 다른 예제보다 조금 더 복잡한 interaction 모델을 가지고 있습니다. 54 | * Go 언어로 구현되어 있습니다. 55 | 56 | ### GitHub 저장소 57 | 58 | {{ book.ServiceEnv.GitHubBaseURIforExtensionExample }}/clova-extension-sample-coinhelper 59 | -------------------------------------------------------------------------------- /ko-KR/README.md: -------------------------------------------------------------------------------- 1 | # 시작하기 전에 2 | 3 | CLOVA는 {{ book.ServiceEnv.OrientedService }}가 개발 및 서비스하고 있는 인공지능 플랫폼입니다. CLOVA는 [CEK 플랫폼](/Develop/CEK_Overview.md) 통해 보유하고 있는 온라인 콘텐츠나 서비스를 제공하려는 확장 기능(Extension) 개발자에게 인터페이스를 제공합니다. 4 | 5 |
6 |

Note!

7 |

금전 거래나 결제를 포함하는 extension을 개발하려는 회사나 개인은 사전에 {{ book.ServiceEnv.OrientedService }} 제휴 제안 페이지를 방문하여 미리 제휴를 맺어야 합니다.

8 |
9 | 10 | 개발자는 필요에 따라 다음과 같은 문서를 참조하면 됩니다. 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 30 | 31 | 32 | 33 | 40 | 41 | 42 | 43 | 57 | 58 | 59 | 60 | 66 | 67 | 68 | 69 | 77 | 78 | 79 |
구분문서
개념 이해 및 디자인 가이드라인 23 | 29 |
튜토리얼 34 | 39 |
가이드 44 | 56 |
레퍼런스 61 | 65 |
예제 70 | 76 |
80 | 81 |
82 |

Note!

83 |

CLOVA는 현재 개발이 계속 진행되고 있습니다. 따라서, 문서의 내용은 언제든지 변경될 수 있습니다.

84 |
85 | -------------------------------------------------------------------------------- /ko-KR/Develop/Guides/Do_Multiturn_Dialog.md: -------------------------------------------------------------------------------- 1 | # Multi-turn 대화 수행하기 2 | 3 | CEK로부터 전달받은 사용자 요청 정보([`IntentRequest`](/Develop/Guides/Build_Custom_Extension.md#HandleIntentRequest))가 custom extension이 서비스를 제공하거나 동작을 수행하기에 부족할 수도 있습니다. 또는 Single-turn 형태의 대화로 사용자의 요청을 한번에 받기 어려울 수 있습니다. 이때 custom extension은 사용자에게 부족한 정보를 추가로 받기 위해 multi-turn 대화를 수행할 수 있습니다. Multi-turn 대화의 기본적인 동작 구조는 다음과 같습니다. 4 | 5 | ![CEK_Custom_Extension_Multi-turn_Sequence_Diagram](/Develop/Assets/Images/CEK_Custom_Extension_Multi-turn_Sequence_Diagram.svg) 6 | 7 | 예를 들면, 사용자가 "페퍼로니 피자 주문해줘"라고 했고 CEK에서 아래와 같은 요청 메시지를 보냈다고 가정해 봅니다. 8 | 9 | {% raw %} 10 | ```json 11 | { 12 | "version": "0.1.0", 13 | "session": { 14 | "new": true, 15 | "sessionAttributes": {}, 16 | "sessionId": "a29cfead-c5ba-474d-8745-6c1a6625f0c5", 17 | "user": { 18 | "userId": "V0qe", 19 | "accessToken": "XHapQasdfsdfFsdfasdflQQ7" 20 | } 21 | }, 22 | "context": { 23 | ... 24 | }, 25 | "request": { 26 | "type": "IntentRequest", 27 | "intent": { 28 | "name": "OrderPizza", 29 | "slots": { 30 | "pizzaType": { 31 | "name": "pizzaType", 32 | "value": "페퍼로니" 33 | } 34 | } 35 | } 36 | } 37 | } 38 | ``` 39 | {% endraw %} 40 | 41 | Custom extension에서 피자 종류뿐만 아니라 주문 수량 정보가 추가로 필요할 수도 있습니다. 이때, [응답 메시지](/Develop/References/Custom_Extension_Message.md#CustomExtResponseMessage)의 `response.shouldEndSession` 필드를 `false`로 설정하면, 부족한 정보를 추가로 확인하기 위해 multi-turn 대화를 시도할 수 있습니다. 또한, 기존에 사용자가 먼저 보냈던 정보를 `sessionAttributes` 필드에 키(key)-값(value) 형태로 저장해둘 수 있습니다. 42 | 43 | 아래와 같이 응답하면 사용자가 이미 요청했던 `intent` 필드와 `pizzaType`의 정보를 보관해두도록 CLOVA에 요청할 수 있으며, 사용자에게 수량과 관련된 추가 정보를 요청할 수 있습니다. 44 | 45 | {% raw %} 46 | ```json 47 | { 48 | "version": "0.1.0", 49 | "sessionAttributes": { 50 | "intent": "OrderPizza", 51 | "pizzaType": "페퍼로니" 52 | }, 53 | "response": { 54 | "outputSpeech": { 55 | "type": "SimpleSpeech", 56 | "values": { 57 | "type": "PlainText", 58 | "lang": "ko", 59 | "value": "몇 판 주문할까요?" 60 | } 61 | }, 62 | "card": {}, 63 | "directives": [], 64 | "shouldEndSession": false 65 | } 66 | } 67 | ``` 68 | {% endraw %} 69 | 70 | 추후 사용자가 필요한 수량 정보까지 응답하면 다음과 같이 분석된 수량 정보와 함께 CLOVA 플랫폼은 저장해둔 `sessionAttributes` 객체 정보를 [요청 메시지](/Develop/References/Custom_Extension_Message.md#CustomExtRequestMessage)의 `session.sessionAttributes` 필드에 포함하여 다시 전달합니다. 이때, 추가로 전달된 메시지는 이전 메시지와 같은 `session.sessionId` 값을 가지게 되며, custom extension은 받은 추가 정보를 이용하여 다음 동작을 수행하면 됩니다. 71 | 72 | {% raw %} 73 | ```json 74 | { 75 | "version": "0.1.0", 76 | "session": { 77 | "new": false, 78 | "sessionAttributes": { 79 | "intent": "OrderPizza", 80 | "pizzaType": "페퍼로니" 81 | }, 82 | "sessionId": "a29cfead-c5ba-474d-8745-6c1a6625f0c5", 83 | "user": { 84 | "userId": "V0qe", 85 | "accessToken": "XHapQasdfsdfFsdfasdflQQ7" 86 | } 87 | }, 88 | "context": { 89 | ... 90 | }, 91 | "request": { 92 | "type": "IntentRequest", 93 | "intent": { 94 | "name": "AddInfo", 95 | "slots": { 96 | "pizzaAmount": { 97 | "name": "pizzaAmount", 98 | "value": "2" 99 | } 100 | } 101 | } 102 | } 103 | } 104 | ``` 105 | {% endraw %} 106 | 107 |
108 |

Tip!

109 |

Extension이 SessionEndedRequest 타입 요청을 받으면 언제든지 multi-turn 대화가 종료될 수 있습니다. SessionEndedRequest 타입 요청을 받은 후에는 extension이 어떠한 응답(사용 종료 안내말 또는 인사말)을 보내더라도 CEK가 이를 무시하게 됩니다.

110 |
111 | -------------------------------------------------------------------------------- /ko-KR/styles/pdf.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: "Noto Sans", "Noto Sans CJK KR", sans-serif !important; 3 | } 4 | 5 | .warning { 6 | background-color: #ffdddd; 7 | border-left: 8px solid #f44336; 8 | padding: 5px 10px 2px 15px; 9 | margin-bottom: 30px; 10 | line-height: 1.4; 11 | } 12 | 13 | .tip { 14 | background-color: #ddffdd; 15 | border-left: 8px solid #4CAF50; 16 | padding: 5px 10px 2px 15px; 17 | margin-bottom: 30px; 18 | line-height: 1.4; 19 | } 20 | 21 | .note { 22 | background-color: #ffffcc; 23 | border-left: 8px solid #ffeb3b; 24 | padding: 5px 10px 2px 15px; 25 | margin-bottom: 30px; 26 | line-height: 1.4; 27 | } 28 | 29 | td .warning { 30 | margin-bottom: 10px; 31 | } 32 | 33 | td .tip { 34 | margin-bottom: 10px; 35 | } 36 | 37 | td .note { 38 | margin-bottom: 10px; 39 | } 40 | 41 | .section.toc .page { 42 | display: none; 43 | } 44 | 45 | .ignoreOnPDF { 46 | display: none; 47 | } 48 | 49 | .midAlign { 50 | text-align: center; 51 | } 52 | 53 | .pdf-footer, 54 | .pdf-header { 55 | margin-top: 20px; 56 | color: #aaa; 57 | } 58 | .pdf-footer .sub { 59 | padding-top: 8px; 60 | font-size: 70%; 61 | } 62 | .pdf-header .sub { 63 | padding-top: 2px; 64 | font-size: 70%; 65 | } 66 | .pdf-footer { 67 | padding-top: 10px; 68 | border-top: 1px solid #eee; 69 | } 70 | .pdf-footer .footer-pages-count { 71 | float: right; 72 | } 73 | .pdf-header { 74 | padding-bottom: 10px; 75 | border-bottom: 1px solid #eee; 76 | } 77 | .pdf-header .header-pages-count { 78 | float: right; 79 | text-align: right; 80 | } 81 | .pdf-header .header-pages-count a, 82 | .pdf-header .header-pages-count a:visited, 83 | .pdf-header .header-pages-count a:active, 84 | .pdf-header .header-pages-count a:focus, 85 | .pdf-header .header-pages-count a:link { 86 | text-decoration: none; 87 | color: #aaa; 88 | cursor: text; 89 | } 90 | 91 | td img { 92 | padding: 0px; 93 | margin: 0px; 94 | } 95 | 96 | img { 97 | padding: 10px; 98 | margin: 2px 2px 30px 2px; 99 | background-color: white; 100 | -moz-box-shadow: 3px 3px 10px 3px #ccc; 101 | -webkit-box-shadow: 3px 3px 10px 3px #ccc; 102 | box-shadow: 3px 3px 10px 3px #ccc; 103 | } 104 | 105 | img.inlineImage { 106 | padding: 0px; 107 | box-shadow: 0px 0px 0px 0px; 108 | vertical-align: middle; 109 | } 110 | 111 | ol ol { 112 | list-style-type: lower-alpha; 113 | } 114 | 115 | blockquote { 116 | margin: 0; 117 | margin-bottom: .85em; 118 | padding: 0 15px; 119 | border-left: 4px solid #a7a7a7; 120 | } 121 | 122 | blockquote p.ldiag { 123 | padding-right:10px; 124 | } 125 | 126 | blockquote p.rdiag { 127 | text-align: right; 128 | max-width:500px; 129 | padding-left:10px; 130 | } 131 | 132 | .audioInterruptionRule{ 133 | border: 1px solid #ccc; 134 | border-radius: 3px; 135 | color: #333; 136 | display: inline-block; 137 | font-weight: bold; 138 | line-height: 99%; 139 | margin: 0; 140 | padding: 2px 5px; 141 | text-align: center; 142 | text-decoration: none; 143 | text-transform: uppercase; 144 | } 145 | 146 | .backgroundPlay { 147 | color: #14892c; 148 | background-color: #ffffff; 149 | border-color: #b2d8b9; 150 | } 151 | 152 | .cancelPlayback { 153 | color: #d04437; 154 | background-color: #ffffff; 155 | border-color: #f8d3d1; 156 | } 157 | 158 | .continuePlayback { 159 | color: #4a6785; 160 | background-color: #ffffff; 161 | border-color: #e4e8ed; 162 | } 163 | 164 | pre>code { 165 | font-family: D2Coding !important; 166 | color: #333333; 167 | } 168 | 169 | code { 170 | font-family: D2Coding !important; 171 | padding: 1px; 172 | margin: 0; 173 | font-size: .85em; 174 | color: lightcoral; 175 | background-color: #f7f7f7; 176 | border-width: thin; 177 | } -------------------------------------------------------------------------------- /ko-KR/styles/website.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: "Noto Sans", "Noto Sans CJK KR", sans-serif !important; 3 | } 4 | 5 | .warning { 6 | background-color: #ffdddd; 7 | border-left: 8px solid #f44336; 8 | padding: 5px 10px 2px 15px; 9 | margin-bottom: 30px; 10 | line-height: 1.4; 11 | } 12 | 13 | .tip { 14 | background-color: #ddffdd; 15 | border-left: 8px solid #4CAF50; 16 | padding: 5px 10px 2px 15px; 17 | margin-bottom: 30px; 18 | line-height: 1.4; 19 | } 20 | 21 | .note { 22 | background-color: #ffffcc; 23 | border-left: 8px solid #ffeb3b; 24 | padding: 5px 10px 2px 15px; 25 | margin-bottom: 30px; 26 | line-height: 1.4; 27 | } 28 | 29 | .note p, 30 | .tip p, 31 | .warning p { 32 | margin-bottom: 0.85em; 33 | } 34 | 35 | .note img, 36 | .tip img, 37 | .warning img { 38 | margin: 0px; 39 | } 40 | 41 | td .warning { 42 | margin-bottom: 10px; 43 | } 44 | 45 | td .tip { 46 | margin-bottom: 10px; 47 | } 48 | 49 | td .note { 50 | margin-bottom: 10px; 51 | } 52 | 53 | .midAlign { 54 | text-align: center; 55 | } 56 | 57 | .book-body .body-inner .page-wrapper .page-inner { 58 | max-width: 1200px; 59 | } 60 | 61 | .book-summary .summary .divider { 62 | display: none; 63 | } 64 | 65 | .book-summary .summary>li:last-child { 66 | display: none; 67 | } 68 | 69 | .book-body .navigation-next, 70 | .book-body .navigation-prev { 71 | display: none; 72 | } 73 | 74 | .markdown-section ul p, 75 | .markdown-section ol p, 76 | .markdown-section dl p { 77 | margin-bottom: 0; 78 | } 79 | 80 | .markdown-section ol ol { 81 | list-style-type: lower-alpha; 82 | } 83 | 84 | .markdown-section ul li, 85 | .markdown-section ol li, 86 | .markdown-section dl li, 87 | .markdown-section p { 88 | margin-top: 8px; 89 | } 90 | 91 | .book-summary ul.summary { 92 | margin-bottom: 30px; 93 | } 94 | 95 | .markdown-section code { 96 | padding: 1px; 97 | margin: 0; 98 | font-size: .85em; 99 | color: lightcoral; 100 | background-color: #f7f7f7; 101 | border-width: thin; 102 | } 103 | 104 | 105 | .markdown-section pre>code { 106 | color: #333333; 107 | } 108 | 109 | .markdown-section img { 110 | max-width: 780px; 111 | padding: 10px; 112 | margin: 2px 2px 30px 2px; 113 | background-color: white; 114 | -moz-box-shadow: 3px 3px 10px 3px #ccc; 115 | -webkit-box-shadow: 3px 3px 10px 3px #ccc; 116 | box-shadow: 3px 3px 10px 3px #ccc; 117 | } 118 | 119 | img.inlineImage { 120 | padding: 0px; 121 | box-shadow: 0px 0px 0px 0px; 122 | vertical-align: middle; 123 | } 124 | 125 | .markdown-section td img:nth-child(1) { 126 | margin: 0px; 127 | padding: 0px; 128 | vertical-align: middle; 129 | } 130 | 131 | a.btn.pull-right.js-toolbar-action { 132 | display: none; 133 | } 134 | 135 | .dropdown.pull-right.js-toolbar-action { 136 | display: none; 137 | } 138 | 139 | li>div.note, 140 | li>div.warning { 141 | margin-bottom: 0; 142 | padding-bottom: 0.85em; 143 | } 144 | 145 | blockquote { 146 | margin: 0; 147 | margin-bottom: .85em; 148 | padding: 0 15px; 149 | border-left: 4px solid #a7a7a7; 150 | } 151 | 152 | blockquote p.ldiag { 153 | padding-right: 10px; 154 | } 155 | 156 | blockquote p.rdiag { 157 | text-align: right; 158 | max-width: 500px; 159 | padding-left: 10px; 160 | } 161 | 162 | .audioInterruptionRule { 163 | border: 1px solid #ccc; 164 | border-radius: 3px; 165 | color: #333; 166 | display: inline-block; 167 | font-weight: bold; 168 | line-height: 99%; 169 | margin: 0; 170 | padding: 2px 5px; 171 | text-align: center; 172 | text-decoration: none; 173 | text-transform: uppercase; 174 | } 175 | 176 | .backgroundPlay { 177 | color: #14892c; 178 | background-color: #ffffff; 179 | border-color: #b2d8b9; 180 | } 181 | 182 | .cancelPlayback { 183 | color: #d04437; 184 | background-color: #ffffff; 185 | border-color: #f8d3d1; 186 | } 187 | 188 | .continuePlayback { 189 | color: #4a6785; 190 | background-color: #ffffff; 191 | border-color: #e4e8ed; 192 | } 193 | -------------------------------------------------------------------------------- /ko-KR/TermsAndPolicy/Terms_And_Policy.md: -------------------------------------------------------------------------------- 1 | # 준수사항 및 운영정책 2 | 3 | Skill(extension)을 통해 콘텐츠를 사용자에게 제공할 때 지켜야하는 준수사항이 있습니다. CLOVA 운영자는 Skill Store에 [skill을 배포](/DevConsole/Guides/Deploy_Custom_Extension.md)하기 전에 이 준수 사항을 위반했는지 심사합니다. Skill이 준수 사항을 위반하거나 명확히 따르지 않으면 배포를 거부하거나 이미 배포된 skill 제공을 중단할 수 있습니다. 따라서, [심사를 신청](/DevConsole/Guides/Deploy_Custom_Extension.md#RequestExtensionSubmission)하기 전에 반드시 이하의 준수 사항을 따랐는지 확인해야 합니다. 4 | 5 | * [Skill의 완전성](#SkillCompleteness) 6 | * [Skill의 안전성](#SkillSecurity) 7 | * [권리 보호 및 법 준수](#RightAndLegal) 8 | * [윤리 이행](#Morals) 9 | * [개인 정보 보호](#Privacy) 10 | * [기타 유의 사항](#OtherPrecautions) 11 | 12 | ## Skill의 완전성 {#SkillCompleteness} 13 | 14 | 편의 제공 및 불편 해소와 같이 보다 나은 사용자 경험을 위해 다음을 준수하여 완전성을 추구해야 합니다. 15 | 16 | * 서버 점검과 같이 특수한 상황을 제외하고 skill은 사용자의 요청에 언제든지 응답할 수 있어야 합니다. 17 | * Skill에 대한 정보인 [기본 정보](/DevConsole/Guides/Register_Custom_Extension.md#InputExtensionInfo), [서버 설정 정보](/DevConsole/Guides/Register_Custom_Extension.md#SetServerConnection), [배포 정보](/DevConsole/Guides/Deploy_Custom_Extension.md#InputDeploymentInfo)가 부족하거나 잘못된 정보 없이 항상 최신의 정보로 업데이트되어야 합니다. 18 | * [사용 시나리오](/Design/Design_Custom_Extension.md#MakeUseCaseScenarioScript)에 불가능하거나 자연스럽지 않은 부분이 없어야 하며, 사용자의 요청이 잘 인식될 수 있도록 [interaction 모델](/Design/Design_Custom_Extension.md#DefineInteractionModel) 잘 정의하여 구현해야 합니다. 19 | * 콘텐츠 제공을 위해 서버를 연동하거나 계정을 연결한다면 필요한 [보안 조건](/Develop/Guides/Link_User_Account.md#ApplyAccountLinking)을 갖춰야 합니다. 20 | 21 | 따라서, 다음과 같은 상황이 발생하면 지체 없이 그에 대해서 확인하고, 오류 수정 후 재등록과 같은 정상 동작을 위한 조치를 취해야 하며, 그 결과를 회사에 통지해야 합니다. 22 | 23 | * 운영 중인 skill이 정상 동작하지 않을 때 24 | * 위의 이유로 문제를 스스로 인지하거나 {{ book.DocMeta.DocOwner }}가 연락을 한 때 25 | 26 |
27 |

Warning!

28 |

이와 같은 조치를 하지 않아 해당 skill이 정상적으로 동작하지 않은 기간이 1 개월 이상 지속되면, {{ book.DocMeta.DocOwner }}는 해당 skill의 운영을 중단시킬 수 있습니다.

29 |
30 | 31 | ## Skill의 안전성 {#SkillSecurity} 32 | 33 | 사용자의 안전을 보장하기 위해 다음 사항을 준수해야 합니다. 34 | 35 | * 사람의 생명 또는 신체의 안전을 해칠 우려가 있는 행위를 유도하거나 조장하지 않아야 합니다. 36 | * 청소년의 가출이나 탈선을 유도하거나 조장하지 않아야 합니다. 37 | * {{ book.DocMeta.DocOwner }} 또는 제 3 자의 기기, 설비, 시스템과 같은 것의 이용을 방해하거나 운용에 지장을 주지 않아야 합니다. 38 | * {{ book.DocMeta.DocOwner }} 또는 제 3 자의 설비에 축적된 정보를 불법적으로 바꾸거나 제거하지 않아야 합니다. 39 | * 바이러스와 같은 유해 프로그램을 포함하거나 송신하지 않아야 합니다. 40 | 41 | ## 권리 보호 및 법 준수 {#RightAndLegal} 42 | 43 | Skill은 다음과 같은 사항을 준수하여 권리 보호 및 법 준수의 의무를 지켜야 합니다. 44 | 45 | * {{ book.DocMeta.DocOwner }} 또는 제 3 자의 권리(저작권, 지적재산권, 초상권, 성명권, 인격권, 명예와 같은 것)을 침해하지 않아야 합니다. 46 | * 권리의 소재가 명확하지 않은 콘텐츠를 제공하지 않아야 합니다. (예: 2 차 창작과 같은 것) 47 | * 권리자로부터 허락받지 않았거나 허락받았음을 증명할 수 없는 콘텐츠를 제공하지 않아야 합니다. 48 | * 도박과 같이 기타 불법적인 행위를 유도하거나 조장하는 콘텐츠를 제공하지 않아야 합니다. 49 | * 성범죄, 노골적인 성행위 묘사, 아동 포르노, 아동 학대와 관련된 콘텐츠 뿐만 아니라 기타 잔혹하거나 외설적인 표현 또는 이를 연상시키는 콘텐츠를 제공하지 않아야 합니다. 50 | * 기타 범죄를 구상 또는 조장하거나 미풍양속 또는 법규를 위반하거나 위반할 우려가 있는 콘텐츠를 제공하지 않아야 합니다. 51 | 52 |
53 |

Note!

54 |

심사 시 콘텐츠의 권리를 확인하기 위해 권리 확인이 가능한 서류를 요청할 수도 있습니다.

55 |
56 | 57 | ## 윤리 이행 {#Morals} 58 | 59 | Skill은 다음과 같이 윤리적인 규범에 해당하는 사항도 준수해야 합니다. 60 | 61 | * 사용자가 특정 개인이나 집단, 법인, 국가와 같은 것 비방, 욕설, 공격, 혐오하지 않도록 만들어야 합니다. 62 | * 사용자가 특정 종교, 문화, 민족성, 국민성을 공격하거나 그것에 대해 불쾌감을 느끼지 않도록 만들어야 합니다. 63 | * Skill이 반 사회적인 내용을 포함하거나 또는 불쾌감을 주지 않아야 합니다. 64 | * 사용자가 {{ book.DocMeta.DocOwner }}가 skill을 개발 및 제공한다고 오해하거나 혼동하지 않도록 만들어야 합니다. 65 | * {{ book.DocMeta.DocOwner }} 또는 제 3 자를 부당하게 차별, 비방하지 않아야 하며 이런 행위를 유도하거나 조장하지 않아야 합니다. 66 | 67 | ## 개인 정보 보호 {#Privacy} 68 | 69 | Skill은 개인 정보 보호의 의무를 지켜야 합니다. 70 | 71 | * CLOVA 이용 데이터와 같이 기타 개인 정보를 수집하지 않아야 합니다. 72 | * 다음과 같은 민감한 정보를 수집하지 않아야 합니다. 73 | * 인종, 종교, 사회적 신분, 병력, 전과, 범죄 피해 정보 74 | * 장애, 지적 장애·정신 장애에 대한 정보 75 | * 건강 진단 그 외의 다른 검사의 결과 76 | * 의료 기록, 진료 및 투약 정보 77 | * 피의자 또는 피고인으로서 구속, 수색과 같은 민사 또는 형사 사건에 관련된 정보 78 | 79 | ## 기타 유의 사항 {#OtherPrecautions} 80 | 81 | Skill 콘텐츠 제공과 관련하여 다음과 같은 유의 사항이 있습니다. 82 | 83 | * Skill이 본인(당사) 또는 제 3 자의 기기(예: IoT기기)와 연동된다면 심사를 위해 관련 기기 제출을 요청할 수도 있습니다. 84 | * 위에서 언급한 내용 뿐만 아니라 Skill은 [CLOVA Extensions Kit 이용약관]({{ book.ServiceEnv.CEKTermsOfUseURI }})을 위반하지 않아야 합니다. 85 | 86 |
87 |

Note!

88 |

일부 예외가 있을 수 있기 때문에 판단이 어려울 수 있으며, 이에 대한 판단이 어렵다면 심사 시에 의견을 입력해주십시오.

89 |
90 | -------------------------------------------------------------------------------- /ko-KR/Develop/Guides/Monitor_TTS_Playback_Status.md: -------------------------------------------------------------------------------- 1 | # 음성 재생 상태 확인하기 2 | 3 | [Custom extension에서 응답을 반환](/Develop/Guides/Build_Custom_Extension.md#ReturnCustomExtensionResponse)할 때 [응답 메시지](/Develop/References/Custom_Extension_Message.md#CustomExtResponseMessage)에서 [SpeechInfoObject](/Develop/References/Custom_Extension_Message.html#CustomExtSpeechInfoObject)의 `token` 필드를 입력하면 클라이언트에서 음성(TTS) 재생에 대한 경과를 보고 받을 수 있습니다. 이는 주로 클라이언트가 자막 또는 특정 콘텐츠를 표시할 때 음성 자막과 그 진행 단계를 맞추도록 할 때 사용할 수 있습니다. 4 | 5 | 예를 들면, "Hi, my name is CLOVA."와 같은 음성과 텍스트를 표시한 후 그 다음에 "How can I help you?"와 같은 텍스트를 표시한다고 가정해 봅니다. 이때, "Hi, my name is CLOVA"에 해당하는 음성을 재생하도록 전달한 후 해당 음성 재생이 완료된 다음에 그 다음 자막이 표시되도록 만들어야 합니다. 6 | 7 | 클라이언트가 위 동작을 정확하게 처리한다고 보장할 수 없기 때문에 첫 번째 음성이 재생되었음을 클라이언트로부터 보고 받고 난 후 그 다음 음성에 해당하는 자막과 음성을 전달해야 합니다. 이를 위해 첫 번째 음성에 대한 응답 메시지로 다음과 같이 `outputSpeech.values.token` 필드를 사용하여 음성(TTS)에 대한 token 값을 전달할 수 있습니다. 8 | 9 | ```json 10 | { 11 | "version": "0.1.0", 12 | "sessionAttributes": {}, 13 | "response": { 14 | "outputSpeech": { 15 | "type": "SimpleSpeech", 16 | "values": { 17 | "type": "PlainText", 18 | "lang": "en", 19 | "token": "19d33bae-6cd5-4534-b0a3-e0036b4742bd", 20 | "value": "Hi, my name is CLOVA." 21 | } 22 | }, 23 | "card": {}, 24 | "directives": [ 25 | { 26 | "directive": { 27 | "header": { 28 | "namespace": "Clova", 29 | "name": "RenderTemplate", 30 | }, 31 | "payload": { 32 | { 33 | ... 34 | "paragraphText": { 35 | "type": "string", 36 | "value": "Hi, my name is CLOVA." 37 | }, 38 | ... 39 | }, 40 | "type": "Text" 41 | } 42 | } 43 | } 44 | } 45 | ], 46 | "shouldEndSession": false 47 | } 48 | } 49 | ``` 50 | 51 | {% if book.L10N.TargetCountryCode == "KR" %} 52 | 클라이언트는 각 상황에 맞는 [CIC API]({{ book.DocMeta.CLOVAClientDeveloperGuideBaseURI }}/Develop/References/CIC_API.{{ book.DocMeta.FileExtensionForExternalLink }})를 사용하여 CLOVA에 음성(TTS) 재생에 대한 경과 보고를 하게 됩니다. 53 | 54 | * [`SpeechSynthesizer.SpeechFinished`]({{ book.DocMeta.CLOVAClientDeveloperGuideBaseURI }}/Develop/References/MessageInterfaces/SpeechSynthesizer.{{ book.DocMeta.FileExtensionForExternalLink }}#SpeechFinished) 지시 메시지: 클라이언트에 재생 중인 오디오 스트림을 일시 정지하도록 지시 55 | * [`SpeechSynthesizer.SpeechStarted`]({{ book.DocMeta.CLOVAClientDeveloperGuideBaseURI }}/Develop/References/MessageInterfaces/SpeechSynthesizer.{{ book.DocMeta.FileExtensionForExternalLink }}#SpeechStarted) 지시 메시지: 클라이언트에 오디오 스트림 재생을 재개하도록 지시 56 | * [`SpeechSynthesizer.SpeechStopped`]({{ book.DocMeta.CLOVAClientDeveloperGuideBaseURI }}/Develop/References/MessageInterfaces/SpeechSynthesizer.{{ book.DocMeta.FileExtensionForExternalLink }}#SpeechStopped) 지시 메시지: 클라이언트에 오디오 스트림 재생을 중지하도록 지시 57 | {% elif book.L10N.TargetCountryCode == "JP" %} 58 | 클라이언트는 각 상황에 맞는 [`CIC API`](/Develop/References/CEK_API.md#CICAPIforAudioPlayback)를 사용하여 CLOVA에 음성(TTS) 재생에 대한 경과 보고를 하게 됩니다. 59 | 60 | * [`SpeechSynthesizer.SpeechFinished`](/Develop/References/CEK_API.md#SpeechFinished) 지시 메시지: 클라이언트에 재생 중인 오디오 스트림을 일시 정지하도록 지시 61 | * [`SpeechSynthesizer.SpeechStarted`](/Develop/References/CEK_API.md#SpeechStarted) 지시 메시지: 클라이언트에 오디오 스트림 재생을 재개하도록 지시 62 | * [`SpeechSynthesizer.SpeechStopped`](/Develop/References/CEK_API.md#SpeechStopped) 지시 메시지: 클라이언트에 오디오 스트림 재생을 중지하도록 지시 63 | {% endif %} 64 | 65 | CLOVA는 그 보고를 [`EventRequest` 요청 타입](/Develop/References/Custom_Extension_Message.md#CustomExtEventRequest) 메시지를 통해 extension에 전달합니다. 다음은 위 음성에 대해 재생 종료 보고를 받은 예입니다. 아래와 같은 메시지를 받은 후 현재 클라이언트의 음성 재생 상태를 확인하여 다음에 전달할 음성이나 콘텐츠를 응답으로 제공하는 방식으로 콘텐츠 제공 속도나 단계를 조절하면 됩니다. 66 | 67 | ```json 68 | { 69 | "version": "0.1.0", 70 | "session": { 71 | ... 72 | }, 73 | "context": { 74 | ... 75 | }, 76 | "request": { 77 | "type": "EventRequest", 78 | "requestId": "cdb56a98-e940-4ee4-96eb-4f1cb3f97694", 79 | "timestamp": "2017-09-05T05:41:21Z", 80 | "event": { 81 | "namespace": "SpeechSynthesizer", 82 | "name": "SpeechFinished", 83 | "payload": { 84 | "token": "19d33bae-6cd5-4534-b0a3-e0036b4742bd" 85 | } 86 | } 87 | } 88 | } 89 | ``` 90 | -------------------------------------------------------------------------------- /ko-KR/DevConsole/Guides/Test_Custom_Extension.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Custom extension 테스트하기 4 | 등록한 custom extension이나 interaction 모델은 배포하기 전에 테스트해볼 수 있습니다. 다음을 항목을 수행하여 custom extension과 interaction 모델을 테스트합니다. 5 | 6 | * (Custom extension 전용) [Interaction 모델 빌드하기](#BuildInteractionModel) 7 | * (Custom extension 전용) [Interaction 모델 테스트하기](#TestInteractionModel) 8 | * [CLOVA 앱으로 custom extension 테스트하기](#TestOnCLOVAApp) 9 | 10 | ## Interaction 모델 빌드하기 {#BuildInteractionModel} 11 | 12 | Custom extension을 배포하려면 [interaction 모델이 등록](/DevConsole/Guides/Register_Interaction_Model.md)되어 있어야 합니다. 정의된 interaction 모델은 빌드 과정을 거쳐야 새로 작성했거나 또는 업데이트한 내용을 [테스트](#TestInteractionModel)하거나 사용할 수 있습니다. 다음과 같이 정의된 interaction 모델을 빌드할 수 있습니다. 13 | 14 | 1. 등록한 custom extension 목록에서 interaction 모델을 빌드하려는 custom extension 항목의 **{{ book.DevConsole.cek_edit }}** 메뉴를 누르십시오.
15 | ![DevConsole-Interaction_Model_Menu](/DevConsole/Assets/Images/DevConsole-Interaction_Model_Menu.png) 16 | 2. **{{ book.DevConsole.cek_interaction_model }} : {{ book.DevConsole.cek_builder_header_title_dashboard }}** 화면에서 왼쪽 상단에 있는 **{{ book.DevConsole.cek_builder_menu_build }}** 버튼을 누르십시오. 그러면 interaction 모델 빌드가 시작됩니다.
17 | Interaction 모델의 크기에 따라 3~5 분 정도 소요될 수 있습니다.
18 | ![DevConsole-Build_Interaction_Model](/DevConsole/Assets/Images/DevConsole-Build_Interaction_Model.png) 19 | 20 |
21 |

Tip!

22 |

빌드 중에 {{ book.DevConsole.cek_interaction_model }} : {{ book.DevConsole.cek_builder_header_title_dashboard }} 내에서 다른 메뉴로 이동하더라도 빌드가 취소되지 않습니다. 빌드를 시작한 이후에 얼마든지 메뉴 이동 및 내용 편집이 가능합니다.

23 |
24 | 25 | ## Interaction 모델 테스트하기 {#TestInteractionModel} 26 | 27 | [Interaction 모델 빌드](#BuildInteractionModel)가 완료되면, interaction 모델을 테스트할 수 있습니다. 다음과 같이 발화문을 테스트해볼 수 있습니다. 28 | 29 | 1. 왼쪽 사이드 메뉴 아래 **{{ book.DevConsole.cek_test }}** 메뉴를 누르십시오.
30 | 메뉴를 누르면 **{{ book.DevConsole.cek_interaction_model }}: {{ book.DevConsole.cek_test }}** 화면이 표시됩니다.
31 | ![DevConsole-Test_Menu](/DevConsole/Assets/Images/DevConsole-Test_Menu.png) 32 | 2. **{{ book.DevConsole.cek_builder_test_expression_title }}** 필드에 테스트할 발화문을 입력하고 **{{ book.DevConsole.cek_builder_test_request_test }}** 버튼을 누르십시오. 33 | ![DevConsole-Test_Utterance_Example](/DevConsole/Assets/Images/DevConsole-Test_Utterance_Example.png) 34 | 35 | 테스트를 완료하면 다음과 같은 결과를 확인할 수 있습니다. 아래 결과를 토대로 다음과 같은 항목을 확인해야 합니다. 36 | 37 | * **{{ book.DevConsole.cek_builder_test_service_response }}** 항목을 보고 [등록한 custom extension](/DevConsole/Guides/Register_Custom_Extension.md)이 제대로 응답하는지 확인해야 합니다. 38 | * **{{ book.DevConsole.cek_builder_test_intent_result }}** 항목과 **{{ book.DevConsole.cek_builder_test_slot_result }}** 항목을 보고 의도한대로 intent와 slot이 인식되는지 확인해야 합니다. 39 | * **{{ book.DevConsole.cek_builder_test_request_json }}** 항목을 보고 CEK가 custom extension으로 보내는 [요청 메시지](/Develop/References/Custom_Extension_Message.md#CustomExtRequestMessage)에 이상이 없는지 확인해야 합니다. 뿐만 아니라 해당 JSON의 내용을 수정한 후 **{{ book.DevConsole.cek_builder_test_test_again }}** 버튼을 누르면 테스트를 다시 수행할 수 있습니다. 40 | * **{{ book.DevConsole.cek_builder_test_response_json }}** 항목을 보고 등록한 custom extension이 의도한대로 [응답 메시지](/Develop/References/Custom_Extension_Message.md#CustomExtResponseMessage)를 보내는지 확인해야 합니다. 41 | 42 | ![DevConsole-Test_Result](/DevConsole/Assets/Images/DevConsole-Test_Result.png) 43 | 44 | 45 | 46 | ## CLOVA 앱으로 custom extension 테스트하기 {#TestOnCLOVAApp} 47 | 48 | Custom extension을 실제 클라이언트인 CLOVA 앱에서 테스트해볼 수 있습니다. 이를 위해 custom extension 기본 정보를 등록하는 페이지의 **{{ book.DevConsole.cek_tester }}** 필드에 개발자 본인이나 custom extension을 테스트할 사람의 {{ book.ServiceEnv.OrientedService }} 계정을 입력해야 합니다. 계정을 추가한 후 **{{ book.DevConsole.cek_save }}** 버튼을 누르면 입력한 계정이 인증된 CLOVA 앱에서 개발 중인 custom extension을 테스트할 수 있습니다. CLOVA 앱에서 테스트를 중지하려면 입력한 계정 정보를 삭제하면 됩니다. 49 | 50 | ![DevConsole-Add_Tester_ID_For_Custom_Extension](/DevConsole/Assets/Images/DevConsole-Add_Tester_ID_For_Custom_Extension.png) 51 | 52 |
53 |

Note!

54 |

테스터 ID를 등록한 후 조금 기다리면 custom extension을 테스트해 볼 수 있습니다. 만약, 1 시간 정도가 지나도 custom extension을 테스트할 수 없으면 포럼이나 제휴 담당자를 통해 문의하시기 바랍니다.

55 |
56 | 57 | 58 | -------------------------------------------------------------------------------- /ko-KR/Develop/Tutorials/Handle_Builtin_Intents.md: -------------------------------------------------------------------------------- 1 | # 기본적인 의사 표현 처리하기 2 | 이 튜토리얼에서는 [기초적인 extension 만들기](/Develop/Tutorials/Build_Simple_Extension.md)에서 만든 샘플 주사위 extension을 통해 예, 아니오와 같은 기본적인 의사 표현을 처리하는 법을 알아봅니다. 3 | 4 | CLOVA는 빈번하게 발생하는 사용자의 기본적인 의사 표현을 모든 extension에서 공통으로 사용할 수 있도록 [built-in intent](/Design/Design_Custom_Extension.md#BuiltinIntent)로 미리 정의해 놓았습니다. 다음은 CLOVA가 제공하는 built-in intent입니다. 5 | 6 | | Built-in intent 이름 | 의도 | 대응하는 사용자 발화 예시 | 7 | |---------------------------|-------------------|----------------------------------------------------------| 8 | | Clova.GuideIntent | 도움말 요청 | "너 뭐 할 줄 알아?", "사용법 알려줘" | 9 | | Clova.CancelIntent | 실행 취소 요청 | "취소", "취소해줘" | 10 | | Clova.YesIntent | 긍정 응답(예, Yes) | "응", "그래", "알겠어", "알겠습니다", "오케이" | 11 | | Clova.NoIntent | 부정 응답(아니오, No) | "아니", "아니요", "싫어" | 12 | 13 | 사용자가 도움말을 요청하거나 실행 취소를 요청할 때 이를 처리하기 위해 첫 번째 튜토리얼에서 했던 것처럼 intent와 예시 문장을 등록할 필요 없이 위 표에 있는 built-in intent를 사용하면 됩니다. 14 | 15 | Built-in intent를 처리하는 과정은 다음과 같습니다. 16 | * 1 단계. Built-in intent 처리 구현(Extension 서버에서 작업) 17 | * 2 단계. Built-in intent 동작 테스트(CLOVA developer console에서 작업) 18 | 19 | ## 1 단계. Built-in intent 처리 구현 {#Step1} 20 | 21 | 샘플 주사위 extension이 built-in intent를 처리할 수 있도록 코드를 변경해야 합니다. 22 | 23 | 여기서는 기본적인 처리 방법을 알아보기 위해 도움말 요청 built-in intent만 처리하도록 합니다. 24 | 도움말 요청 built-in intent는 사용자가 "어떻게 사용해", "도움말 알려줘" 같은 말을 할 때 전송되며, `Clova.GuideIntent`라는 이름을 사용합니다. 25 | 26 | 이 built-in intent를 처리하기 위해 다음과 같이 [첫 번째 튜토리얼](/Develop/Tutorials/Build_Simple_Extension.md)의 저장소를 재사용합니다. 27 | 다음과 같이 로컬 저장소로 이동하여 `tutorial2` 브랜치로 전환합니다. 28 | 29 | ```bash 30 | cd /path/to/your_sample_dice_directory 31 | git fetch 32 | git checkout tutorial2 33 | ``` 34 | 35 | 샘플 주사위 extension은 `clova/index.js` 파일의 `intentRequest()`에서 도움말 요청을 처리합니다. 36 | 37 | ```javascript 38 | intentRequest(cekResponse) { 39 | const intent = this.request.intent.name 40 | 41 | switch (intent) { 42 | ... 43 | case "Clova.GuideIntent": 44 | default: 45 | cekResponse.setSimpleSpeechText("주사위 한 개 던져줘, 라고 시도해보세요.") 46 | } 47 | ... 48 | } 49 | ``` 50 | 51 | 위 코드에서 보는 것처럼, CLOVA로부터 받은 요청 메시지에서 intent를 추출하여 그 이름이 `Clova.GuideIntent`일 때 "주사위 한 개 던져줘"라고 시도하도록 알려줍니다. 52 | 53 | 변경된 코드를 extension 서버에서 실행합니다. 54 | 55 | ## 2 단계. Built-in intent 동작 테스트 {#Step2} 56 | 샘플 주사위 extension이 도움말 요청을 하는 built-in intent를 잘 처리하는지 테스트해야 합니다. 57 | 58 | [첫 번째 튜토리얼](/Develop/Tutorials/Build_Simple_Extension.md)에서처럼 두 가지 테스트 방법이 있습니다. 하나는 CLOVA developer console에서 interaction 모델 동작을 확인하는 것이고, 다른 하나는 테스터 ID를 등록하여 CLOVA 앱에서 실제 동작을 확인하는 것입니다. 59 | 이 튜토리얼에서는 interaction 모델 동작만 확인합니다. 60 | 61 |
62 |

Tip!

63 |

Built-in intent는 interaction 모델에 명시적으로 등록하지 않아도 기본적으로 동작합니다. 추후 각 extension에서 built-in intent를 선택하여 등록할 수 있도록 할 예정입니다.

64 |
65 | 66 | 다음 순서대로 샘플 주사위 extension의 도움말 요청이 잘 동작하는지 확인합니다. 67 | 68 | 1. CLOVA developer console에 접속하십시오. 69 | 2. 샘플 주사위의 **{{ book.DevConsole.cek_interaction_model }}** 항목 내 **{{ book.DevConsole.cek_edit}}** 버튼을 누르십시오. 70 | 3. 화면 좌측 상단의 **{{ book.DevConsole.cek_builder_menu_build }}** 버튼을 눌러 interaction 모델을 빌드하십시오. 71 | 4. 빌드가 끝난 후, 왼쪽의 메뉴 목록에서 **{{ book.DevConsole.cek_test }}** 메뉴를 누르십시오. 72 | 5. **{{ book.DevConsole.cek_builder_test_expression_title }}**에 도움말을 요청하는 문장을 입력하십시오. 예를 들어, "사용법 알려줘"라고 입력합니다. 73 | 6. 엔터키 또는 **{{ book.DevConsole.cek_builder_test_request_test }}** 버튼을 누르십시오. 74 | 7. **{{ book.DevConsole.cek_builder_test_result_title }}**의 **{{ book.DevConsole.cek_builder_test_intent_result }}** 항목에 "Clova.GuideIntent"라고 나타나는지 확인하십시오.
75 | ![CEK_Tutorial_Builtin_Intent_Test](/Develop/Assets/Images/CEK_Tutorial_Builtin_Intent_Test.png) 76 |
77 |

Note!

78 |

외부에서 접근할 수 있는 extension 서버 URI를 등록하지 않았다면, {{ book.DevConsole.cek_builder_test_service_response }}은 "{{ book.DevConsole.cek_builder_test_no_response }}"라고 나타납니다.

79 |
80 | 81 | 이렇게 하면 샘플 주사위 extension이 도움말 요청에 응답할 수 있게 됩니다. 82 | 이와 같은 방법으로 extension 서버가 `Clova.CancelIntent`, `Clova.YesIntent`, `Clova.NoIntent`을 처리하도록 구현하면, 실행 취소나 긍정 혹은 부정을 의미하는 요청에도 응답할 수 있습니다. 83 | -------------------------------------------------------------------------------- /ko-KR/Develop/Guides/BuildCustomExtension/Return_Custom_Extension_Response.md: -------------------------------------------------------------------------------- 1 | ## Custom extension 응답 반환하기 {#ReturnCustomExtensionResponse} 2 | [요청 메시지를 처리](#HandleCustomExtensionRequest)하고 나면 다시 CEK로 [응답 메시지](/Develop/References/Custom_Extension_Message.md#CustomExtResponseMessage)를 돌려줘야 합니다(HTTP Response). 요청 메시지의 타입에 따라 응답해야 하는 내용이 달라질 수 있지만 응답 메시지의 구조는 크게 다르지 않습니다. 다음은 LaunchRequest 타입 요청("피자봇 시작해줘"라는 사용자 요청)을 처리하고 보낸 응답 메시지입니다. 3 | 4 | {% raw %} 5 | ```json 6 | { 7 | "version": "0.1.0", 8 | "sessionAttributes": {}, 9 | "response": { 10 | "outputSpeech": { 11 | "type": "SimpleSpeech", 12 | "values": { 13 | "type": "PlainText", 14 | "lang": "ko", 15 | "value": "안녕하세요, 피자봇입니다. 무엇을 도와드릴까요?" 16 | } 17 | }, 18 | "card": {}, 19 | "directives": [], 20 | "shouldEndSession": false 21 | } 22 | } 23 | ``` 24 | {% endraw %} 25 | 26 | 각 필드는 다음과 같은 의미를 가집니다. 27 | 28 | * `version`: 현재 사용하는 custom extension 메시지 포맷의 버전이 v0.1.0입니다. 29 | * `response.outputSpeech`: 사용자에게 영어로 "Hi, nice to meet you"의 문장을 말하도록 설정합니다. 30 | * `response.card`: 클라이언트 화면에 표시할 데이터가 없습니다. [Content template]({{ book.DocMeta.CLOVAClientDeveloperGuideBaseURI }}/Develop/References/Content_Templates.{{ book.DocMeta.FileExtensionForExternalLink }}) 형태의 데이터이며, 클라이언트 화면에 표시할 콘텐트를 이 필드를 통해 전달할 수 있습니다. 31 | * `response.shouldEndSession`: 세션을 종료하지 않고 계속 사용자의 입력을 받습니다. 만약 이 필드 값이 true이면 [`SessionEndedRequest`](#HandleSessionEndedRequest) 요청을 받기 전에 extension이 주도하여 세션을 종료할 수 있습니다. 32 | 33 |
34 |

Tip!

35 |

sessionAttributes 필드는 확장을 위해 예약해 둔 필드이며, response.directives 필드는 extension이 CEK로 전달하는 지시 메시지입니다. response.directives 필드에서 사용할 지시 메시지는 추후 API를 제공할 예정입니다.

36 |
37 | 38 | 다음과 같이 상황에 따라서 여러 문장을 출력하도록 응답 메시지를 작성할 수도 있고, 인터넷 상에 있는 음성 파일이나 음악 파일을 재생하도록 응답 메시지를 작성할 수도 있습니다. 39 | 40 | ```json 41 | { 42 | "version": "0.1.0", 43 | "sessionAttributes": {}, 44 | "response": { 45 | "outputSpeech": { 46 | "type": "SpeechList", 47 | "values": [ 48 | { 49 | "type": "PlainText", 50 | "lang": "ko", 51 | "value": "노래를 불러볼게요." 52 | }, 53 | { 54 | "type": "URL", 55 | "lang": "" , 56 | "value": "https://tts.example.com/song.mp3" 57 | } 58 | ] 59 | }, 60 | "card": {}, 61 | "directives": [], 62 | "shouldEndSession": true 63 | } 64 | } 65 | ``` 66 | 67 | 각 `response.outputSpeech` 필드를 설명하면 다음과 같습니다. 68 | 69 | * `response.outputSpeech.type`: 복문 타입(SpeechList)의 음성 정보입니다. 70 | * `response.outputSpeech.values[0]`: 일반 텍스트 형태의 음성 정보이며, 한국어로 "노래를 불러볼게요"라고 발화하도록 설정했습니다. 71 | * `response.outputSpeech.values[1]`: URI 형태의 음성 정보이며, `value` 필드에 입력된 URI의 파일을 재생하도록 설정했습니다. 72 | 73 | HLS 방식의 음원을 제공할 때는 다음과 같이 작성할 수 있습니다. 이때, `response.outputSpeech.values[1].contentType` 필드를 `"application/vnd.apple.mpegurl"`로 지정해야 합니다. 74 | 75 | ```json 76 | { 77 | "version": "0.1.0", 78 | "sessionAttributes": {}, 79 | "response": { 80 | "outputSpeech": { 81 | "type": "SpeechList", 82 | "values": [ 83 | { 84 | "type": "PlainText", 85 | "lang": "ko", 86 | "value": "노래를 불러볼게요." 87 | }, 88 | { 89 | "contentType": "application/vnd.apple.mpegurl", 90 | "type": "URL", 91 | "lang": "" , 92 | "value": "https://tts.example.com/song.m3u8" 93 | } 94 | ] 95 | }, 96 | "card": {}, 97 | "directives": [], 98 | "shouldEndSession": true 99 | } 100 | } 101 | ``` 102 | 103 |
104 |

Tip!

105 |

단문이나 복문 형태의 음성 정보 외에도 스크린 없는 기기와 같이 상세 내용을 GUI로 표현하기 힘든 클라이언트를 위해 복합 형태(SpeechSet)의 음성 정보도 지원하고 있습니다. 레퍼런스 및 제약에 대한 자세한 사항은 custom extension 메시지 포맷의 응답 메시지를 참조합니다.

106 |
107 | 108 | 음성 출력뿐만 아니라 클라이언트 기기의 화면이나 CLOVA 앱 화면에 원하는 데이터를 출력해야 한다면 다음과 같이 `response.card` 필드에 [content template]({{ book.DocMeta.CLOVAClientDeveloperGuideBaseURI }}/Develop/References/Content_Templates.{{ book.DocMeta.FileExtensionForExternalLink }})에 맞춰 표시할 콘텐츠를 채우면 됩니다. 109 | 110 | {% raw %} 111 | ```json 112 | { 113 | "version": "0.1.0", 114 | "sessionAttributes": {}, 115 | "response": { 116 | "outputSpeech": { 117 | "type": "SimpleSpeech", 118 | "values": { 119 | "type": "PlainText", 120 | "lang": "ko", 121 | "value": "리오넬 메시의 사진이에요." 122 | } 123 | }, 124 | "card": { 125 | "type": "ImageText", 126 | "imageUrl": { 127 | "type": "url", 128 | "value": "" 129 | }, 130 | "mainText": { 131 | "type": "string", 132 | "value": "리오넬 메시" 133 | }, 134 | "referenceText": { 135 | "type": "string", 136 | "value": "검색결과" 137 | }, 138 | "referenceUrl": { 139 | "type": "url", 140 | "value": "https://m.search.example.com/search.naver?where=m&sm=mob_lic&query=%eb%a6%ac%ec%98%a4%eb%84%ac+%eb%a9%94%ec%8b%9c+%ec%86%8c%ec%86%8d%ed%8c%80" 141 | }, 142 | "subTextList": [ 143 | { 144 | "type": "string", 145 | "value": "FC 바르셀로나" 146 | } 147 | ], 148 | "thumbImageType": { 149 | "type": "string", 150 | "value": "인물" 151 | }, 152 | "thumbImageUrl": { 153 | "type": "url", 154 | "value": "https://sstatic.example.net/people/3/201607071816066361.jpg" 155 | } 156 | }, 157 | "directives": [], 158 | "shouldEndSession": true 159 | } 160 | } 161 | ``` 162 | {% endraw %} 163 | -------------------------------------------------------------------------------- /ko-KR/book.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "CLOVA custom extension guide", 3 | "description": "이 문서는 CLOVA custom extension을 개발할 수 있도록 디자인 가이드라인과 CEK 플랫폼에 대한 개발 가이드 및 API 레퍼런스를 제공합니다.", 4 | "direction": "ltr", 5 | "author": "NAVER Corporation", 6 | "variables": { 7 | "DocMeta": { 8 | "ClassifiedInfo": "Confidential", 9 | "CLOVAClientDeveloperGuideBaseURI": "https://developers.naver.com/docs/clova/client", 10 | "CLOVAHomeExtensionDeveloperGuideBaseURI": "https://developers.naver.com/docs/clova/home_ext", 11 | "DocOwner": "NAVER", 12 | "DocVersion": "v2021-01-18", 13 | "OutputFormat": "Web", 14 | "ReleaseYear": "2019", 15 | "TargetReaderType": "Public", 16 | "FileExtensionForExternalLink": "md" 17 | }, 18 | "ServiceEnv": { 19 | "CEKTermsOfUseURI": "https://developers.naver.com/console/clova/cek/#/terms", 20 | "DeveloperCenterForumURI": "https://developers.naver.com/forum/list", 21 | "DeveloperCenterName": "NAVER 개발자 센터", 22 | "DeveloperConsoleURI": "https://developers.naver.com/console/clova", 23 | "ExtensionAdminEmail": "dl_clova_extension@navercorp.com", 24 | "GitHubBaseURIforExtensionExample": "https://github.com/naver", 25 | "OrientedService": "NAVER", 26 | "ProposalRegisterURI": "https://www.navercorp.com/ko/company/proposalRegister.nhn", 27 | "PublicKeyURIforCEKMessageValidation": "https://clova.ai/.well-known/signature-public-key.pem", 28 | "RedirectURIforAccountLinking": "https://prod-ni-cic.clova.ai/v1/al/token/" 29 | }, 30 | "L10N": { 31 | "Language": "ko", 32 | "TargetCountryCode": "KR" 33 | }, 34 | "DevConsole": { 35 | "supported_languages": "한국어", 36 | "cek_access_token_uri": "Access token URI", 37 | "cek_account_linking": "계정 연결 여부", 38 | "cek_allow_purchase": "구매/지불 기능 존재 여부", 39 | "cek_audioplayer": "오디오 플레이어 사용", 40 | "cek_authorization_url": "로그인 URL", 41 | "cek_builder_header_title_dashboard": "대시보드", 42 | "cek_builder_intent_expression_title": "발화 예시 목록", 43 | "cek_builder_intent_slot_title": "Slot 목록", 44 | "cek_builder_list_title_intent": "등록된 intent", 45 | "cek_builder_list_title_slottype": "등록된 slot 타입", 46 | "cek_builder_menu_build_in_progress": "빌드중", 47 | "cek_builder_menu_build": "빌드", 48 | "cek_builder_new_intent_create": "만들기", 49 | "cek_builder_new_intent": "새로운 custom intent 만들기", 50 | "cek_builder_new_slottype_builtin_title": "CLOVA가 제공하는 built-in slot 타입 사용하기", 51 | "cek_builder_select_slottype_builtin": "Built-in slot 타입", 52 | "cek_builder_slot_layer_select_slot": "등록된 slot 선택하기", 53 | "cek_builder_slottype_dictionary_title": "Slot 타입 사전", 54 | "cek_builder_test_expression_title": "사용자 발화 예시 입력", 55 | "cek_builder_test_intent_result": "분석된 intent", 56 | "cek_builder_test_no_response": "Response가 없습니다", 57 | "cek_builder_test_request_json": "서비스 요청 JSON", 58 | "cek_builder_test_request_test": "테스트 요청", 59 | "cek_builder_test_response_json": "서비스 응답 JSON", 60 | "cek_builder_test_result_title": "테스트 결과", 61 | "cek_builder_test_service_response": "서비스 응답", 62 | "cek_builder_test_slot_data": "분석된 slot 데이터", 63 | "cek_builder_test_slot_result": "분석된 slot", 64 | "cek_builder_test_test_again": "테스트 재요청", 65 | "cek_builder_utterance_select_slot": "Slot 타입을 선택해주세요", 66 | "cek_cancel_review": "심사취소", 67 | "cek_category": "분류", 68 | "cek_child_directed": "미성년자 사용 가능 여부", 69 | "cek_client_authentication_scheme": "클라이언트 인증 정보 전송 방식", 70 | "cek_client_id": "클라이언트 ID", 71 | "cek_client_secret": "클라이언트 secret", 72 | "cek_configuration_url": "계정 설정 페이지 URL", 73 | "cek_configuration": "서버 연동 설정", 74 | "cek_create": "만들기", 75 | "cek_domain_list": "도메인 리스트", 76 | "cek_edit": "수정", 77 | "cek_email": "서비스 담당자 정보", 78 | "cek_example_phrases": "Skill Store용 발화 문장", 79 | "cek_full_skill_desc": "Skill Store용 설명", 80 | "cek_id": "Extension ID", 81 | "cek_interaction_model": "Interaction 모델", 82 | "cek_invocation_name": "호출 이름", 83 | "cek_keywords": "검색 키워드", 84 | "cek_lang": "사용 언어", 85 | "cek_large_icon": "큰 아이콘", 86 | "cek_message": "메시지", 87 | "cek_name": "Extension 이름", 88 | "cek_new_skill": "Custom extension 만들기", 89 | "cek_no": "아니요", 90 | "cek_privacy_policy_url": "개인 정보 정책 제공 URL", 91 | "cek_privacy": "개인 정보 보호 및 규정 준수", 92 | "cek_provider": "제작사", 93 | "cek_publishing": "Skill Store 노출 정보", 94 | "cek_redirect_urls": "Redirect URL", 95 | "cek_refresh_token_uri": "Access token 재발급 URI", 96 | "cek_request_submit": "심사신청", 97 | "cek_save": "저장", 98 | "cek_scope": "권한 범위", 99 | "cek_service_endpoint_url": "Extension 서버 URL", 100 | "cek_short_skill_desc": "Extension 요약 설명", 101 | "cek_skill_info": "Extension 정보", 102 | "cek_small_icon": "작은 아이콘", 103 | "cek_ssl_certificate": "SSL 인증", 104 | "cek_status_dev": "개발 중", 105 | "cek_status_prd": "서비스 중", 106 | "cek_status_rejected": "확인요망", 107 | "cek_status": "상태", 108 | "cek_terms_of_use": "면책 조항 제공 URL", 109 | "cek_test_instructions": "Extension 심사용 설명", 110 | "cek_test": "테스트", 111 | "cek_tester": "테스터 ID", 112 | "cek_type": "타입", 113 | "cek_use_personal_info": "개인 정보 수집 여부", 114 | "cek_version_service": "상용", 115 | "cek_version_test": "테스트", 116 | "cek_view": "확인", 117 | "cek_yes": "네", 118 | "ExtensionPage": "Extension 페이지", 119 | "ManageCustomExtensions": "Skill Store" 120 | } 121 | }, 122 | "pdf": { 123 | "fontSize": 11, 124 | "margin": { 125 | "top": 40, 126 | "bottom": 40, 127 | "left": 30, 128 | "right": 30 129 | }, 130 | "paperSize": "a3" 131 | }, 132 | "plugins": ["-search", "-lunr"] 133 | } 134 | -------------------------------------------------------------------------------- /ko-KR/Glossary.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | # 용어 및 약어 6 | 7 |
8 |

Note!

9 |

이 페이지는 계속 업데이트되고 있습니다.

10 |
11 | 12 | ### CEK 13 | [CLOVA Extensions Kit](#CEK)의 약어 14 | 15 | ### CIC 16 | [CLOVA Interface Connect](#CIC)의 약어 17 | 18 | ### CLOVA {#CLOVA} 19 | [CLOVA](https://clova.ai)는 {{ book.ServiceEnv.OrientedService }}가 개발 및 서비스하고 있는 인공지능 플랫폼입니다. CLOVA 사용자의 음성이나 이미지를 인식하고 이를 분석하여 사용자가 원하는 정보나 서비스를 제공합니다. 3rd party 개발자는 CLOVA가 가진 기술을 활용하여 인공 지능 서비스를 제공하는 기기 또는 가전 제품을 만들거나 보유하고 있는 콘텐츠나 서비스를 CLOVA를 통해 사용자에게 제공할 수 있습니다. 20 | 21 | ### CLOVA developer console {#CLOVADeveloperConsole} 22 | CLOVA 플랫폼과 연동하는 클라이언트 기기나 [CLOVA extension](#CLOVAExtension)을 개발하는 개발자에게 다음과 같은 내용을 제공하는 웹 도구입니다. 23 | * CLOVA extension [등록](/DevConsole/Guides/Register_Custom_Extension.md) 및 [배포](/DevConsole/Guides/Deploy_Custom_Extension.md) 24 | * [Interaction 모델 등록](/DevConsole/Guides/Register_Interaction_Model.md) 25 | * CLOVA 서비스 관련 통계 자료 제공 (추후 제공 예정) 26 | 27 | ### CLOVA extension {#CLOVAExtension} 28 | 음악, 쇼핑, 금융 같은 외부 서비스(3rd party service)나 집 안 IoT 기기의 원격 제어와 같이 사용자가 CLOVA를 통해 더 많은 서비스와 기능을 경험할 수 있도록 CLOVA에 확장된 기능을 제공하는 애플리케이션입니다. 짧게 extension이라 부르기도 하며, CLOVA 플랫폼은 현재 다음과 같은 두 종류의 extension을 지원공하고 있습니다. 일반 사용자에게는 "Skill"이라는 이름으로 제공되고 있습니다. 29 | * [Custom extension](#CustomExtension) 30 | * [CLOVA Home extension](#CLOVAHomeExtension) 31 | 32 | ### CLOVA Extensions Kit (CEK) {#CEK} 33 | CEK는 CLOVA와 [CLOVA extension(이하 extension) 사이의 커뮤니케이션](/Develop/CEK_Overview.md)을 지원하는 플랫폼으로 extension을 개발 및 배포할 때 필요한 도구와 인터페이스를 제공합니다. 34 | 35 | ### CLOVA Home extension {#CLOVAHomeExtension} 36 | IoT 기기 제어 서비스를 제공하기 위한 [extension](#CLOVAExtension)입니다. 자세한 내용은 [CLOVA Home extension 만들기]({{ book.DocMeta.CLOVAHomeExtensionDeveloperGuideBaseURI }}/Develop/Guides/Build_Clova_Home_Extension.{{ book.DocMeta.FileExtensionForExternalLink}}) 문서를 참조합니다. 37 | 38 | ### CLOVA Interface Connect (CIC) {#CIC} 39 | 인공 지능 비서 서비스를 제공하려는 PC/모바일용 앱, 모바일 또는 가전 기기의 클라이언트에 CLOVA와 연동할 수 있는 인터페이스를 제공하는 플랫폼입니다. 자세한 내용은 [CIC 개요]({{ book.DocMeta.CLOVAClientDeveloperGuideBaseURI }}/Develop/CIC_Overview.{{ book.DocMeta.FileExtensionForExternalLink }}) 문서를 참조합니다. 40 | 41 | ### CLOVA 앱 {#CLOVAApp} 42 | 43 | {{ book.ServiceEnv.OrientedService }}가 개발하여 iOS나 Android 플랫폼으로 배포한 CLOVA 앱입니다. CLOVA에 명령을 내릴 수 있을 뿐만 아니라 클라이언트 기기를 등록하고 관리할 수 있는 앱입니다. 44 | 45 | ### Content template {#ContentTemplate} 46 | CIC를 통해 전달되는 콘텐츠 정보를 일정 범주에 맞게 정형화한 것입니다. 자세한 내용은 [content template]({{ book.DocMeta.CLOVAClientDeveloperGuideBaseURI }}/Develop/References/Content_Templates.{{ book.DocMeta.FileExtensionForExternalLink }}) 문서를 참조합니다. 47 | 48 | ### Custom extension {#CustomExtension} 49 | 임의의 확장된 기능을 제공하는 [extension](#CLOVAExtension)입니다. Custom extension을 사용하면 음악, 쇼핑, 금융과 같은 외부 서비스의 기능을 제공할 수 있습니다. 자세한 내용은 [Custom extension 만들기](/Develop/Guides/Build_Custom_Extension.md) 문서를 참조합니다. 50 | 51 | ### Custom extension 메시지 {#CustomExtMessage} 52 | [CLOVA Extensions Kit](#CEK)와 [custom extension](#CustomExtension) 사이에서 정보를 주고 받을 때 사용하는 메시지입니다. 자세한 내용은 [Custom extension 메시지](/Develop/References/Custom_Extension_Message.md) 문서를 참조합니다. 53 | 54 | ### Extension {#Extension} 55 | [CLOVA extension](#CLOVAExtension)의 다른 표현 56 | 57 | ### Extension 페이지 {#ExtensionPage} 58 | 59 | Skill Store 홈 (**확장 서비스 관리** 메뉴)에서 특정 extension을 선택했을 때 표시되는 페이지로 extension에 대한 자세한 설명을 제공하는 페이지입니다. 60 | 61 | ### Intent {#Intent} 62 | Intent는 CLOVA extension이 처리할 사용자의 요청을 구별한 범주이며, custom intent와 built-in intent로 나뉩니다. [Custom extension](#CustomExtension)을 구현하기 전에 먼저 intent의 집합으로 구성된 [interaction 모델](#InteractionModel)을 정의해야 합니다. 자세한 내용은 [interaction 모델 정의](/Design/Design_Custom_Extension.md#DefineInteractionModel)를 참조합니다. 63 | 64 | ### IntentRequest {#IntentRequest} 65 | 66 | 사용자의 요청이 분석된 결과([Intent](#Intent))를 [custom extension](#CustomExtension)으로 전달할 때 사용되는 요청 메시지 타입입니다. 자세한 내용은 [Custom extension 요청 처리하기](/Develop/Guides/Build_Custom_Extension.md#HandleCustomExtensionRequest) 문서를 참조합니다. 67 | 68 | ### Interaction 모델 {#InteractionModel} 69 | [CLOVA](#CLOVA)가 사용자의 발화를 어떻게 인식하게 할 것인지 정의한 것으로 각 [custom extension](#CustomExtension)에 필요한 interaction 모델을 등록할 수 있습니다. 등록된 interaction 모델은 CLOVA의 [자연어 이해(NLU)](https://en.wikipedia.org/wiki/Natural-language_understanding) 시 이용되며, CLOVA는 이 interaction 모델에 의해 처리된 사용자의 요청을 정형화된 포맷(JSON)으로 바꾸어 custom extension에 전달합니다. 자세한 내용은 [interaction 모델 정의](/Design/Design_Custom_Extension.md#DefineInteractionModel) 문서를 참조합니다. 70 | 71 | ### LaunchRequest {#LaunchRequest} 72 | 사용자가 특정 모드나 특정 [custom extension](#CustomExtension)을 사용하기로 선언한 것을 알리기 위해 보내는 요청 메시지입니다. 자세한 내용은 [Custom extension 요청 처리하기](/Develop/Guides/Build_Custom_Extension.md#HandleCustomExtensionRequest) 문서를 참조합니다. 73 | 74 | ### OAuth 2.0 75 | 접근 권한을 위임하기 위한 공개 표준으로 인터넷 사용자가 다른 웹 서비스나 응용 프로그램에 사용자 계정에 접근할 수 있는 권한을 부여하는 규약입니다. CLOVA 플랫폼에서는 클라이언트가 [CLOVA access token](#CLOVAAccessToken)을 획득하거나 사용자가 특정 extension을 사용 시 자신의 [계정을 연결](/Develop/Guides/Link_User_Account.md)할 때 사용됩니다. 자세한 내용은 [https://tools.ietf.org/html/rfc6749](https://tools.ietf.org/html/rfc6749)를 참고합니다. 76 | 77 | ### SessionEndedRequest {#SessionEndedRequest} 78 | 사용자가 특정 모드나 특정 [custom extension](#CustomExtension)의 사용을 중지하기로 선언한 것을 알리기 위해 사용되며 요청 메시지에 포함됩니다. 자세한 내용은 [Custom extension 요청 처리하기](/Develop/Guides/Build_Custom_Extension.md#HandleCustomExtensionRequest) 문서를 참조합니다. 79 | 80 | ### Skill {#Skill} 81 | 82 | CLOVA가 제공하는 사용자에게 제공하는 확장 기능이나 서비스를 의미합니다. Skill을 사용자에게 제공하려면 [CLOVA extension](#CLOVAExtension)을 개발해야 합니다. 83 | 84 | ### Skill Store {#SkillStore} 85 | 86 | Skill이 사용자에게 제공될 수 있도록 만든 플랫폼입니다. 87 | 88 | ### Skill Store 홈 {#SkillStoreHome} 89 | 90 | Skill Store에 등록된 skill이 표시되는 페이지입니다. CLOVA 앱의 **확장 서비스 관리** 메뉴를 지칭하는 용어입니다. 91 | 92 | ### Slot {#Slot} 93 | [Intent](#Intent)에 선언된 요청을 처리할 때 필요한 정보이며, intent를 정의할 때 함께 정의해야 합니다. CLOVA는 사용자 요청을 분석한 후 slot에 해당하는 정보를 추출하게 됩니다. 자세한 내용은 [interaction 모델 정의](/Design/Design_Custom_Extension.md#DefineInteractionModel)를 참조합니다. 94 | 95 | ### 사용자 계정 연결 (Account Linking) {#AccountLinking} 96 | 사용자의 계정 인증(authentication)이 필요한 외부 서비스를 [extension](#CLOVAExtension)이 제공해야 할 때 사용됩니다. 자세한 내용은 [사용자 계정 연결하기](/Develop/Guides/Link_User_Account.md) 문서를 참조합니다. 97 | 98 | ### 사용자 발화 예시 {#UserUtteranceExample} 99 | 100 | 사용자의 요청 발화가 어떤 식으로 입력될 수 있는지 예문을 표현한 목록입니다. [Intent](#Intent)별로 복수의 사례를 정의할 수 있으며, 예문에는 [slot](#Slot)이 표시됩니다. 자세한 내용은 [interaction 모델 정의](/Design/Design_Custom_Extension.md#DefineInteractionModel)를 참조합니다. 101 | 102 | ### 세션 ID {#SessionID} 103 | 세션 ID는 [extension](#CLOVAExtension)이 사용자 요청의 맥락을 구분하기 위한 세션 식별자입니다. 일반적으로 일회성의 사용자 요청은 매번 달라지는 세션 ID를 가지지만, 특정 모드나 연속되는(multi-turn) 사용자의 요청이면 같은 세션 ID를 가집니다. 이 세션 ID는 [CLOVA Extensions Kit](#CEK)가 extension에 사용자 요청을 전달할 때 생성됩니다. 세션 ID가 유지되는 때는 [LaunchRequest](#LaunchRequest)와 같은 요청을 받거나 extension이 필요에 의해 `response.shouldEndSession` 필드를 `false`로 설정했을 때입니다. 자세한 내용은 [Custom extension 만들기](/Develop/Guides/Build_Custom_Extension.md) 문서를 참조합니다. 104 | 105 | 106 | -------------------------------------------------------------------------------- /ko-KR/Develop/Tutorials/Use_Builtin_Type_Slots.md: -------------------------------------------------------------------------------- 1 | # 사용자가 입력한 정보 활용하기 2 | 이 튜토리얼에서는 [기초적인 extension 만들기](/Develop/Tutorials/Build_Simple_Extension.md)에서 만든 샘플 주사위 extension이 사용자의 요청에 따라 주사위를 1 개 이상 던지도록 하는 법을 알아봅니다. 3 | 4 | 사용자의 음성 명령에는 extension이 수행할 동작 외에 그 동작에 필요한 추가적인 정보가 들어있을 수 있습니다. [튜토리얼 개요](/Develop/Tutorials/Introduction.md)에서 기술한 샘플 주사위 extension을 사용법을 다시 봅시다. 5 | 6 | {% include "/Develop/Tutorials/BasicInformation/DICE_Sample_Dialog.md" %} 7 | 8 | 두 번째 대화에서 사용자는 "주사위 **2 개** 던져줘"라고 요청했고, 여기서 "2 개"가 바로 "주사위 던지기"라는 동작에 필요한 추가적인 정보입니다. 9 | 10 | Interaction 모델에서는 이런 추가 정보를 [slot](/Design/Design_Custom_Extension.md#Slot)이라고 부릅니다. Extension에서 추가 정보를 사용하려면, interaction 모델을 정의할 때 어떤 추가 정보가 들어올지 미리 파악한 뒤 알맞은 slot을 등록해야 합니다. CLOVA는 이렇게 등록된 slot을 기반으로 사용자 요청에 포함된 추가 정보를 알아낼 수 있습니다. 11 | 12 | 추가 정보를 처리하는 방법은 다음과 같습니다. 13 | * 1 단계. Interaction 모델에 slot 등록(CLOVA developer console에서 작업) 14 | * 2 단계. Slot 처리 구현(Extension 서버에서 작업) 15 | * 3 단계. Slot 동작 테스트(CLOVA developer console에서 작업) 16 | 17 | ## 1 단계. Interaction 모델에 slot 등록 {#Step1} 18 | 19 | 사용자가 던질 주사위의 개수를 지정할 수 있도록 interaction 모델을 수정해야 합니다. 20 | 21 | 이를 위해 우선 slot에 담을 정보 유형을 결정하여 interaction 모델에 slot 타입을 선언하고, 이 타입을 사용할 slot을 intent에 등록한 뒤, 추가 정보가 포함된 사용자 발화 예시를 입력하여 CLOVA가 slot을 인식할 수 있도록 해줍니다. 22 | 23 | ### 사용할 slot 타입 선언하기 24 | Slot에 담을 추가 정보의 유형에 따라 slot의 타입을 정해야 합니다. 예를 들어, 주사위의 개수는 숫자로 나타낼 수 있습니다. 25 | 26 | CLOVA는 모든 extension이 범용적으로 사용할 수 있도록 일반적으로 쓰이는 정보 유형을 미리 정의해두었고, 이를 [built-in slot 타입](/Design/Design_Custom_Extension.md#BuiltinSlotType)이라고 합니다. 숫자 타입은 `CLOVA.NUMBER`라는 built-in slot 타입으로 정의되어 있으므로, 주사위의 개수를 처리하기 위한 별도의 유형을 만들지 않아도 됩니다. 27 | 28 |
29 |

Tip!

30 |

Built-in slot 타입으로 정의되지 않은 extension 고유의 정보 유형은 custom slot 타입을 정의하여 처리할 수 있습니다.

31 |
32 | 33 | CLOVA developer console에 접속하여 다음과 같이 샘플 주사위 extension에서 사용할 slot 타입을 선언합니다. 34 | 35 | 1. 샘플 주사위의 **{{ book.DevConsole.cek_interaction_model }}** 항목 내 **{{ book.DevConsole.cek_edit }}** 버튼을 누르십시오. 36 | 2. **{{ book.DevConsole.cek_builder_list_title_slottype }}** 오른쪽에 있는 버튼을 누르십시오. 37 | 3. **{{ book.DevConsole.cek_builder_new_slottype_builtin_title }}** 아래의 테이블에서 `CLOVA.NUMBER`의 체크박스를 선택합니다.
38 | ![CEK_Tutorial_Builtin_Type_Slots_Register_Slot_Type](/Develop/Assets/Images/CEK_Tutorial_Builtin_Type_Slots_Register_Slot_Type.png) 39 | 4. **{{ book.DevConsole.cek_builder_new_slottype_builtin_title }}** 오른쪽의 **{{ book.DevConsole.cek_save }}** 버튼을 누르십시오. 40 | 41 | ### Intent에 slot 등록하기 42 | 던질 주사위의 개수는 주사위를 던지는 동작에 필요한 추가 정보입니다. 주사위를 던지는 동작은 첫 번째 튜토리얼에서 `ThrowDiceIntent`라는 intent로 등록했으므로, 이 intent에 주사위의 개수를 의미하는 slot을 등록해야 합니다. 43 | 앞서 slot 타입을 선언했던 화면에서 다음과 같이 slot을 등록합니다. 44 | 45 | 1. **{{ book.DevConsole.cek_builder_list_title_intent }}** 아래에 있는 custom intent인 `ThrowDiceIntent`를 선택하십시오. 46 | 2. **{{ book.DevConsole.cek_builder_intent_slot_title }}** 아래의 입력란에 "diceCount"라고 입력하십시오. 47 | 3. 엔터키 또는 오른쪽에 있는 버튼을 누르십시오. 48 | 4. 등록한 "diceCount" 오른쪽 **{{ book.DevConsole.cek_builder_utterance_select_slot }}** 콤보박스를 누르십시오. 49 | 5. 나타난 목록 중에서 앞서 등록한 **{{ book.DevConsole.cek_builder_select_slottype_builtin }}**의 `CLOVA.NUMBER`를 선택하십시오.
50 | ![CEK_Tutorial_Builtin_Type_Slots_Add_Slot](/Develop/Assets/Images/CEK_Tutorial_Builtin_Type_Slots_Add_Slot.png) 51 | 6. 화면 오른쪽 상단의 **{{ book.DevConsole.cek_save }}** 버튼을 누르십시오. 52 | 53 | ### 발화 예시 입력하기 54 | 첫 번째 튜토리얼에서는 단순히 주사위를 던져달라는 문장만 예시로 입력했으나, 이제는 slot을 이용하여 주사위 개수를 지정하는 새로운 문장을 예시로 입력해야 합니다. 55 | 56 | 앞서 slot을 등록했던 화면에서 다음과 같이 발화 예시 문장을 입력합니다. 57 | 58 | 1. **{{ book.DevConsole.cek_builder_intent_expression_title }}** 아래의 입력란에 "주사위 두 개 굴려"라고 입력하십시오.
59 | ![CEK_Tutorial_Builtin_Type_Slots_Sample_Utterance](/Develop/Assets/Images/CEK_Tutorial_Builtin_Type_Slots_Sample_Utterance.png) 60 | 2. 엔터키 또는 버튼을 누르십시오. 61 | 3. 등록된 문장에서 "두 개"라는 단어를 마우스로 드래그하여 선택하십시오. 62 | 4. **{{ book.DevConsole.cek_builder_slot_layer_select_slot }}** 밑에 있는 "diceCount"를 선택하십시오.
63 | ![CEK_Tutorial_Builtin_Type_Slots_Set_Slot](/Develop/Assets/Images/CEK_Tutorial_Builtin_Type_Slots_Set_Slot.png) 64 | 5. "하나 던져봐", "다섯 개의 주사위 굴려"라는 문장으로 1-4 단계를 반복하십시오. 65 | 66 | ## 2 단계. Slot 처리 구현 {#Step2} 67 | 68 | 샘플 주사위 extension이 slot을 처리할 수 있도록 코드를 변경해야 합니다. 69 | 여기서는 사전에 구현된 소스 코드를 참고하여 어떤 부분이 변경되었는지 살펴보기 위해 [첫 번째 튜토리얼](/Develop/Tutorials/Build_Simple_Extension.md)의 저장소를 재사용합니다. 70 | 다음과 같이 로컬 저장소로 이동하여 `tutorial3` 브랜치로 전환합니다. 71 | 72 | ```bash 73 | cd /path/to/your_sample_dice_directory 74 | git fetch 75 | git checkout tutorial3 76 | ``` 77 | 78 | 샘플 주사위 extension은 `clova/index.js` 파일의 `intentRequest()`에서 slot을 처리합니다. 79 | 80 | ```javascript 81 | intentRequest(cekResponse) { 82 | const intent = this.request.intent.name 83 | const slots = this.request.intent.slots 84 | 85 | switch (intent) { 86 | case "ThrowDiceIntent": 87 | let diceCount = 1 88 | if (!!slots) { 89 | const diceCountSlot = slots.diceCount 90 | if (slots.length != 0 && diceCountSlot) { 91 | diceCount = parseInt(diceCountSlot.value) 92 | } 93 | 94 | if (isNaN(diceCount)) { 95 | diceCount = 1 96 | } 97 | } 98 | ... 99 | } 100 | ... 101 | } 102 | ``` 103 | 104 | 위 코드에서 보는 것처럼, CLOVA로부터 받은 요청 메시지에서 slot 정보를 추출(`this.request.intent.slots`)한 뒤 , 앞서 interaction 모델에 등록한 "diceCount"라는 slot(`slots.diceCount`)이 있으면 그 값을 정수 형태로 읽어옵니다. 이렇게 읽은 값이 던질 주사위의 개수이며, slot이 없거나 정수 형태의 값인 아니면 기본값인 1로 판단합니다. 105 | 106 | 변경된 코드를 extension 서버에서 실행합니다. 107 | 108 | ## 3 단계. Slot 동작 테스트 {#Step3} 109 | 110 | 샘플 주사위 extension이 등록한 slot을 잘 처리하는지 테스트해야 합니다. 111 | 112 | [첫 번째 튜토리얼](/Develop/Tutorials/Build_Simple_Extension.md)에서처럼 두 가지 테스트 방법이 있습니다. 하나는 CLOVA developer console에서 interaction 모델 동작을 확인하는 것이고, 다른 하나는 테스터 아이디를 등록하여 CLOVA 앱에서 실제 동작을 확인하는 것입니다. 113 | 이 튜토리얼에서는 interaction 모델 동작만 확인합니다. 114 | 115 | CLOVA developer console에 접속하여 다음과 같이 샘플 주사위 extension이 주사위 개수를 잘 인식하는지 확인합니다. 116 | 117 |
    118 |
  1. 샘플 주사위의 {{ book.DevConsole.cek_interaction_model }} 항목 내 {{ book.DevConsole.cek_edit}} 버튼을 누르십시오.
  2. 119 |
  3. 화면 좌측 상단의 {{ book.DevConsole.cek_builder_menu_build }} 버튼을 눌러 interaction 모델을 빌드하십시오.
  4. 120 |
  5. 빌드가 끝난 후, 왼쪽의 메뉴 목록에서 {{ book.DevConsole.cek_test }} 메뉴를 선택하십시오.
  6. 121 |
  7. {{ book.DevConsole.cek_builder_test_expression_title }}에 주사위를 여러 개 던져달라는 문장을 입력하십시오. 예를 들어, "주사위 두 개 던져볼래"라고 입력합니다.
  8. 122 |
  9. 엔터키 또는 {{ book.DevConsole.cek_builder_test_request_test }} 버튼을 누르십시오.
  10. 123 |
  11. {{ book.DevConsole.cek_builder_test_result_title }}{{ book.DevConsole.cek_builder_test_intent_result }} 항목에 ThrowDiceIntent, {{ book.DevConsole.cek_builder_test_slot_result }} 항목에 diceCount가 나타나고, {{ book.DevConsole.cek_builder_test_slot_data}}에 입력한 주사위 개수가 나타나는지 확인하십시오.
    124 | 125 |
    126 |

    Note!

    127 |

    외부에서 접근할 수 있는 extension 서버 URI를 등록하지 않았다면, {{ book.DevConsole.cek_builder_test_service_response }}은 "{{ book.DevConsole.cek_builder_test_no_response }}"라고 나타납니다.

    128 |
    129 |
  12. 130 |
  13. "주사위 열 개 굴려", "네 개 주사위 던져"와 같은 문장으로 4-6 단계를 반복하십시오.
  14. 131 |
132 | 133 | 인식이 잘 되지 않으면 좀 더 다양한 발화 예시를 추가하여 인식 확률을 높일 수 있습니다. 134 | 135 | 이제 샘플 주사위 extension은 주사위를 1 개 이상 던질 수 있게 되었습니다. 136 | 같은 방법으로 주사위를 1 번 이상 던지게 하거나 숫자가 아닌 다른 값을 가진 주사위를 던지게 할 수 있습니다. 137 | -------------------------------------------------------------------------------- /ko-KR/DevConsole/Guides/Deploy_Custom_Extension.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Custom extension 배포하기 4 | [Custom extension](/Develop/Guides/Build_Custom_Extension.md)을 [CLOVA developer console에 등록](/DevConsole/Guides/Register_Custom_Extension.md)했다면 등록한 custom extension을 CLOVA 서비스에 배포할 수 있습니다. 배포하면 일반 사용자들이 **{{ book.DevConsole.ManageCustomExtensions }}**에서 배포된 custom extension을 사용할 수 있게 됩니다. 5 | 6 | Custom extension을 배포할 때 일반적으로 다음 항목을 수행해야 합니다. 7 | 8 | * [배포 정보 입력](#InputDeploymentInfo) 9 | * [개인 정보 및 규정 준수 정보 입력](#InputComplianceInfo) 10 | * [심사 신청하기](#RequestExtensionSubmission) 11 | 12 | ## 배포 정보 입력 {#InputDeploymentInfo} 13 | 14 | CLOVA developer console에서 [custom extension](/DevConsole/Guides/Register_Custom_Extension.md)과 [Interaction 모델을 등록](/DevConsole/Guides/Register_Interaction_Model.md)한 후 배포 정보를 입력할 수 있습니다. Custom extension 등록 메뉴에서 **{{ book.DevConsole.cek_publishing }}**를 선택합니다. 15 | 16 | ![DevConsole-Custom_Extension_Deployment_Info_Menu](/DevConsole/Assets/Images/DevConsole-Custom_Extension_Deployment_Info_Menu.png) 17 | 18 | 다음과 같이 배포 정보를 입력합니다. 19 | 20 | ![DevConsole-Input_Custom_Extension_Deployment_Info](/DevConsole/Assets/Images/DevConsole-Input_Custom_Extension_Deployment_Info.png) 21 | 22 | Custom extension을 사용자에게 설명하기 위한 정보로서 **{{ book.DevConsole.ManageCustomExtensions }}**에서 사용자에게 제공됩니다. 다음과 같은 정보들이 입력됩니다. 23 | 24 | * **{{ book.DevConsole.cek_category }}**: Custom extension의 종류로서 사용자가 custom extension 종류별로 목록을 확인하거나 검색할 때 이용됩니다. 25 | * **{{ book.DevConsole.cek_test_instructions }}**: [Custom extension 승인](#RequestExtensionSubmission) 프로세스에서 승인 담당자가 custom extension을 검증하는데 필요한 참고 정보로서 일반 사용자에게는 노출되지 않습니다. 안내 문구에 따라 작성합니다. 26 | * 서비스 국가 및 지역: 현재는 한국에만 custom extension을 배포할 수 있습니다. 27 | * **{{ book.DevConsole.cek_full_skill_desc }}**: **{{ book.DevConsole.ExtensionPage }}**에서 사용자에게 제공할 custom extension의 설명입니다. 안내 문구에 따라 작성합니다. 28 | * **{{ book.DevConsole.cek_short_skill_desc }}**: {{ book.DevConsole.StoreHome }}에서 프로모션 안내 문구와 같은 것을 표시할 때 사용될 수 있는 설명입니다. 29 | * **{{ book.DevConsole.cek_example_phrases }}**: 사용자가 custom extension을 어떻게 사용할 수 있는지 보여주는 예시문입니다. **{{ book.DevConsole.ExtensionPage }}**에 표시됩니다. 특히, 첫 번째 예시문은 {{ book.DevConsole.StoreHome }}에서 custom extension 목록을 보여줄 때 표시됩니다. 30 | * **{{ book.DevConsole.cek_keywords }}**: 사용자가 특정 키워드로 custom extension을 검색할 때 그 검색 결과에 custom extension이 나타날 수 있도록 해줍니다. 31 | * **{{ book.DevConsole.cek_small_icon }}**: 작은 크기(108px X 108px)의 custom extension 아이콘 파일입니다. **{{ book.DevConsole.ManageCustomExtensions }}**이나 **{{ book.DevConsole.ExtensionPage }}**에 표시됩니다. 32 | * **{{ book.DevConsole.cek_large_icon }}**: 큰 크기(512px X 512px)의 custom extension 아이콘 파일로서 추후 사용될 예정입니다. 33 | 34 | 이렇게 입력된 정보는 **{{ book.DevConsole.ManageCustomExtensions }}**에서 다음과 같이 표시됩니다. 35 | 36 | | {{ book.DevConsole.StoreHome }} | {{ book.DevConsole.ExtensionPage }} | 37 | |-------------------|-------------------| 38 | | ![Custom extension List](/DevConsole/Assets/Images/DevConsole-Store_UI_Example-Custom_Extension_Store_Home.png) | ![Custom extension Details](/DevConsole/Assets/Images/DevConsole-Store_UI_Example-Custom_Extension_Page.png) | 39 | 40 |
41 |

Tip!

42 |

{{ book.DevConsole.ExtensionPage }}에 표시되는 일부 정보는 Extension 기본 정보를 등록할 때 입력된 정보를 활용합니다.

43 |
44 | 45 | ## 개인 정보 보호 및 규정 준수 정보 입력 {#InputComplianceInfo} 46 | 47 | Custom extension 배포에 필요한 정보를 입력하는 마지막 단계로서 개인 정보 관리 및 규정 준수에 관련된 내용을 입력해야 합니다. Custom extension 등록 메뉴에서 **{{ book.DevConsole.cek_privacy }}**를 선택합니다. 48 | 49 | ![DevConsole-Custom_Extension_Policy_Menu](/DevConsole/Assets/Images/DevConsole-Custom_Extension_Policy_Menu.png) 50 | 51 | 다음과 같이 정보를 입력합니다. 52 | 53 | ![DevConsole-Input_Custom_Extension_Policy](/DevConsole/Assets/Images/DevConsole-Input_Custom_Extension_Policy.png) 54 | 55 | * **{{ book.DevConsole.cek_allow_purchase }}**: Custom extension을 사용할 때 사용자가 결제하거나 지불해야 하는 부분이 있으면 **{{ book.DevConsole.cek_yes }}**를 선택합니다. 56 | * **{{ book.DevConsole.cek_use_personal_info }}**: Custom extension이 사용자의 개인 정보를 수집한다면 **{{ book.DevConsole.cek_yes }}**를 선택합니다. 57 | * **{{ book.DevConsole.cek_child_directed }}**: 미성년자가 custom extension을 사용해도 되면 **{{ book.DevConsole.cek_yes }}**를 선택합니다. 58 | * **{{ book.DevConsole.cek_privacy_policy_url }}**: Custom extension이 개인 정보를 수집한다면 이와 관련된 정책 정보 페이지를 입력합니다. 이는 custom extension 설명 페이지의 맨 아래에 표시됩니다. 59 | * **{{ book.DevConsole.cek_terms_of_use }}**: Custom extension과 관련한 면책 조항을 보여주는 페이지를 입력합니다. 이는 개인 정보 정책 URI와 같이 custom extension 설명 페이지의 맨 아래에 표시됩니다. 60 | 61 | **{{ book.DevConsole.cek_privacy_policy_url }}**과 **{{ book.DevConsole.cek_terms_of_use }}**에 입력된 내용은 **{{ book.DevConsole.ExtensionPage }}**에서 다음과 같이 표시됩니다. 62 | 63 | ![DevConsole-Store_UI_Example-Extension_Policy](/DevConsole/Assets/Images/DevConsole-Store_UI_Example-Extension_Policy.png) 64 | 65 | 66 | 67 | ## 심사 신청하기 {#RequestExtensionSubmission} 68 | 69 | Custom extension의 [배포 정보](#InputDeploymentInfo)와 [개인 정보 보호 및 규정 준수 정보](#InputComplianceInfo)까지 입력이 완료되었다면 마지막 단계로 등록한 extension에 대해 extension 심사를 신청할 수 있습니다. CLOVA의 운영자는 등록한 extension의 정보와 실제 실행 여부 및 적합성을 심사하게 됩니다. 70 | 71 | * Extension이 정상 동작하고 검수 시 특별한 문제 사항이 없다면 extension은 심사를 통과하게 될 것이며, 심사를 통과하면 즉시 extension을 배포할 수 있게 됩니다. 72 | * 만약, 심사 과정에서 실행 오류가 있거나 사용자 시나리오 상의 심각한 문제가 발견되면 운영자에 의해 배포 요청이 거절되며 심사 신청하기 전 단계로 돌아가게 됩니다. 73 | 74 | ![DevConsole-Extension_Submission_Process](/DevConsole/Assets/Images/DevConsole-Extension_Submission_Process.png) 75 | 76 | 등록한 extension 목록에서 **{{ book.DevConsole.cek_request_submit }}** 메뉴를 클릭하여 extension 심사를 신청할 수 있습니다. 77 | 78 | ![DevConsole-Submit_Extension_1](/DevConsole/Assets/Images/DevConsole-Submit_Extension_1.png) 79 | 80 | 또는 [개인 정보 보호 및 규정 준수 정보](#InputComplianceInfo)를 입력하는 화면 마지막에 있는 **{{ book.DevConsole.cek_request_submit }}** 버튼을 클릭해도 됩니다. 81 | 82 | ![DevConsole-Submit_Extension_2](/DevConsole/Assets/Images/DevConsole-Submit_Extension_2.png) 83 | 84 | **{{ book.DevConsole.cek_request_submit }}**을 누르면 다음과 같이 운영자에게 해당 심사 신청에 대한 정보를 남길 수 있습니다. Extension의 첫 번째 심사 신청이라면 최초 심사 요청이라는 메시지와 어떤 extension인지 설명하는 메시지를 남기면 됩니다. Extension을 수정하여 재심사를 요청할 때는 개선된 사항이나 반려 의견 반영 여부를 입력하면 됩니다. 85 | 86 | ![DevConsole-Submission_Request_Message](/DevConsole/Assets/Images/DevConsole-Submission_Request_Message.png) 87 | 88 |
89 |

Note!

90 |

심사 중에는 extension의 정보와 interaction 모델도 수정할 수 없습니다.

91 |
92 | 93 | Skill 심사는 **{{ book.DevConsole.ManageCustomExtensions }}**에 반영하기 전에 진행되며 심사를 위한 별도 환경에서 진행됩니다. 만약, [사용자 계정 연결](/Develop/Guides/Link_User_Account.md)이 필요한 서비스이면 [배포 정보를 입력](#InputDeploymentInfo)할 때 테스트를 위한 계정 정보를 **{{ book.DevConsole.cek_test_instructions }}** 항목에 입력해야 합니다. 94 | 95 | 심사할 때 다음과 같은 항목을 평가합니다. 96 | 97 | * [사용 시나리오](/Design/Design_Custom_Extension.md#MakeUseCaseScenarioScript) 및 콘텐츠 검증 98 | * 대화 문맥 상 어색한 부분이 있는지 확인합니다. 99 | * 시나리오 상 사용되는 발화 데이터에 금칙어, 민감어가 있는지 확인합니다. 100 | * [준수 사항 및 운영 정책](/TermsAndPolicy/Terms_And_Policy.md)을 지켰는지 확인합니다. 101 | * Custom extension이 [사용자 계정을 연결](/Develop/Guides/Link_User_Account.md)한다면 서비스에 특화된 부분을 더 검토할 수 있습니다. 102 | * 동작 검증 103 | * Custom extension이 서비스에 적합한 용어를 사용하고 있는지 확인합니다. 104 | * Intent나 slot에 문제가 없는지 interaction 모델을 검증합니다. 105 | * Skill [세부 목표](/Design/Design_Custom_Extension.md#SetGoal)에 부합되는 서비스를 제공하고 있는지 확인합니다. 106 | * 배포 정보 검증 107 | * Custom extension의 설명, 카테고리, 검색 키워드와 같이 입력된 배포 정보가 Custom extension에 맞게 입력되었는지 확인합니다. 108 | * Skill이 개인 정보 관리 규정과 같이 설정된 정책에 맞게 동작하는지 확인합니다. 109 | 110 | 심사 중에 **{{ book.DevConsole.cek_cancel_review }}** 메뉴를 누르면 언제든지 심사 신청을 취소할 수 있습니다. 심사 신청을 취소하면 이전 상태로 돌아갑니다. 111 | 112 | ![DevConsole-Cancel_Submission](/DevConsole/Assets/Images/DevConsole-Cancel_Submission.png) 113 | 114 | 심사에 통과하지 못하면 extension의 **{{ book.DevConsole.cek_status }}**가 **{{ book.DevConsole.cek_status_rejected }}**으로 변경됩니다. 이 상태는 **{{ book.DevConsole.cek_status_dev }}**인 상태와 같은 상태이며 다시 심사를 신청할 수 있습니다. 115 | 116 | ![DevConsole-Extension_Submission_Rejected](/DevConsole/Assets/Images/DevConsole-Extension_Submission_Rejected.png) 117 | 118 | 이때, **{{ book.DevConsole.cek_message }}**의 **{{ book.DevConsole.cek_view }}** 메뉴를 누르면 심사에 대한 피드백을 확인할 수 있습니다. 119 | 120 | ![DevConsole-Show_Submission_Feedback](/DevConsole/Assets/Images/DevConsole-Show_Submission_Feedback.png) 121 | 122 | 123 | -------------------------------------------------------------------------------- /ko-KR/SUMMARY.md: -------------------------------------------------------------------------------- 1 | ## About this document 2 | 3 | * [시작하기 전에](/README.md) 4 | * [문서 정보](/Document_Info.md) 5 | * [용어 및 약어](/Glossary.md) 6 | 7 | ## Design guidelines 8 | 9 | * [Custom extension 설계](/Design/Design_Custom_Extension.md) 10 | * [목표 수립](/Design/Design_Custom_Extension.md#SetGoal) 11 | * [사용 시나리오 스크립트 작성](/Design/Design_Custom_Extension.md#MakeUseCaseScenarioScript) 12 | * [Interaction 모델 정의](/Design/Design_Custom_Extension.md#DefineInteractionModel) 13 | * [Intent](/Design/Design_Custom_Extension.md#Intent) 14 | * [Built-in intent](/Design/Design_Custom_Extension.md#BuiltinIntent) 15 | * [Custom intent](/Design/Design_Custom_Extension.md#CustomIntent) 16 | * [Slot](/Design/Design_Custom_Extension.md#Slot) 17 | * [Built-in slot 타입](/Design/Design_Custom_Extension.md#BuiltinSlotType) 18 | * [Custom slot 타입](/Design/Design_Custom_Extension.md#CustomSlotType) 19 | * [발화 예시](/Design/Design_Custom_Extension.md#UtteranceExample) 20 | * [응답 유형 결정](/Design/Design_Custom_Extension.md#DecideSoundOutputType) 21 | * [음성 출력 유형](/Design/Design_Custom_Extension.md#OutputSpeech) 22 | * [오디오 콘텐츠 재생 유형](/Design/Design_Custom_Extension.md#AudioPlayer) 23 | * [지속적인 업데이트](/Design/Design_Custom_Extension.md#ContinuousUpdate) 24 | * [플랫폼 지원 오디오 포맷](/Design/Supported_Audio_Format.md) 25 | 26 | ## Guides 27 | 28 | * [CEK 개요](/Develop/CEK_Overview.md) 29 | * [CEK란?](/Develop/CEK_Overview.md#WhatisCEK) 30 | * [CEK 구성 및 동작 구조](/Develop/CEK_Overview.md#CEKComponentsAndOperationStructure) 31 | * [Extension 종류](/Develop/CEK_Overview.md#ExtensionType) 32 | * [튜토리얼](/Develop/Tutorials/Introduction.md) 33 | * [기초적인 Extension 만들기](/Develop/Tutorials/Build_Simple_Extension.md) 34 | * [1 단계. Extension 서버 준비](/Develop/Tutorials/Build_Simple_Extension.md#Step1) 35 | * [2 단계. Extension 기본 정보 등록](/Develop/Tutorials/Build_Simple_Extension.md#Step2) 36 | * [3 단계. Interaction 모델 등록](/Develop/Tutorials/Build_Simple_Extension.md#Step3) 37 | * [4 단계. Extension 실제 동작 테스트](/Develop/Tutorials/Build_Simple_Extension.md#Step4) 38 | * [기본적인 의사 표현 처리하기](/Develop/Tutorials/Handle_Builtin_Intents.md) 39 | * [1 단계. Built-in intent 처리 구현](/Develop/Tutorials/Handle_Builtin_Intents.md#Step1) 40 | * [2 단계. Built-in intent 동작 테스트](/Develop/Tutorials/Handle_Builtin_Intents.md#Step2) 41 | * [사용자가 입력한 정보 활용하기](/Develop/Tutorials/Use_Builtin_Type_Slots.md) 42 | * [1 단계. Interaction 모델에 slot 등록](/Develop/Tutorials/Use_Builtin_Type_Slots.md#Step1) 43 | * [2 단계. Slot 처리 구현](/Develop/Tutorials/Use_Builtin_Type_Slots.md#Step2) 44 | * [3 단계. Slot 동작 테스트](/Develop/Tutorials/Use_Builtin_Type_Slots.md#Step3) 45 | * [Custom extension 만들기](/Develop/Guides/Build_Custom_Extension.md) 46 | * [사전 준비사항](/Develop/Guides/Build_Custom_Extension.md#Preparation) 47 | * [Custom extension 요청 처리하기](/Develop/Guides/Build_Custom_Extension.md#HandleCustomExtensionRequest) 48 | * [LaunchRequest 요청 처리](/Develop/Guides/Build_Custom_Extension.md#HandleLaunchRequest) 49 | * [IntentRequest 요청 처리](/Develop/Guides/Build_Custom_Extension.md#HandleIntentRequest) 50 | * [SessionEndedRequest 요청 처리](/Develop/Guides/Build_Custom_Extension.md#HandleSessionEndedRequest) 51 | * [요청 메시지 검증](/Develop/Guides/Build_Custom_Extension.md#RequestMessageValidation) 52 | * [Custom extension 응답 반환하기](/Develop/Guides/Build_Custom_Extension.md#ReturnCustomExtensionResponse) 53 | * [Multi-turn 대화 수행하기](/Develop/Guides/Do_Multiturn_Dialog.md) 54 | * [오디오 콘텐츠 제공하기](/Develop/Guides/Provide_Audio_Content.md) 55 | * [오디오 콘텐츠 재생 지시](/Develop/Guides/Provide_Audio_Content.md#DirectClientToPlayAudio) 56 | * [오디오 콘텐츠 재생 제어](/Develop/Guides/Provide_Audio_Content.md#ControlAudioPlayback) 57 | * [오디오 콘텐츠의 메타 정보 제공](/Develop/Guides/Provide_Audio_Content.md#ProvidingMetaDataForDisplay) 58 | * [재생 상태 변경 및 경과 보고 수집](/Develop/Guides/Provide_Audio_Content.md#CollectPlaybackStatusAndProgress) 59 | * [보안을 위한 오디오 콘텐츠 URI 갱신](/Develop/Guides/Provide_Audio_Content.md#UpdateAudioURIForSecurity) 60 | * [재생 제어의 동작 방식 변경](/Develop/Guides/Provide_Audio_Content.md#CustomizePlaybackControl) 61 | * [음성 재생 상태 확인하기](/Develop/Guides/Monitor_TTS_Playback_Status.md) 62 | * [사용자 계정 연결하기](/Develop/Guides/Link_User_Account.md) 63 | * [계정 연결 동작 이해하기](/Develop/Guides/Link_User_Account.md#UnderstandAccountLinking) 64 | * [계정 연결 설정](/Develop/Guides/Link_User_Account.md#SetupAccountLinking) 65 | * [계정 연결 후 extension 호출](/Develop/Guides/Link_User_Account.md#ExtensionInvokingAfterAccountLinking) 66 | * [계정 연결 적용하기](/Develop/Guides/Link_User_Account.md#ApplyAccountLinking) 67 | * [인증 서버 구축](/Develop/Guides/Link_User_Account.md#BuildAuthServer) 68 | * [계정 권한 검증 구현](/Develop/Guides/Link_User_Account.md#AddValidationLogic) 69 | * [계정 연결 정보 등록](/Develop/Guides/Link_User_Account.md#RegisterAccountLinkingInfo) 70 | * [Extension 예제](/Develop/Examples/Extension_Examples.md) 71 | * [마법 구슬(Magic ball)](/Develop/Examples/Extension_Examples.md#MagicBall) 72 | * [빗소리(Rain sound)](/Develop/Examples/Extension_Examples.md#RainSound) 73 | * [주사위 놀이(Dice drawer)](/Develop/Examples/Extension_Examples.md#DiceDrawer) 74 | * [코인 헬퍼(Coin helper)](/Develop/Examples/Extension_Examples.md#CoinHelper) 75 | 76 | ## References 77 | 78 | * [HTTP 메시지](/Develop/References/HTTP_Message.md) 79 | * [HTTP 헤더](/Develop/References/HTTP_Message.md#HTTPHeader) 80 | * [HTTP 본문](/Develop/References/HTTP_Message.md#HTTPBody) 81 | * [Custom extension 메시지](/Develop/References/Custom_Extension_Message.md) 82 | * [요청 메시지](/Develop/References/Custom_Extension_Message.md#CustomExtRequestMessage) 83 | * [요청 타입](/Develop/References/Custom_Extension_Message.md#CustomExtRequestType) 84 | * [`EventRequest`](/Develop/References/Custom_Extension_Message.md#CustomExtEventRequest) 85 | * [`IntentRequest`](/Develop/References/Custom_Extension_Message.md#CustomExtIntentRequest) 86 | * [`LaunchRequest`](/Develop/References/Custom_Extension_Message.md#CustomExtLaunchRequest) 87 | * [`SessionEndedRequest`](/Develop/References/Custom_Extension_Message.md#CustomExtSessionEndedRequest) 88 | * [응답 메시지](/Develop/References/Custom_Extension_Message.md#CustomExtResponseMessage) 89 | * [SpeechInfoObject](/Develop/References/Custom_Extension_Message.md#CustomExtSpeechInfoObject) 90 | 91 | ## Developer console guides 92 | 93 | * [CLOVA developer console 개요](/DevConsole/ClovaDevConsole_Overview.md) 94 | * [Custom extension 등록하기](/DevConsole/Guides/Register_Custom_Extension.md) 95 | * [이용 약관 및 개인 정보 수집 동의](/DevConsole/Guides/Register_Custom_Extension.md#AgreeTermsOfUse) 96 | * [Custom extension 기본 정보 입력](/DevConsole/Guides/Register_Custom_Extension.md#InputExtensionInfo) 97 | * [서버 연동 설정](/DevConsole/Guides/Register_Custom_Extension.md#SetServerConnection) 98 | * [계정 연결 설정](/DevConsole/Guides/Register_Custom_Extension.md#SetAccountLinking) 99 | * [Interaction 모델 등록하기](/DevConsole/Guides/Register_Interaction_Model.md) 100 | * [Built-in slot 타입 추가하기](/DevConsole/Guides/Register_Interaction_Model.md#AddBuiltinSlotType) 101 | * [Custom slot 타입 추가하기](/DevConsole/Guides/Register_Interaction_Model.md#AddCustomSlotType) 102 | * [Built-in intent 추가하기](/DevConsole/Guides/Register_Interaction_Model.md#AddBuiltinIntent) 103 | * [Custom intent 추가하기](/DevConsole/Guides/Register_Interaction_Model.md#AddCustomIntent) 104 | * [Custom extension 테스트하기](/DevConsole/Guides/Test_Custom_Extension.md) 105 | * [Interaction 모델 빌드하기](/DevConsole/Guides/Test_Custom_Extension.md#BuildInteractionModel) 106 | * [Interaction 모델 테스트하기](/DevConsole/Guides/Test_Custom_Extension.md#TestInteractionModel) 107 | * [CLOVA 앱으로 custom extension 테스트하기](/DevConsole/Guides/Test_Custom_Extension.md#TestOnCLOVAApp) 108 | * [Custom extension 배포하기](/DevConsole/Guides/Deploy_Custom_Extension.md) 109 | * [배포 정보 입력](/DevConsole/Guides/Deploy_Custom_Extension.md#InputDeploymentInfo) 110 | * [개인 정보 및 규정 준수 정보 입력](/DevConsole/Guides/Deploy_Custom_Extension.md#InputComplianceInfo) 111 | * [심사 신청하기](/DevConsole/Guides/Deploy_Custom_Extension.md#RequestExtensionSubmission) 112 | * [Custom extension 업데이트하기](/DevConsole/Guides/Update_Custom_Extension.md) 113 | * [Custom extension 중지 및 삭제하기](/DevConsole/Guides/Remove_Custom_Extension.md) 114 | 115 | ## Terms & Policy 116 | 117 | * [준수사항 및 운영정책](/TermsAndPolicy/Terms_And_Policy.md) 118 | * [Skill의 완전성](/TermsAndPolicy/Terms_And_Policy.md#SkillCompleteness) 119 | * [Skill의 안전성](/TermsAndPolicy/Terms_And_Policy.md#SkillSecurity) 120 | * [권리 보호 및 법 준수](/TermsAndPolicy/Terms_And_Policy.md#RightAndLegal) 121 | * [윤리 이행](/TermsAndPolicy/Terms_And_Policy.md#Morals) 122 | * [개인 정보 보호](/TermsAndPolicy/Terms_And_Policy.md#Privacy) 123 | * [기타 유의 사항](/TermsAndPolicy/Terms_And_Policy.md#OtherPrecautions) 124 | -------------------------------------------------------------------------------- /ko-KR/Develop/Guides/BuildCustomExtension/Handle_Custom_Extension_Request.md: -------------------------------------------------------------------------------- 1 | ## Custom extension 요청 처리하기 {#HandleCustomExtensionRequest} 2 | Custom extension은 CEK로부터 [custom extension 메시지](/Develop/References/Custom_Extension_Message.md) 형태의 사용자 요청을 수신합니다(HTTP Request). Custom extension은 일반적으로 다음과 같이 요청을 처리하고 응답해야 합니다. 3 | 4 | ![CEK_Custom_Extension_Sequence_Diagram](/Develop/Assets/Images/CEK_Custom_Extension_Sequence_Diagram.svg) 5 | 6 | 이를 위해 사용자의 요청을 세 가지 타입의 요청으로 구분하고 있습니다. Custom extension 개발자는 각 메시지에 따라 그에 상응하는 작업을 처리해야 합니다. 7 | 세 가지 요청 타입과 각 요청 타입의 사용자 발화 패턴은 다음과 같습니다. 8 | 9 | | 요청 타입 | 사용자 발화 패턴 | 발화 예시 | 10 | |---------|--------------|---------| 11 | |[LaunchRequest](#HandleLaunchRequest) | _[extension 호출 이름]_ + "시작해줘/열어줘/동작해줘" | "피자봇 시작해줘" | 12 | | [IntentRequest](#HandleIntentRequest) | _[extension 호출 이름]_ + "에게/에서/한테/로" + _[extension 별로 등록한 실행 명령어]_, 혹은
(`LaunchRequest` 타입 요청 받은 상태에서) _[extension 별로 등록한 실행 명령어]_ | "피자봇에서 피자 시켜줘"
(피자봇 시작 상태에서) "주문 조회해줘" | 13 | | [SessionEndedRequest](#HandleSessionEndedRequest) | (`LaunchRequest` 타입 요청 받은 상태에서) "종료해줘/종료/그만" | "(피자봇) 종료해줘" | 14 | 15 |
16 |

Tip!

17 |

EventRequest 요청 타입은 사용자의 발화 보다는 주로 클라이언트 상태 변화에 의해 extension으로 전달되는 메시지입니다. 클라이언트 상태에 대한 정보 수집 및 클라이언트 상태 변화에 대한 extension의 대응을 위해 사용되며, extension이 오디오 콘텐츠를 제공할 때 사용됩니다. 따라서 이 절에서는 EventRequest에 대해서 다루지 않습니다.

18 |
19 | 20 | ### LaunchRequest 요청 처리 {#HandleLaunchRequest} 21 | [`LaunchRequest` 타입](/Develop/References/Custom_Extension_Message.md#CustomExtLaunchRequest) 요청은 사용자가 특정 extension을 사용하기로 선언한 것을 알릴 때 사용됩니다. 예를 들어, 사용자가 "피자봇 시작해줘"나 "피자봇 열어줘"와 같은 명령을 내렸다면 CEK는 피자 배달 서비스를 제공하는 extension에 `LaunchRequest` 타입 요청을 전달합니다. 이 요청 타입을 수신한 extension은 사용자의 다음 요청을 수신할 수 있도록 준비해야 합니다. 22 | 23 | LaunchRequest 타입 메시지는 `request.type` 필드에 `"LaunchRequest"`라는 값을 가지며 `request` 필드에 사용자의 발화가 분석된 정보를 포함하고 있지 않습니다. Extension 개발자는 이 메시지를 받은 후 사전 준비 사항을 처리하거나 사용자에게 서비스를 제공할 준비가 되었다는 [응답 메시지](#ReturnCustomExtensionResponse)를 보내면 됩니다. 24 | 25 | 이 메시지를 받은 후부터 [`SessionEndedRequest` 타입](#HandleSessionEndedRequest) 요청 메시지를 받기 전까지 [`IntentRequest` 타입](#HandleIntentRequest)의 요청 메시지를 받게 되며, `session.sessionId` 필드는 이전 메시지와 같은 값을 가지게 됩니다. 26 | 27 | 다음은 `LaunchRequest` 타입의 요청 메시지 예입니다. 28 | 29 | {% raw %} 30 | ```json 31 | { 32 | "version": "0.1.0", 33 | "session": { 34 | "new": true, 35 | "sessionAttributes": {}, 36 | "sessionId": "a29cfead-c5ba-474d-8745-6c1a6625f0c5", 37 | "user": { 38 | "userId": "V0qe", 39 | "accessToken": "XHapQasdfsdfFsdfasdflQQ7" 40 | } 41 | }, 42 | "context": { 43 | "System": { 44 | "application": { 45 | "applicationId": "com.example.extension.pizzabot" 46 | }, 47 | "user": { 48 | "userId": "V0qe", 49 | "accessToken": "XHapQasdfsdfFsdfasdflQQ7" 50 | }, 51 | "device": { 52 | "deviceId": "096e6b27-1717-33e9-b0a7-510a48658a9b", 53 | "display": { 54 | "size": "l100", 55 | "orientation": "landscape", 56 | "dpi": 96, 57 | "contentLayer": { 58 | "width": 640, 59 | "height": 360 60 | } 61 | } 62 | } 63 | } 64 | }, 65 | "request": { 66 | "type": "LaunchRequest" 67 | } 68 | } 69 | ``` 70 | {% endraw %} 71 | 72 | 위 예제에서 각 필드의 의미는 다음과 같습니다. 73 | 74 | * `version`: 현재 사용하는 custom extension 메시지 포맷의 버전이 v0.1.0입니다. 75 | * `session`: **새로운 세션이며**, 새로운 세션에 사용될 세션의 ID와 사용자의 정보(ID, accessToken)가 담겨 있습니다. 76 | * `context`: 클라이언트 기기에 대한 정보이며, 기기 ID와 기기의 기본 사용자 정보가 담겨 있습니다. 77 | * `request`: `LaunchRequest` 타입 요청으로 대상 extension의 사용 시작을 알립니다. 사용자의 발화가 분석된 정보는 없습니다. 78 | 79 | ### IntentRequest 요청 처리 {#HandleIntentRequest} 80 | 81 | [`IntentRequest` 타입 요청](/Develop/References/Custom_Extension_Message.md#CustomExtIntentRequest)은 CEK가 미리 정의해 둔 [interaction 모델](/Design/Design_Custom_Extension.md#DefineInteractionModel)에 따라 사용자의 요청을 extension에 전달할 때 사용됩니다. `IntentRequest`는 사용자가 extension 호출 이름을 지정하여 명령을 내리거나, `LaunchRequest` 발생 이후 호출 이름 없이 명령을 내릴 때 extension으로 전달됩니다. 예를 들어, 사용자가 "피자봇에서 피자 시켜줘"나, 별도의 명령으로 서비스를 시작한 후 "피자 주문해 달라고 해"와 같은 명령을 내렸다면 CEK는 피자 배달 서비스를 제공하는 extension에 `IntentRequest` 타입 요청을 전달합니다. `IntentRequest` 타입 요청은 일회적인 요청뿐만 아니라 연속되는 [사용자 요청(Multi-turn request)을 처리](/Develop/Guides/Do_Multiturn_Dialog.md)할 때도 사용됩니다. 82 | 83 | IntentRequest 타입 메시지는 `request.type` 필드에 `"IntentRequest"`라는 값을 가집니다. 호출된 intent의 이름과 분석된 사용자의 발화 정보는 `request.intent` 필드를 통해 확인할 수 있습니다. 이 필드를 분석하여 사용자의 요청을 처리한 후 [응답 메시지](#ReturnCustomExtensionResponse)를 보내면 됩니다. 84 | 85 | 다음은 `IntentRequest` 타입의 요청 메시지 예입니다. 86 | 87 | {% raw %} 88 | ```json 89 | { 90 | "version": "0.1.0", 91 | "session": { 92 | "new": false, 93 | "sessionAttributes": {}, 94 | "sessionId": "a29cfead-c5ba-474d-8745-6c1a6625f0c5", 95 | "user": { 96 | "userId": "V0qe", 97 | "accessToken": "XHapQasdfsdfFsdfasdflQQ7" 98 | } 99 | }, 100 | "context": { 101 | "System": { 102 | "application": { 103 | "applicationId": "com.example.extension.pizzabot" 104 | }, 105 | "user": { 106 | "userId": "V0qe", 107 | "accessToken": "XHapQasdfsdfFsdfasdflQQ7" 108 | }, 109 | "device": { 110 | "deviceId": "096e6b27-1717-33e9-b0a7-510a48658a9b", 111 | "display": { 112 | "size": "l100", 113 | "orientation": "landscape", 114 | "dpi": 96, 115 | "contentLayer": { 116 | "width": 640, 117 | "height": 360 118 | } 119 | } 120 | } 121 | } 122 | }, 123 | "request": { 124 | "type": "IntentRequest", 125 | "intent": { 126 | "name": "OrderPizza", 127 | "slots": { 128 | "pizzaType": { 129 | "name": "pizzaType", 130 | "value": "페퍼로니" 131 | } 132 | } 133 | } 134 | } 135 | } 136 | ``` 137 | {% endraw %} 138 | 139 | 위 예제에서 각 필드의 의미는 다음과 같습니다. 140 | 141 | * `version`: 현재 사용하는 custom extension 메시지 포맷의 버전이 v0.1.0입니다. 142 | * `session`: **기존 세션에 이어지는 사용자의 요청이며**, 기존 세션의 ID와 사용자의 정보(ID, accessToken)가 담겨 있습니다. 143 | * `context`: 클라이언트 기기에 대한 정보이며, 기기 ID와 기기의 기본 사용자 정보가 담겨 있습니다. 144 | * `request`: `IntentRequest` 타입 요청이며, `"OrderPizza"`라는 이름으로 등록된 [intent](/Design/Design_Custom_Extension.md#Intent)를 호출했습니다. 해당 intent의 필요 정보로 `"pizzaType"`라는 [slot](/Design/Design_Custom_Extension.md#Slot)이 함께 전달되었고 해당 slot은 `"페퍼로니"`라는 값을 가지고 있습니다. 145 | 146 |
147 |

Tip!

148 |

IntentRequest 타입 요청은 LaunchRequest 타입 요청과 상관없이 없이 새로운 세션을 시작하여 요청을 처리할 수 있습니다.

149 |
150 | 151 | ### SessionEndedRequest 요청 처리 {#HandleSessionEndedRequest} 152 | 153 | [`SessionEndedRequest` 타입 요청](/Develop/References/Custom_Extension_Message.md#CustomExtSessionEndedRequest)은 사용자가 특정 모드나 특정 custom extension의 사용을 중지하기로 선언한 것을 알릴 때 사용됩니다. 사용자가 "종료해줘"나 "그만"과 같은 명령을 내리면 CEK는 대화 서비스를 제공하는 extension에 `SessionEndedRequest` 타입 요청을 전달합니다. 154 | 155 | `SessionEndedRequest` 타입 메시지는 `request.type` 필드에 `"SessionEndedRequest"`라는 값을 가지며 `LaunchRequest` 타입과 마찬가지로 `request` 필드에 사용자의 발화가 분석된 정보를 포함하고 있지 않습니다. Extension 개발자는 서비스를 종료하면 됩니다. 156 | 157 | 다음은 `SessionEndedRequest` 타입의 요청 메시지 예입니다. 158 | 159 | 160 | {% raw %} 161 | ```json 162 | { 163 | "version": "0.1.0", 164 | "session": { 165 | "new": false, 166 | "sessionAttributes": {}, 167 | "sessionId": "a29cfead-c5ba-474d-8745-6c1a6625f0c5", 168 | "user": { 169 | "userId": "V0qe", 170 | "accessToken": "XHapQasdfsdfFsdfasdflQQ7" 171 | } 172 | }, 173 | "context": { 174 | "System": { 175 | "application": { 176 | "applicationId": "com.example.extension.pizzabot" 177 | }, 178 | "user": { 179 | "userId": "V0qe", 180 | "accessToken": "XHapQasdfsdfFsdfasdflQQ7" 181 | }, 182 | "device": { 183 | "deviceId": "096e6b27-1717-33e9-b0a7-510a48658a9b", 184 | "display": { 185 | "size": "l100", 186 | "orientation": "landscape", 187 | "dpi": 96, 188 | "contentLayer": { 189 | "width": 640, 190 | "height": 360 191 | } 192 | } 193 | } 194 | } 195 | }, 196 | "request": { 197 | "type": "SessionEndedRequest" 198 | } 199 | } 200 | ``` 201 | {% endraw %} 202 | 203 | 위 예제에서 각 필드의 의미는 다음과 같습니다. 204 | 205 | * `version`: 현재 사용하는 custom extension 메시지 포맷의 버전이 v0.1.0입니다. 206 | * `session`: **기존 세션에 이어지는 사용자의 요청이며**, 기존 세션의 ID와 사용자의 정보(ID, accessToken)가 담겨 있습니다. 207 | * `context`: 클라이언트 기기에 대한 정보이며, 기기 ID와 기기의 기본 사용자 정보가 담겨 있습니다. 208 | * `request`: `SessionEndedRequest` 타입 요청으로 대상 extension의 사용을 중지했음을 알립니다. 사용자의 발화가 분석된 정보는 없습니다. 209 | 210 |
211 |

Tip!

212 |

CEK가 SessionEndedRequest 타입 요청을 extension으로 전송한 순간부터 CEK는 해당 extension의 응답을 모두 무시합니다.

213 |
214 | -------------------------------------------------------------------------------- /ko-KR/Develop/Tutorials/Build_Simple_Extension.md: -------------------------------------------------------------------------------- 1 | # 기초적인 extension 만들기 2 | 이 튜토리얼에서는 주사위를 굴려달라는 사용자의 요청에 1 개의 주사위만 굴려주는 기초적인 extension을 만듭니다. 3 | 4 | Custom extension을 서비스하려면 아래 두 가지 요소가 꼭 필요합니다. 5 | 6 | {% include "/Develop/Guides/RequiredComponents/Interaction_Model.md" %} 7 | 8 | {% include "/Develop/Guides/RequiredComponents/Extension_Server.md" %} 9 | 10 | 다음과 같은 과정을 통해 위 두 요소를 만들고 등록하는 방법을 알아봅니다. 11 | 12 | Extension을 만드는 전체적인 과정은 다음과 같습니다. 13 | * 1 단계. Extension 서버 준비(개별적으로 작업) 14 | * 2 단계. Extension 기본 정보 등록(CLOVA developer console에서 작업) 15 | * 3 단계. Interaction 모델 등록(CLOVA developer console에서 작업) 16 | * 4 단계. Extension 동작 테스트(CLOVA developer console과 실제 기기에서 작업) 17 | 18 |
19 |

Tip!

20 |

이렇게 만든 extension을 실제 서비스하려면 Extension 배포하기를 참조하십시오.

21 |
22 | 23 | ## 1 단계. Extension 서버 준비 {#Step1} 24 | 25 | 샘플 주사위 extension이 등록한 slot을 잘 처리하는지 테스트해야 합니다. 26 | 27 | [첫 번째 튜토리얼](/Develop/Tutorials/Build_Simple_Extension.md)에서처럼 두 가지 테스트 방법이 있습니다. 하나는 CLOVA developer console에서 interaction 모델 동작을 확인하는 것이고, 다른 하나는 테스터 아이디를 등록하여 CLOVA 앱에서 실제 동작을 확인하는 것입니다. 28 | 이 튜토리얼에서는 interaction 모델 동작만 확인합니다. 29 | 30 | CLOVA developer console에 접속하여 다음과 같이 샘플 주사위 extension이 주사위 개수를 잘 인식하는지 확인합니다. 31 | 32 |
    33 |
  1. 샘플 주사위의 {{ book.DevConsole.cek_interaction_model }} 항목 내 {{ book.DevConsole.cek_edit}} 버튼을 누르십시오.
  2. 34 |
  3. 화면 좌측 상단의 {{ book.DevConsole.cek_builder_menu_build }} 버튼을 눌러 interaction 모델을 빌드하십시오.
  4. 35 |
  5. 빌드가 끝난 후, 왼쪽의 메뉴 목록에서 {{ book.DevConsole.cek_test }} 메뉴를 선택하십시오.
  6. 36 |
  7. {{ book.DevConsole.cek_builder_test_expression_title }}에 주사위를 여러 개 던져달라는 문장을 입력하십시오. 예를 들어, "주사위 두 개 던져볼래"라고 입력합니다.
  8. 37 |
  9. 엔터키 또는 {{ book.DevConsole.cek_builder_test_request_test }} 버튼을 누르십시오.
  10. 38 |
  11. {{ book.DevConsole.cek_builder_test_result_title }}{{ book.DevConsole.cek_builder_test_intent_result }} 항목에 ThrowDiceIntent, {{ book.DevConsole.cek_builder_test_slot_result }} 항목에 diceCount가 나타나고, {{ book.DevConsole.cek_builder_test_slot_data}}에 입력한 주사위 개수가 나타나는지 확인하십시오.
    39 | CEK_Tutorial_Builtin_Type_Slot_Test 40 |
    41 |

    Note!

    42 |

    외부에서 접근할 수 있는 extension 서버 URI를 등록하지 않았다면, {{ book.DevConsole.cek_builder_test_service_response }}은 "{{ book.DevConsole.cek_builder_test_no_response }}"라고 나타납니다.

    43 |
    44 |
  12. 45 |
  13. "주사위 열 개 굴려", "네 개 주사위 던져"와 같은 문장으로 4-6 단계를 반복하십시오.
  14. 46 |
47 | 48 | 인식이 잘 되지 않으면 좀 더 다양한 발화 예시를 추가하여 인식 확률을 높일 수 있습니다. 49 | 50 | ### Extension 서버 개발 팁 {#Tip} 51 | 52 | CLOVA는 사용자의 음성 입력을 분석한 결과를 extension 서버에 전송하며, 서버는 수신한 내용에 맞게 응답하도록 구현해야 합니다. 53 | 54 | * **분석한 결과가 별도로 등록한 사용자 의도([Custom intent](/Design/Design_Custom_Extension.md#CustomIntent))이면,** 55 | 56 | CLOVA는 extension 실행, 등록한 의도 실행, extension 종료 중 하나의 요청 메시지를 전송하며, 서버는 각각의 메시지에 따라 extension 시작, 지정된 의도 처리, extension 종료를 처리한 후 그 결과를 반환하면 됩니다. 57 | 58 | * **분석한 결과가 CLOVA가 기본적으로 제공하는 의도([Built-in intent](/Design/Design_Custom_Extension.md#BuiltinIntent))이면,** 59 | 60 | CLOVA는 그에 따라 도움말 안내, 긍정, 부정, 실행 취소와 같은 요청 메시지를 전송하며, 서버는 이에 따른 일반적인 응답을 하면 됩니다. 61 | 62 | ## 2 단계. Extension 기본 정보 등록 {#Step2} 63 | 64 | CLOVA developer console에 접속하여 extension의 기본 정보를 등록합니다. 65 | 주요 항목은 아래와 같습니다. 66 | 67 | * Extension 정보 68 | * **{{ book.DevConsole.cek_id }}**: extension의 고유한 ID 값으로, 일반적으로 패키지 이름과 extension 이름의 조합으로 작성합니다. 샘플 주사위 extension의 ID는 "my.clova.extension.sampledice"로 입력합니다. 69 | * **{{ book.DevConsole.cek_invocation_name }}**: extension을 실행할 때 부르는 이름으로 CLOVA 앱이나 스피커 형태의 기기에서 음성 인식이 잘 되는 단어를 선택합니다. 샘플 주사위 extension의 호출 이름은 "샘플 주사위" 입니다. 70 | * 서버 연동 설정 71 | * **{{ book.DevConsole.cek_service_endpoint_url }}**: CLOVA와 통신할 extension의 REST API 서버로, 외부에서 접근할 수 있는 URI여야 합니다. 1 단계에서 샘플 주사위 소스 코드를 실행한 서버의 주소를 입력합니다. 72 |
73 |

Note!

74 |

테스트 단계에서는 HTTP도 가능하나 정식 서비스를 위해서는 HTTPS여야 합니다. Extension 서버는 HTTP일 때 80 번 포트를 HTTPS일 때 443 번 포트를 사용해야 합니다.

75 |
76 | * **{{ book.DevConsole.cek_account_linking }}**: 인증 서버(OAuth 2.0기반)를 사용해 3rd party의 회원정보와 연동할 때만 사용합니다. 샘플 주사위 extension은 **{{ book.DevConsole.cek_no }}**로 설정합니다. 77 | * 배포 정보 및 개인 정보 보호 및 규정 준수
78 | Extension 배포와 심사에 필요한 정보입니다. 이 튜토리얼의 내용을 수행할 때는 입력하지 않아도 됩니다. 79 | 80 | ## 3 단계. Interaction 모델 등록 {#Step3} 81 | 82 | CLOVA developer console에서 interaction 모델을 등록합니다. 83 | 84 | 이 튜토리얼에서 샘플 주사위는 사용자가 개수를 지정하지 않고 주사위를 던져달라는 요청을 하면 기본적으로 주사위 1 개를 던집니다. 여기서는 이렇게 주사위 1 개를 던지는 명령을 처리하는 단순한 interaction 모델을 사용하기로 합시다. 주사위 개수를 수집하지 않으므로 slot이 없는 intent 하나를 등록하면 됩니다. 85 | 86 | ### 새로운 custom intent 만들기 87 | 여기서는 주사위를 던져달라는 요청에 주사위 1 개를 던지도록 간단한 intent를 생성합니다. 88 | 89 | 1. 샘플 주사위의 **{{ book.DevConsole.cek_interaction_model }}** 항목 내 **{{ book.DevConsole.cek_edit }}** 버튼을 누르십시오. 90 | 2. **{{ book.DevConsole.cek_builder_list_title_intent }}** 오른쪽에 있는 버튼을 누르십시오. 91 | 3. **{{ book.DevConsole.cek_builder_new_intent }}** 아래 입력창에 "ThrowDiceIntent"라는 이름을 입력하십시오. 92 | 4. 엔터키 또는 입력창 오른쪽의 **{{ book.DevConsole.cek_builder_new_intent_create }}** 버튼을 누르십시오.
93 | ![CEK_Tutorial_NewIntent](/Develop/Assets/Images/CEK_Tutorial_NewIntent.png) 94 |
95 |

Note!

96 |

Intent 이름의 대소문자에 유의해야 합니다.

97 |
98 | 99 | ### 발화 예시 목록에 문장 입력하기 100 | 여기서는 사용자가 어떤 말을 할 때 위에 입력한 intent로 처리할지 지정합니다. 발화 예시는 많을수록 좋지만, 이 튜토리얼에서는 하나만 입력합니다. 101 | 102 | 1. **{{ book.DevConsole.cek_builder_intent_expression_title }}**에서 "주사위 던져줘"라고 입력하십시오. 103 | 2. 엔터키 또는 버튼을 누르십시오. 104 | 3. 모든 발화 예시를 입력하면 **{{ book.DevConsole.cek_save }}** 버튼을 누르십시오.
105 | ![CEK_Tutorial_SpeechExample](/Develop/Assets/Images/CEK_Tutorial_SpeechExample.png) 106 | 107 | ### 빌드 및 테스트하기 108 | Interaction 모델이 입력한대로 동작하는지 확인하기 위해 interaction 모델을 빌드하여 테스트 합니다. 109 | 110 | 1. **Custom Extension** 화면 좌측 상단의 **{{ book.DevConsole.cek_builder_menu_build }}** 버튼을 누르십시오. 111 |
112 |

Note!

113 |

빌드는 3~5 분 정도 소요됩니다. 빌드가 시작되면 버튼이 {{ book.DevConsole.cek_builder_menu_build_in_progress }}으로 바뀌며, 빌드가 완료된 후 다시 {{ book.DevConsole.cek_builder_menu_build }}로 돌아옵니다.

114 |
115 | 2. 빌드가 완료되면 **{{ book.DevConsole.cek_builder_menu_build }}** 버튼 아래의 **{{ book.DevConsole.cek_test }}** 메뉴를 누르십시오. 116 | 3. **{{ book.DevConsole.cek_builder_test_expression_title }}**에 테스트하고자 하는 문장을 입력합니다. 예를 들어, "주사위 던져줄래"라고 입력하십시오. 117 | 4. 엔터키 또는 **{{ book.DevConsole.cek_builder_test_request_test }}** 버튼을 누르십시오. 118 | 5. **{{ book.DevConsole.cek_builder_test_result_title }}**의 **{{ book.DevConsole.cek_builder_test_intent_result }}** 항목에 "ThrowDiceIntent"라고 나타나는지 확인하십시오.
119 | ![CEK_Tutorial_Test](/Develop/Assets/Images/CEK_Tutorial_Test.png) 120 |
121 |

Note!

122 |

2 단계에서 외부에서 접근할 수 있는 extension 서버 URI를 등록하지 않았다면, {{ book.DevConsole.cek_builder_test_service_response }}은 "{{ book.DevConsole.cek_builder_test_no_response }}"라고 나타납니다.

123 |
124 | 125 | ## 4 단계. Extension 실제 동작 테스트 {#Step4} 126 | 127 | Interaction 모델이 잘 동작하는 것을 확인했다면, 심사 요청 전에 실제 기기에서 테스트하여 음성 인식과 응답이 기대한대로 동작하는지 확인해야 합니다. 128 | 129 | ### 테스터 ID 등록하기 130 | 131 | 특정 계정에서만 이 extension을 실행해볼 수 있도록 테스터 ID를 등록합니다. 132 | 133 | 1. CLOVA developer console에 접속하십시오. 134 | 2. 샘플 주사위의 **{{ book.DevConsole.cek_skill_info }}** 항목 내 **{{ book.DevConsole.cek_edit }}** 버튼을 누르십시오. 135 | 3. 나타난 화면에서 **{{ book.DevConsole.cek_tester }}**를 찾아 여러분의 {{ book.ServiceEnv.OrientedService }} 계정 ID를 입력하십시오. 136 | 4. **{{ book.DevConsole.cek_save }}** 버튼을 누르십시오. 137 | 138 |
139 |

Note!

140 |

테스터 ID를 등록한 후 조금 기다리면 extension을 테스트해 볼 수 있습니다. 만약, 1 시간 정도가 지나도 extension을 테스트할 수 없으면 포럼이나 제휴 담당자를 통해 문의하시기 바랍니다.

141 |
142 | 143 |
144 |

Note!

145 |

실제 기기에서 테스트 하려면 {{ book.DevConsole.cek_skill_info }}에 반드시 외부에서 접속 가능한 실제 extension 서버 주소를 등록해야 합니다.

146 |
147 | 148 | ### CLOVA 앱에서 실행하기 149 | 150 | CLOVA 앱을 통해 샘플 주사위 extension을 실행합니다. 151 | 152 | 1. 테스트할 기기에 CLOVA 앱을 설치하십시오. 153 | 2. 테스터 ID로 입력한 {{ book.ServiceEnv.OrientedService }} 계정으로 로그인하십시오. 154 | 3. 테스트용 extension 호출 이름으로 음성 명령을 내리십시오. 예를 들어, "클로바, 샘플 주사위에 주사위 던지라고 해"라고 명령합니다. 155 | 4. CLOVA 앱이 "주사위를 1 개 던집니다"라고 응답하는지 확인하십시오. 156 | 157 | Extension이 실제 기기에서도 잘 동작하면 서비스할 준비가 된 것입니다. 이제 CLOVA developer console에서 심사를 요청하여 extension을 배포할 수 있습니다. 158 | -------------------------------------------------------------------------------- /ko-KR/DevConsole/Guides/Register_Custom_Extension.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Custom extension 등록하기 4 | [Custom extension](/Develop/Guides/Build_Custom_Extension.md)을 개발 중이거나 개발하고 있다면 이를 [CLOVA developer console](/DevConsole/ClovaDevConsole_Overview.md)에 등록해야 합니다. CEK 메뉴 페이지에서 페이지 하단에 있는 **{{ book.DevConsole.cek_new_skill }}** 버튼을 누르면 신규 custom extension을 등록할 수 있습니다. 5 | 6 | ![DevConsole-First_Look_of_Extension_List](/DevConsole/Assets/Images/DevConsole-First_Look_of_Extension_List.png) 7 | 8 | Custom extension을 등록할 때 일반적으로 다음 항목을 순차적으로 수행해야 합니다. 9 | 10 |
    11 |
  1. 이용 약관 및 개인 정보 수집 동의
  2. 12 |
  3. Custom extension 기본 정보 입력
  4. 13 |
  5. 서버 연동 설정 14 | 17 |
  6. 18 |
19 | 20 | 21 | 22 | ## 이용 약관 및 개인 정보 수집 동의 {#AgreeTermsOfUse} 23 | 24 | Custom extension을 등록하기 전에 우선 CEK API 서비스 이용 약관과 개인 정보 수집에 동의해야 합니다. 이용 약관 및 개인 정보 수집에 대한 내용은 **최초 한 번만 표시**되며 동의한 이후에는 나타나지 않습니다. 25 | 26 | ![DevConsole-Agree_Terms_of_Use_and_Collecting_Personal_Info](/DevConsole/Assets/Images/DevConsole-Agree_Terms_of_Use_and_Collecting_Personal_Info.png) 27 | 28 | 29 | 30 | ## Custom extension 기본 정보 입력 {#InputExtensionInfo} 31 | 32 | Custom extension을 등록하는 과정에서 가장 먼저 할 일은 등록할 custom extension의 기본 정보를 입력하는 것입니다. Custom extension의 기본 정보는 CLOVA developer console에 custom extension을 생성하기 위한 필수 정보입니다. Custom extension의 기본 정보를 입력하고 나면 CEK 메뉴에서 생성한 custom extension을 언제든지 접근 또는 수정할 수 있게 됩니다. 33 | 34 | 다음 절차에 따라 custom extension을 등록합니다. 35 | 36 | ![DevConsole-Create_New_Custom_Extension](/DevConsole/Assets/Images/DevConsole-Create_New_Custom_Extension.png) 37 | 38 | 43 | 44 |
    45 |
  1. {{ book.DevConsole.cek_type }} 항목에서 등록할 custom extension의 타입을 선택하십시오.
    Custom extension 타입을 선택하면 그에 해당하는 입력 필드가 추가로 나타납니다.
  2. 46 |
  3. {{ book.DevConsole.cek_lang }} 항목에서 custom extension에서 사용할 언어를 선택하십시오. 현재 {{ book.DevConsole.supported_languages }}만 지원하고 있습니다.
  4. 47 |
  5. Extension의 ID, Skill 이름, 호출 이름, 제작사에 해당하는 정보를 다음 항목에 입력하십시오. 48 |
      49 |
    1. {{ book.DevConsole.cek_id }}
      50 | Custom extension의 고유 ID를 입력하십시오. 입니다. Reverse domain name 표기 형식(예: com.example.extension.pizzabot)으로 입력합니다.
    2. 51 |
    3. {{ book.DevConsole.cek_name }}
      52 | Custom extension의 이름을 입력하십시오. 추후 {{ book.DevConsole.ManageCustomExtensions }}에 노출됩니다.
    4. 53 |
    5. {{ book.DevConsole.cek_invocation_name }}
      54 | 사용자가 custom extension을 호출할 때 부를 이름을 입력하십시오. 한 개 이상 최대 세 개까지 {{ book.DevConsole.cek_invocation_name }}을 등록할 수 있습니다. 일반적으로 보유하고 있는 서비스, 회사 또는 조직의 이름이 될 수 있으나 사용자의 편의를 위해 간결하고 특색있는 단어를 지정하는 것이 좋습니다. 범용적인 단어나 타사의 이름이나 서비스에 해당하는 용어는 사용할 수 없습니다. {{ book.DevConsole.cek_invocation_name }}은 custom extension 심사 시 검수받게 됩니다.
    6. 55 |
    7. {{ book.DevConsole.cek_provider }}
      56 | Custom extension의 제작 주체(회사나 개인)의 이름 또는 별칭을 입력하십시오. 추후 {{ book.DevConsole.ManageCustomExtensions }}에 노출되며, custom extension 승인 과정에서 심사를 받게 됩니다.
    8. 57 |
    58 |
  6. 59 |
  7. (Extension이 AudioPlayer 지시 메시지를 이용한다면) {{ book.DevConsole.cek_audioplayer }} 항목을 {{ book.DevConsole.cek_yes }}로 선택하십시오. Custom extension이 음악 스트리밍 서비스를 제공할 때 사용됩니다.
  8. 60 |
  9. {{ book.DevConsole.cek_email }} 항목에 연락 가능한 이메일 주소를 입력하십시오.
  10. 61 |
  11. {{ book.DevConsole.cek_tester }} 항목에 개발 중인 custom extension을 테스트할 때 이용할 {{ book.ServiceEnv.OrientedService }} 계정을 입력하십시오.
    당장 입력하지 않아도 되며 추후 extension을 테스트해야 할 때 이 필드에 값을 입력할 수 있습니다.
  12. 62 |
  13. Custom extension의 기본 정보를 모두 입력한 후 {{ book.DevConsole.cek_create }} 버튼을 누르십시오.
  14. 63 |
64 | 65 | Custom extension의 기본 정보 입력이 끝나면 생성된 Custom extension의 정보를 수정하는 화면으로 전환됩니다. 이때부터 페이지 하단에 있는 **{{ book.DevConsole.cek_save }}** 버튼을 클릭하여 중간 내용을 언제든지 저장할 수 있으며, 다음과 같이 CEK 메뉴에서 등록된 Custom extension 목록을 확인할 수 있습니다. 66 | 67 | ![DevConsole-Custom_Extension_List_After_Creation](/DevConsole/Assets/Images/DevConsole-Custom_Extension_List_After_Creation.png) 68 | 69 | ## 서버 연동 설정 {#SetServerConnection} 70 | 71 | Custom extension은 CEK와 HTTPS 통신을 수행하게 됩니다. 이때, CEK는 Custom extension쪽으로 HTTP 요청을 보내고, Custom extension은 HTTP 응답을 CEK에 보냅니다. CEK가 custom extension으로 HTTP 요청을 보내려면 CLOVA developer console에서 서버 연동 설정을 수행해야 합니다. [Custom extension 기본 정보를 입력](#InputExtensionInfo)한 후 생성된 custom extension에 대해 서버 연동 설정을 수행할 수 있습니다. 72 | 73 | Custom extension 서버를 등록하기 전에 우선 custom extension 서버와 통신이 되는지 확인해야 합니다. 다음 예와 같이 간단한 curl 명령으로 통신 상태를 확인할 수 있습니다. 74 | 75 | {% raw %} 76 | ```bash 77 | $ curl "https://example.com/pizzabot" -X POST 78 | ``` 79 | {% endraw %} 80 | 81 | 다음 절차에 따라 서버 연동 설정을 수행합니다. 82 | 83 | ![DevConsole-Custom_Extension_Server_Settings](/DevConsole/Assets/Images/DevConsole-Custom_Extension_Server_Settings.png) 84 | 85 | 1. Extension 정보 입력 UI에서 위쪽에 있는 **{{ book.DevConsole.cek_configuration }}** 탭을 누르십시오. 86 | 2. Custom extension 서버 URI(endpoint) 정보를 **{{ book.DevConsole.cek_service_endpoint_url }}** 항목에 입력하십시오. 87 | 3. ([사용자 계정 연결](#SetAccountLinking)이 필요하다면) **{{ book.DevConsole.cek_account_linking }}** 항목을 **{{ book.DevConsole.cek_yes }}**로 선택하십시오. 88 | 4. **{{ book.DevConsole.cek_ssl_certificate }}** 항목의 라디오 버튼을 누르십시오. Custom extension을 제공하는 서버는 반드시 공인된 인증 기관의 인증서를 사용해야 합니다. (Self-signed 인증서 사용 불가) 89 | 5. 서버 연동 설정과 관련된 내용을 입력한 후 **{{ book.DevConsole.cek_save }}** 버튼을 누르십시오. 90 | 91 |
92 |

Note!

93 |

테스트 단계에서는 HTTP도 가능하나 정식 서비스를 위해서는 HTTPS여야 합니다. Custom extension 서버는 HTTP일 때 80 번 포트를 HTTPS일 때 443 번 포트를 사용해야 합니다.

94 |
95 | 96 | ### 계정 연결 설정 {#SetAccountLinking} 97 | 98 | Custom extension으로 제공하려는 서비스의 사용자 계정이 CLOVA의 사용자 계정과 연결이 필요하다면 [서버 연동 설정](#SetServerConnection) 중에 [계정 연결(account linking)](/Develop/Guides/Link_User_Account.md)에 관련된 정보를 입력해야 합니다. 99 | 100 | 다음 절차에 따라 계정 연결 설정에 [필요한 정보](/Develop/Guides/Link_User_Account.md#RegisterAccountLinkingInfo)를 입력합니다. 101 | 102 | 103 | 104 |
    105 |
  1. {{ book.DevConsole.cek_account_linking }} 항목에서 {{ book.DevConsole.cek_yes }}를 선택하십시오.
  2. 106 |
  3. 사용자가 계정 인증을 할 수 있도록 UI를 제공하는 Authorization URI를 {{ book.DevConsole.cek_authorization_url }} 항목에 입력하십시오.
    107 | 사용자가 custom extension을 활성화하면 이 페이지로 이동됩니다.
  4. 108 |
  5. (만약, 사용자가 본인 계정을 바로 설정할 수 있도록 하고 싶다면) {{ book.DevConsole.cek_configuration_url }} 항목에 계정 설정 페이지의 URI를 입력하십시오.
  6. 109 |
  7. 사용자 계정 인증 시 HTTP 요청에 필요한 {{ book.DevConsole.cek_client_id }}를 입력하십시오.
    110 | 클라이언트 ID는 인증 서버를 구축할 때 생성한 값입니다.
  8. 111 |
  9. {{ book.DevConsole.cek_privacy_policy_url }} 항목에 custom extension이 제공하는 서비스의 개인 정보 보호 정책과 관련된 내용이 제공되는 페이지의 URI를 입력하십시오.
    112 | 이 페이지의 내용은 추후 {{ book.DevConsole.ManageCustomExtensions }}에 노출됩니다.
  10. 113 |
  11. (만약, {{ book.DevConsole.cek_authorization_url }}이나 {{ book.DevConsole.cek_privacy_policy_url }}에 등록한 페이지가 다른 도메인에서 자원을 가져온다면) {{ book.DevConsole.cek_domain_list }} 항목에 필요한 도메인을 추가하십시오.
  12. 114 |
  13. (선택 사항) 만약, 사용자 계정 연결 시 발급되는 access token의 사용 범위(scope)를 미리 정의했다면 {{ book.DevConsole.cek_scope }} 항목에 미리 정의한 범위를 추가하십시오.
    115 | 116 |
  14. 117 |
  15. {{ book.DevConsole.cek_access_token_uri }} 항목에 서비스의 access token을 발급 받을 수 있는 URI를 입력하십시오.
    118 | 현재 허가 승인 타입(grant type)은 code grant 방식만 지원하고 있습니다.
  16. 119 |
  17. {{ book.DevConsole.cek_refresh_token_uri }} 항목에 서비스의 access token을 갱신할 수 있는 URI를 입력하십시오.
  18. 120 |
  19. 서비스의 access token을 획득 시 HTTP 요청에 필요한 {{ book.DevConsole.cek_client_secret }}을 입력하십시오.
    121 | 클라이언트 secret은 인증 서버를 구축할 때 생성한 값입니다.
  20. 122 |
  21. {{ book.DevConsole.cek_client_authentication_scheme }}은 다음 중 인증 서버의 인터페이스 구현에 맞는 값을 설정하십시오. 123 | 127 |
  22. 128 |
129 | 130 |
131 |

Note!

132 |

계정 인증 후 클라이언트가 이동할 URI(redirect URI)은 {{ book.ServiceEnv.RedirectURIforAccountLinking }}이며, {{ book.DevConsole.cek_redirect_urls }} 항목에서 확인할 수 있습니다. 인증 서버는 클라이언트가 전달하는 redirect_uri의 값이 이 값과 같은지 검증해야 합니다.

133 | 134 |
135 | -------------------------------------------------------------------------------- /ko-KR/DevConsole/Guides/Register_Interaction_Model.md: -------------------------------------------------------------------------------- 1 | # Interaction 모델 등록하기 2 | 3 | CEK가 custom extension으로 사용자의 요청 정보를 보낼 때 사용자의 발화를 어떻게 분석하고 이를 어떤 형식으로 보낼지 [interaction 모델을 미리 정의](/Design/Design_Custom_Extension.md#DefineInteractionModel)해야 합니다. 4 | 5 | CLOVA developer console에서 [custom extension을 등록](/DevConsole/Guides/Register_Custom_Extension.md)한 후 Interaction 모델을 등록할 수 있습니다. 다음과 같이 CEK 메뉴에서 interaction 모델을 등록할 custom extension의 **{{ book.DevConsole.cek_edit }}** 버튼을 누릅니다. 6 | 7 | ![DevConsole-Interaction_Model_Menu](/DevConsole/Assets/Images/DevConsole-Interaction_Model_Menu.png) 8 | 9 | 다음과 같은 **{{ book.DevConsole.cek_interaction_model }} : {{ book.DevConsole.cek_builder_header_title_dashboard }}** 화면이 표시됩니다. 10 | 11 | ![DevConsole-Interaction_Model_Dashboard](/DevConsole/Assets/Images/DevConsole-Interaction_Model_Dashboard.png) 12 | 13 | Custom extension을 설계하는 과정에서 [정의한 Interaction 모델](/Design/Design_Custom_Extension.md#DefineInteractionModel)은 다음과 같은 순서로 등록하면 됩니다. 14 | 15 | 1. [Built-in slot 타입 추가하기](#AddBuiltinSlotType) 16 | 2. [Custom slot 타입 추가하기](#AddCustomSlotType) 17 | 3. [Built-in intent 추가하기](#AddBuiltinIntent) 18 | 4. [Custom intent 추가하기](#AddCustomIntent) 19 | 20 |
21 |

Note!

22 |

참고로 custom intent를 추가하고 필요한 slot 타입을 추가할 수도 있지만 CLOVA developer console이 제공하는 UI 특성상 slot 타입을 추가한 후 intent를 추가하는 순서로 진행하는 것이 좋습니다.

23 |
24 | 25 | ## Built-in slot 타입 추가하기 {#AddBuiltinSlotType} 26 | 27 | 서비스를 제공할 custom extension이 어떤 [built-in slot 타입](/Design/Design_Custom_Extension.md#Slot)을 사용할지 결정했다면 해당 custom extension의 interaction 모델에 built-in slot 타입을 추가해야 합니다. 예를 들어 피자 배달 custom extension을 만든다면, 피자 수량에 대한 정보 표현이 사용자 발화에 사용될 수 있습니다. 따라서 이와 관련된 built-in slot 타입을 custom extension에서 사용해야 한다면 다음과 같은 단계로 built-in slot 타입을 custom extension에 추가할 수 있습니다. 28 | 29 | 1. **{{ book.DevConsole.cek_builder_list_title_slottype }}** 패널의 우측 상단이나 왼쪽 사이드 메뉴 아래 **{{ book.DevConsole.cek_builder_list_title_slottype }}** 메뉴 영역 우측 상단에 있는 버튼을 누르십시오.
30 | 버튼을 누르면 **{{ book.DevConsole.cek_interaction_model }}:{{ book.DevConsole.SlotType }}** 화면이 표시됩니다. 31 | 2. **{{ book.DevConsole.cek_builder_new_slottype_builtin_title }}** 항목에서 필요한 built-in slot 타입의 체크 박스를 누르십시오.
32 | ![DevConsole-Add_Built-in_Slot_Type](/DevConsole/Assets/Images/DevConsole-Add_Built-in_Slot_Type.png) 33 | 3. 필요한 built-in slot 타입을 선택한 후 우측 상단에 있는 **{{ book.DevConsole.cek_save }}** 버튼을 누르십시오. 34 | 35 | 위 과정을 수행하고 나면 **{{ book.DevConsole.cek_interaction_model }} : {{ book.DevConsole.cek_builder_header_title_dashboard }}** 화면의 **{{ book.DevConsole.cek_builder_list_title_slottype }}** 패널에 다음과 같이 built-in slot 타입이 추가된 것을 확인할 수 있습니다. 36 | 37 | ![DevConsole-Added_Built-in_Slot_Type](/DevConsole/Assets/Images/DevConsole-Added_Built-in_Slot_Type.png) 38 | 39 | ## Custom slot 타입 추가하기 {#AddCustomSlotType} 40 | 41 | 이제 custom extension에서 사용할 [custom slot 타입](/Design/Design_Custom_Extension.md#Slot)을 정의해야 합니다. [Built-in slot 타입 추가하기](#AddBuiltinSlotType) 절에 이어 피자 배달 서비스 custom extension 계속 예로 들면, 사용자의 발화 중 피자 종류에 해당하는 부분을 custom slot 타입으로 정의해야 할 것 입니다. 다음과 같은 대표어와 동의어를 가지는 "PIZZA_TYPE"이라는 custom slot 타입을 추가한다고 가정하겠습니다. 42 | 43 | | 대표어 | 동의어 | 44 | |----------------|----------------------------------------------| 45 | | 페퍼로니 | 페퍼로니 피자 | 46 | | 바베큐 | 바베큐 피자, BBQ 피자 | 47 | | 치즈 | 치즈 피자 | 48 | | 야채 | 야채 피자, 베지 피자, 베지테리언 피자 | 49 | | 쉬림프 골드 크러스트 | 쉬림프 골드 크러스트 피자, 쉬림프 골크 피자, 쉬림프 골크 | 50 | 51 | 다음 절차에 따라 custom slot 타입을 추가할 수 있습니다. 52 | 53 | 1. **{{ book.DevConsole.cek_builder_list_title_slottype }}** 패널의 우측 상단이나 왼쪽 사이드 메뉴 아래 **{{ book.DevConsole.cek_builder_list_title_slottype }}** 메뉴 영역 우측 상단에 있는 버튼을 누르십시오.
54 | 버튼을 누르면 {{ book.DevConsole.cek_interaction_model }}: {{ book.DevConsole.SlotType }} 화면이 표시됩니다. 55 | 2. **{{ book.DevConsole.cek_builder_new_intent }}**의 입력 필드에 추가할 custom slot 타입의 이름을 입력하고 **{{ book.DevConsole.cek_create }}** 버튼을 누르십시오.
56 | Custom slot 타입이 생성되면 해당 custom slot 타입에 대한 상세 정보를 볼 수 있는 화면이 나타납니다.
57 | ![DevConsole-Add_Custom_Slot_Type_1](/DevConsole/Assets/Images/DevConsole-Add_Custom_Slot_Type_1.png) 58 | 3. **{{ book.DevConsole.cek_builder_slottype_dictionary_title }}**에서 대표어를 입력한 후 버튼을 클릭하여 대표어를 추가하십시오.
59 | ![DevConsole-Add_Custom_Slot_Type_2](/DevConsole/Assets/Images/DevConsole-Add_Custom_Slot_Type_2.png) 60 | 4. 추가한 대표어에 동의어나 유사 표현을 추가하십시오.
61 | ![DevConsole-Add_Custom_Slot_Type_3](/DevConsole/Assets/Images/DevConsole-Add_Custom_Slot_Type_3.png) 62 | 5. 마지막으로 우측 상단에 있는 **{{ book.DevConsole.cek_save }}** 버튼을 누르십시오. 63 | 64 | 오른쪽의 **대시 보드** 메뉴를 통해 **{{ book.DevConsole.cek_interaction_model }} : {{ book.DevConsole.cek_builder_header_title_dashboard }}**로 이동하면 custom slot 타입이 추가된 것을 확인할 수 있습니다. 65 | 66 | ![DevConsole-Added_Custom_Slot_Type](/DevConsole/Assets/Images/DevConsole-Added_Custom_Slot_Type.png) 67 | 68 | 정의하려는 custom slot 타입에 대량의 정보를 입력해야 한다면 TSV(Tab-separated values, .tsv) 형식의 파일을 업로드할 수도 있습니다. TSV 파일의 각 행의 첫 번째 값은 대표어가 되며, 그 다음부터 탭 문자로 구분된 값은 대표어에 대한 동의어나 유사 표현이 됩니다. 다음은 "PIZZA_TYPE" custom slot 타입의 정의를 TSV 형식으로 표현한 예입니다. 69 | 70 | ``` 71 | 페퍼로니 페퍼로니 피자 72 | 바베큐 바베큐 피자 BBQ 피자 73 | 치즈 치즈 피자 74 | 야채 야채 피자 베지 피자 베지테리언 피자 75 | 쉬림프 골드 크러스트 쉬림프 골드 크러스트 피자 쉬림프 골크 피자 쉬림프 골크 76 | ``` 77 | 78 | CLOVA developer console은 다음과 같이 **업로드** 버튼과 **다운로드** 버튼을 제공합니다. **업로드** 버튼을 누르면 미리 TSV 파일에 정의한 custom slot 타입을 업로드할 수 있고 **다운로드** 버튼을 누르면 현재 CLOVA developer console에 작성 중인 custom slot 타입을 TSV 파일로 다운로드 할 수 있습니다. 79 | 80 | ![DevConsole-Custom_Slot_Upload_and_Download_Button](/DevConsole/Assets/Images/DevConsole-Custom_Slot_Upload_and_Download_Button.png) 81 | 82 |
83 |

Note!

84 |

이미 custom slot이 등록되어 있는 상태에서 TSV 파일을 업로드하면 기존 데이터가 삭제되고 새로운 데이터로 교체됩니다. 기존 데이터를 유지하려면, 기존 데이터를 TSV 파일로 다운로드한 후 해당 파일에 새로운 데이터를 추가하고 다시 업로드하면 됩니다.

85 |
86 | 87 | ## Built-in intent 추가하기 {#AddBuiltinIntent} 88 | 89 | [Built-in intent](/Design/Design_Custom_Extension.md#BuiltinIntent)는 CLOVA 플랫폼이 일부 공통적인 사용자 요청 범주를 정하고 이를 공유하여 사용하기 위해 선언한 intent입니다. 예를 들면, 일반적으로 빈번히 발생할 수 있는 사용자의 긍정/부정 요청, 취소와 같은 요청을 intent로 미리 정의해 둔 것입니다. 현재 모든 custom extension은 CLOVA가 제공하는 built-in intent를 모두 처리할 수 있어야 하며, 다음과 같이 built-in intent가 기본 등록되어 있습니다. 90 | 91 | ![DevConsole-Built-in_Intent_List](/DevConsole/Assets/Images/DevConsole-Built-in_Intent_List.png) 92 | 93 |
94 |

Tip!

95 |

추후 custom extension별로 필요한 built-in intent를 선택적으로 사용할 수 있게 변경할 예정입니다.

96 |
97 | 98 | ## Custom intent 추가하기 {#AddCustomIntent} 99 | Custom extension에서 사용할 [built-in slot 타입](#AddBuiltinSlotType)과 [custom slot 타입](#AddCustomSlotType)을 추가했다면 이제 custom intent를 추가하면 됩니다. 100 | 101 | 다음 절차에 따라 custom intent를 추가하십시오. 102 | 103 | 1. **{{ book.DevConsole.cek_builder_list_title_intent }}** 패널의 우측 상단이나 왼쪽 사이드 메뉴 아래 **{{ book.DevConsole.cek_builder_list_title_intent }}** 영역 우측 상단에 있는 버튼을 누르십시오.
104 | 버튼을 누르면 {{ book.DevConsole.cek_interaction_model }}: {{ book.DevConsole.NewIntent }} 화면이 표시됩니다. 105 | 2. **{{ book.DevConsole.cek_builder_new_intent }}**의 입력 필드에 추가할 custom intent의 이름을 입력하고 **{{ book.DevConsole.cek_create }}** 버튼을 누르십시오. Custom intent가 생성되면 해당 custom intent에 대한 상세 정보를 볼 수 있는 화면이 나타납니다.
106 | ![DevConsole-Add_Custom_Intent_1](/DevConsole/Assets/Images/DevConsole-Add_Custom_Intent_1.png) 107 | 3. **{{ book.DevConsole.cek_builder_intent_slot_title }}**의 입력 필드에 추가할 slot의 이름을 입력하고 오른쪽에 있는 버튼을 클릭하여 slot을 추가하십시오.
108 | ![DevConsole-Add_Custom_Intent_2](/DevConsole/Assets/Images/DevConsole-Add_Custom_Intent_2.png) 109 | 4. Slot을 추가한 후 해당 slot이 어떤 slot 타입인지 지정하십시오.
110 | ![DevConsole-Add_Custom_Intent_3](/DevConsole/Assets/Images/DevConsole-Add_Custom_Intent_3.png) 111 | 5. 이제 **{{ book.DevConsole.cek_builder_intent_expression_title }}**에 사용자 발화 예시를 입력하고 오른쪽에 있는 버튼을 클릭하여 사용자 발화 예시를 추가하십시오.
112 | ![DevConsole-Add_Custom_Intent_4](/DevConsole/Assets/Images/DevConsole-Add_Custom_Intent_4.png) 113 | 6. 추가한 발화 예시에서 slot으로 처리할 부분을 드래그하여 slot을 지정해주십시오.
114 | ![DevConsole-Add_Custom_Intent_5](/DevConsole/Assets/Images/DevConsole-Add_Custom_Intent_5.png) 115 | 7. 5 번과 6 번 단계를 반복하여 intent에 발화 예시를 필요한 만큼 추가하십시오. 116 | 8. 마지막으로 우측 상단에 있는 **{{ book.DevConsole.cek_save }}** 버튼을 누르십시오. 117 | 118 |
119 |

Note!

120 |

Slot 타입과 slot의 이름은 집합의 이름이거나 여러가지 값이 대입될 수 있는 추상적인 개념을 지닌 이름이어야 합니다.

121 |
122 | 123 |
124 |

Note!

125 |

Custom intent 하나당 등록할 수 있는 발화 예시의 최대 수는 2000 건입니다. 참고로 발화 예시의 등록 건수가 많을수록 인식률이 높아지는 것은 아닙니다. 자세한 설명은 발화 예시를 참고합니다.

126 |
127 | 128 | Custom slot 타입을 추가할 때와 마찬가지로 정의하려는 TSV(Tab-separated values, .tsv) 형식의 파일을 업로드할 수도 있습니다. TSV 파일은 두 부분으로 나뉘며 각각 intent의 slot을 정의하는 부분과 발화 예시를 나열하는 부분으로 나뉩니다. Intent의 slot을 정의하는 부분이 파일의 앞 부분에 오며 `[INTENT SLOT]`이 입력된 줄 바로 다음에 slot이 나열됩니다. 탭 문자로 구분된 첫 번째 열은 intent에서 사용되는 slot의 이름이며, 두 번째 열은 slot type입니다. 129 | 130 | Intent의 발화 예시를 열거하는 내용은 파일의 뒷 부분에 오며 `[INTENT EXPRESSION]`이 입력된 줄 바로 다음에 발화 예시가 나열됩니다. 발화 예시에서 slot을 구분하기 위해 slot 이름으로 된 태그로 관련 표현을 감싸야 합니다. 다음은 intent를 정의한 TSV 파일 예입니다. 131 | 132 | ``` 133 | [INTENT SLOT] 134 | pizzaType PIZZA_TYPE 135 | pizzaAmount CLOVA.NUMBER 136 | 137 | [INTENT EXPRESSION] 138 | 페퍼로니 2 판 주문해줘. 139 | BBQ 피자 2 판 배달시켜줄래? 140 | 콤비네이션 피자 2 개 시켜줘. 141 | 쉬림프 골크 하나 부탁해. 142 | ... 143 | ``` 144 | 145 | CLOVA developer console은 다음과 같이 **업로드** 버튼과 **다운로드** 버튼을 제공합니다. **업로드** 버튼을 누르면 미리 TSV 파일에 정의한 custom intent를 업로드할 수 있고 **다운로드** 버튼을 누르면 현재 CLOVA developer console에 작성 중인 custom intent를 TSV 파일로 다운로드 할 수 있습니다. 146 | 147 | ![DevConsole-Utterance_Example_Upload_and_Download_Button](/DevConsole/Assets/Images/DevConsole-Utterance_Example_Upload_and_Download_Button.png) 148 | 149 |
150 |

Note!

151 |

이미 custom intent가 등록되어 있는 상태에서 TSV 파일을 업로드하면 기존 데이터가 삭제되고 새로운 데이터로 교체됩니다. 기존 데이터를 유지하려면, 기존 데이터를 TSV 파일로 다운로드한 후 해당 파일에 새로운 데이터를 추가하고 다시 업로드하면 됩니다.

152 |
153 | 154 |
155 |

Tip!

156 |

같은 interaction 모델 내에서는 intent와 상관 없이 slot 타입에 같은 이름을 선언하여 사용할 것을 권고합니다. 예를 들면 "OrderPizza" intent에서 피자 종류("PIZZA_TYPE")에 관련된 slot 이름이 "pizzaType"이었다면 다른 intent에서도 같은 slot 타입을 선언해서 사용할 때 같은 이름인 "pizzaType"을 사용해야 합니다. 다만, "서울에서 부산 가는데 걸리는 시간 알려줘"와 같이 "서울"과 "부산"이 같은 slot 타입이라도 사용 목적이 구분되어야 하는 상황에서는 slot의 이름을 구분하여 작성합니다.

157 |
158 | 159 | 여기까지 하나의 intent를 interaction 모델에 추가하는 방법을 설명했습니다. 앞에서 설명했던 방법을 반복하여 custom extension에 intent를 필요한 만큼 추가하면 다음과 같이 interaction 모델을 완성할 수 있습니다. 160 | 161 | ![DevConsole-Added_Interaction_Model](/DevConsole/Assets/Images/DevConsole-Added_Interaction_Model.png) 162 | -------------------------------------------------------------------------------- /ko-KR/Develop/Guides/Link_User_Account.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | # 사용자 계정 연결하기 6 | CLOVA는 [custom extension](/Develop/Guides/Build_Custom_Extension.md)이나 [CLOVA Home extension]({{ book.DocMeta.CLOVAHomeExtensionDeveloperGuideBaseURI }}/Develop/Guides/Build_Clova_Home_Extension.{{ book.DocMeta.FileExtensionForExternalLink }})을 통해 사용자 계정 권한이 필요한 외부 서비스를 제공할 수 있습니다. 예를 들면, 유료 콘텐츠 서비스인 음악 스트리밍 서비스나 쇼핑, 금융, 메신저, 홈 IoT와 같은 서비스가 CLOVA에 연동될 수 있습니다. 이를 위해, CLOVA는 외부 서비스의 사용자 계정과 CLOVA 사용자 계정을 연결하는 계정 연결(account linking)을 지원하며, 이 기술은 [OAuth 2.0](https://tools.ietf.org/html/rfc6749)을 이용합니다. 7 | 8 | 계정 연결은 사용자의 계정 인증(authentication)이 필요한 외부 서비스를 custom extension이 제공해야 할 때 사용됩니다. 계정 인증이 필요 없는 외부 서비스는 계정 연결을 하지 않아도 되며, 사용자 식별이 가능한 수준의 정보가 요구되는 서비스는 일반적으로 [custom extension 메시지](/Develop/References/Custom_Extension_Message.md)가 제공하는 기기 식별자(`context.System.device.deviceId`)와 사용자 계정 식별자(`context.System.user.userId` 또는 `session.user.userId`)를 조합한 값을 이용합니다. 9 | 10 |
11 |

Note!

12 |

CLOVA Home extension은 반드시 계정 연결을 해야 합니다.

13 |
14 | 15 | 이 문서는 다음과 같은 내용을 다룹니다. 16 | * [계정 연결 동작 이해하기](#UnderstandAccountLinking) 17 | * [계정 연결 적용하기](#ApplyAccountLinking) 18 | 19 | ## 계정 연결 동작 이해하기 {#UnderstandAccountLinking} 20 | 계정 연결을 extension에 적용하기 전에 우선 계정 연결 동작에 대해 이해할 필요가 있습니다. 여기에서는 다음과 같은 내용을 설명합니다. 21 | * [계정 연결 설정](#SetupAccountLinking) 22 | * [계정 연결 후 extension 호출](#ExtensionInvokingAfterAccountLinking) 23 | 24 | ### 계정 연결 설정 {#SetupAccountLinking} 25 | 사용자가 계정 인증이 필요한 custom extension이나 CLOVA Home extension을 활성화하면 다음과 같이 계정 연결 설정을 시도합니다. 26 | 27 | ![CEK_Account_Linking_Setup_Sequence_Diagram](/Develop/Assets/Images/CEK_Account_Linking_Setup_Sequence_Diagram.svg) 28 | 29 | 1. 사용자가 특정 custom extension이나 CLOVA Home extension을 활성화합니다. 30 | 31 | 2. CLOVA 앱 또는 클라이언트 기기와 페어링하는 앱에서 외부 서비스의 로그인 페이지를 표시합니다. 이때, extension 개발자가 미리 등록해 둔 인증 서버의 [Authorization URI](#BuildAuthServer)를 이용합니다. 32 | 33 | 3. 사용자가 계정 인증을 완료하면 authorization code가 반환됩니다. 34 | 35 | 4. 클라이언트는 전달받은 authorization code를 CLOVA로 전달합니다. 36 | 37 | 5. CLOVA는 [Access Token URI](#RegisterAccountLinkingInfo)로 access token과 refresh token을 요청합니다. 이때 authorization code를 전달하며, 사용자의 CLOVA 계정 정보에 획득한 access token과 refresh token을 저장합니다. 38 | 39 | 6. 이제 사용자는 계정 인증이 필요한 서비스를 사용할 수 있습니다. 40 | 41 |
42 |

Note!

43 |

사용자가 특정 custom extension이나 CLOVA Home extension을 비활성화하면 사용자의 CLOVA 계정에 저장된 access token을 제거합니다. 따라서, 사용자가 해당 extension을 재활성화하면, 계정 연결을 다시 수행해야 합니다.

44 |
45 | 46 | ### 계정 연결 후 extension 호출 {#ExtensionInvokingAfterAccountLinking} 47 | 계정 연결이 완료된 상태에서 CEK는 다음과 같은 순서로 extension을 호출하게 됩니다. 48 | 49 | 1. 사용자의 요청을 처리하기 위해 평상시처럼 extension을 호출합니다. 50 | 51 | 2. **(만약 access token이 만료되었다면)** refresh token을 이용하여 [Access Token URI](#RegisterAccountLinkingInfo)에 새로운 access token을 요청합니다. 52 | 53 | 3. Extension에 전달하는 메시지에 access token을 포함시켜 사용자의 요청을 전달합니다. 54 | * Custom extension이면 `context.System.user.accessToken`와 `session.user.accessToken` 필드에 access token이 전달됩니다. 55 | * CLOVA Home extension이면 `payload.accessToken` 필드에 access token이 전달됩니다. 56 | 57 | 4. Extension은 상황에 따라 다음과 같이 응답해야 합니다. 58 | * Access token이 유효한 상황이면, 사용자의 요청을 처리하고 그 결과를 반환해야 합니다. 59 | * Access token이 유효하지 않은 상황이면, [계정 연결 설정](#SetupAccountLinking)이 진행될 수 있도록 결과를 반환해야 합니다. 60 | 61 | ## 계정 연결 적용하기 {#ApplyAccountLinking} 62 | 개발하는 extension에 계정 연결을 적용하려면 다음을 수행해야 합니다. 63 | 64 | 1. [인증 서버 구축](#BuildAuthServer) 65 | 2. [계정 권한 검증 구현](#AddValidationLogic) 66 | 3. [계정 연결 정보 등록](#RegisterAccountLinkingInfo) 67 | 68 | ### 인증 서버 구축 {#BuildAuthServer} 69 | 70 | Extension에 계정 연결을 적용하려면 우선 사용자가 계정 인증을 수행할 수 있는 로그인 페이지를 제공해야 하며, 인증 처리 후 access token을 발급하는 서버를 구축해야 합니다. 71 | 72 | 사용자 인증을 위해 제공할 로그인 페이지는 다음과 같은 사항을 만족하거나 수행해야 합니다. 73 | * **HTTPS 프로토콜**로 페이지를 제공해야 하며, 이때, 반드시 **443 포트**를 사용해야 합니다. 74 | * 모바일용 페이지를 지원해야 합니다. 75 | * 팝업 형태의 창을 제공하면 안됩니다. 76 | * 인증이 완료되면 redirect URI(`redirect_uri`)로 이동해야 합니다. 이때, authorization code를 파라미터로 전송해야 합니다. 77 | * `state` 파라미터를 redirect URI(`redirect_uri`)로 계속 전달해야 합니다. 78 | 79 | 사용자가 계정을 인증할 수 있도록 로그인 UI를 제공하는 페이지의 주소를 **Authorization URI**라 부르며, CLOVA developer console에서 extension을 등록할 때 입력해야 합니다. 사용자가 extension의 계정 연결을 사용하도록 설정([custom extension 설정](/DevConsole/Guides/Register_Custom_Extension.md#SetAccountLinking), CLOVA Home extension 설정)할 때 이 **Authorization URI**가 다음 파라미터와 함께 호출됩니다. 80 | 81 | | 파라미터 이름 | 설명 | 82 | |----------------|-----------------------------------------------------------| 83 | | `state` | 인증 세션의 시간 만료 여부를 확인하는 상태 값. 이 값은 5 분 뒤에 만료되므로 사용자가 인증을 5 분 안에 마치지 않으면 인증을 다시 시도해야 합니다. | 84 | | `client_id` | CLOVA가 외부 서비스의 access token을 발급 받기 위해 사용할 ID. 개발자는 CLOVA developer console을 통해 미리 `cliend_id`를 등록해둬야 합니다. | 85 | | `response_type` | OAuth 2.0 인가 타입을 정의해 둔 파라미터. `"code"` 타입을 사용합니다. CLOVA developer console에서 지정하며 현재 `"code"` 타입만 지원하고 있습니다. | 86 | | `scope` | OAuth의 `scope` 필드. 접근 수준을 정의할 수 있습니다. CLOVA developer console을 통해 미리 `scope`를 등록해둬야 합니다. | 87 | | `redirect_uri` | 계정 인증 후 이동할 URI(redirect URI)이며, `redirect_uri`의 값은 CLOVA developer console에서 extension을 등록할 때 계정 연결 설정([custom extension 설정](/DevConsole/Guides/Register_Custom_Extension.md#SetAccountLinking), CLOVA Home extension 설정) 중에서 확인할 수 있으며, 현재 `{{ book.ServiceEnv.RedirectURIforAccountLinking }}`을 사용하고 있습니다. | 88 | 89 |
90 |

Tip!

91 |

파라미터에 대한 자세한 설명은 OAuth 2.0 Authorization Framework의 Obtaining Authorization을 참고합니다.

92 |
93 | 94 | 다음은 클라이언트 앱 또는 클라이언트 기기와 페어링하는 앱이 로그인 페이지를 요청하는 URI 예입니다. 95 | 96 |
https://example.com/login?state=qwer123
 97 |                             &client_id=clova-extension
 98 |                             &scope=listen_music%20basic_profile
 99 |                             &response_type=code
100 |                             &redirect_uri={{ book.ServiceEnv.RedirectURIforAccountLinking }}
101 | 102 | 103 |
104 |

Note!

105 |

redirect_uri는 CLOVA developer console의 계정 연결을 설정하는 화면(Custom extension용, CLOVA Home extension용)에서 확인할 수 있습니다. 클라이언트로부터 전달되는 redirect_uri의 값이 CLOVA가 제공하는 redirection URI가 맞는지 검증해야 합니다.

106 |
107 | 108 | 계정 인증 후 이동할 URI(`redirect_uri`)에는 다음과 같은 파라미터를 전달해야 합니다. 109 | 110 | | 파라미터 이름 | 설명 | 111 | |----------------|-----------------------------------------------------------| 112 | | `state` | 인증 세션의 시간 만료 여부를 확인하는 상태 값. **Authorization URI**를 통해 전달받은 `state` 파라미터를 그대로 입력합니다. | 113 | | `code` | Authorization code. `response_type` 값이 `"code"`이면, 이 파라미터에 authorization code를 입력합니다. | 114 | | `token_type` | Access token의 타입. `access_token`과 함께 전달해야 하며, `"Bearer"`로 고정됩니다. | 115 | 116 | 다음은 사용자의 계정 인증이 완료된 후 이동할 redirect URI 예입니다. 117 | 118 |
{{ book.ServiceEnv.RedirectURIforAccountLinking }}?&state=qwer123
119 |                                 &code=nl__eCSTdsdlkjfweyuxXvnl
120 | 121 | 122 | CLOVA가 사용자 계정 연결을 위해 Authorization code를 획득하면 CLOVA는 다시 extension 개발자가 CLOVA developer console에 미리 등록해 둔 [Access Token URI](#RegisterAccountLinkingInfo)로 access token을 요청하게 됩니다. 이때, CLOVA는 획득한 authorization code를 파라미터로 전송하게 되며, 인증 서버는 외부 서비스의 계정 권한이 부여된 access token과 access token을 갱신할 수 있는 refresh token을 발급해야 합니다. 123 | 124 | ### 계정 권한 검증 구현 {#AddValidationLogic} 125 | 계정 연결을 적용하려면 extension 개발자는 access token이 유효한지 검증하는 코드를 작성해야 합니다. Custom extension과 CLOVA Home extension으로 전달되는 extension 메시지는 각각 다음과 같은 `accessToken` 필드를 가지고 있습니다. 126 | 아래 필드에서 access token을 확인한 후 해당 access token이 존재하며 유효한 값인지 확인해야 합니다. 127 | 128 | * Custom extension: `context.System.user.accessToken`, `session.user.accessToken` 129 | * CLOVA Home extension: `payload.accessToken` 130 | 131 | {% raw %} 132 | ```json 133 | // 예제 1: Custom extension 메시지 예 134 | { 135 | "version": "0.1.0", 136 | "session": { 137 | "new": false, 138 | "sessionAttributes": {}, 139 | "sessionId": "a29cfead-c5ba-474d-8745-6c1a6625f0c5", 140 | "user": { 141 | "userId": "V0qe", 142 | "accessToken": "XHapQasdfsdfFsdfasdflQQ7" 143 | } 144 | }, 145 | "context": { 146 | "System": { 147 | "application": { 148 | "applicationId": "com.example.extension.pizzabot" 149 | }, 150 | "user": { 151 | "userId": "V0qe", 152 | "accessToken": "XHapQasdfsdfFsdfasdflQQ7" 153 | }, 154 | "device": { 155 | "deviceId": "096e6b27-1717-33e9-b0a7-510a48658a9b", 156 | "display": { 157 | "size": "l100", 158 | "orientation": "landscape", 159 | "dpi": 96, 160 | "contentLayer": { 161 | "width": 640, 162 | "height": 360 163 | } 164 | } 165 | } 166 | } 167 | }, 168 | "request": { 169 | "type": "IntentRequest", 170 | "intent": { 171 | "name": "OrderPizza", 172 | "slots": { 173 | "pizzaType": { 174 | "name": "pizzaType", 175 | "value": "페퍼로니" 176 | } 177 | } 178 | } 179 | } 180 | } 181 | 182 | // 예제 2: CLOVA Home extension 메시지 예 183 | { 184 | "header": { 185 | "messageId": "33da6561-0149-4532-a30b-e0de8f75c4cf", 186 | "name": "HealthCheckRequest", 187 | "namespace": "ClovaHome", 188 | "payloadVersion": "1.0" 189 | }, 190 | "payload": { 191 | "accessToken": "92ebcb67fe33" 192 | } 193 | } 194 | ``` 195 | {% endraw %} 196 | 197 |
198 |

Note!

199 |

만약, access token이 존재하지 않거나 유효하지 않다면 extension은 클라이언트가 사용자 계정을 다시 연결하도록 CEK에 응답을 보내야 합니다.

200 |
201 | 202 | 203 | ### 계정 연결 정보 등록 {#RegisterAccountLinkingInfo} 204 | 인증 서버 구축과 extension에 계정 연결을 적용하는 것이 완료되면 [CLOVA developer console](/DevConsole/ClovaDevConsole_Overview.md)에 [인증 서버 구축](#BuildAuthServer)에서 언급했던 정보를 등록해야 합니다. CLOVA developer console에 등록된 extension에서 다음과 같은 계정 연결 정보를 입력([custom extension 설정](/DevConsole/Guides/Register_Custom_Extension.md#SetAccountLinking), CLOVA Home extension 설정)합니다. 205 | 206 | | 파라미터 이름 | 설명 | 207 | |----------------|-----------------------------------------------------------| 208 | | Authorization URI | 사용자가 [계정 인증](#SetupAccountLinking)을 위해 접속할 URI | 209 | | Client ID | 사용자 [계정 인증](#SetupAccountLinking) 페이지를 요청할 때 서비스를 식별하기 위해 부여한 클라이언트 ID | 210 | | Authorization Grant Type | OAuth 2.0의 인가 방식. 현재 Authorization code grant 방식만 지원하고 있습니다. | 211 | | Access Token URI | Authorization code로 access token을 획득하기 위한 주소. | 212 | | Client Secret | Authorization code로 access token을 획득할 때 **Client ID**와 함께 전달되어야 하는 클라이언트 Secret. | 213 | | Client Authentication Scheme | Access Token URI로 access token을 요청할 때 사용하는 scheme | 214 | | Privacy Policy URI | 서비스와 관련하여 개인 정보 보호 정책과 관련된 내용이 제공되는 페이지. CLOVA 앱이나 페어링 앱에 표시됩니다. | 215 | 216 | 217 | -------------------------------------------------------------------------------- /ko-KR/Develop/Assets/Images/CEK_Account_Linking_Setup_Sequence_Diagram.svg: -------------------------------------------------------------------------------- 1 | 사용자클라이언트 앱or 페어링 앱CEK개발자Extension인증서버인증 관련 정보 사전 등록(OAuth 2.0)- Authorization URI- Client ID- Client Secret- Redirect URI- Access Token URI- ...Extension 활성화Authorization URI 요청Authorization URI 반환로그인 페이지 요청(Authorization URI)로그인 페이지 반환로그인 페이지 표시계정 인증(로그인)인증 요청Authorization code와 함께 redirect URI 전달Authorization code 반환Access Token URI로 authorization code 파라미터로 전달access token 반환사용자 계정 정보에access token 저장Access token과 함께 사용자 요청 전달 -------------------------------------------------------------------------------- /ko-KR/Document_Info.md: -------------------------------------------------------------------------------- 1 | # 문서 정보 2 | 이 문서는 CLOVA custom extension을 개발할 수 있도록 디자인 가이드라인과 CEK 플랫폼에 대한 개발 가이드 및 API 레퍼런스 그리고 CLOVA developer console에 대한 가이드를 제공합니다. 대상 독자는 CEK를 사용하여 온라인 콘텐츠 및 서비스를 제공하려는 custom extension 개발자입니다. 3 | 4 |
5 |

Note!

6 |

CLOVA는 개발이 계속 진행되고 있습니다. 따라서, 문서의 내용은 언제든지 변경될 수 있습니다.

7 |
8 | 9 | ## 연락처 10 | 문서와 관련하여 궁금한 사항은 지정된 CLOVA 제휴 담당자나 {{ book.ServiceEnv.DeveloperCenterName }} 포럼에 문의합니다. 11 | 12 | ## 문서 변경 이력 13 | 14 | 이 문서의 변경 이력은 다음과 같습니다. 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 38 | 39 | 40 | 41 | 46 | 47 | 48 | 49 | 54 | 55 | 56 | 57 | 62 | 63 | 64 | 65 | 71 | 72 | 73 | 74 | 80 | 81 | 82 | 83 | 89 | 90 | 91 | 92 | 97 | 98 | 99 | 100 | 105 | 106 | 107 | 108 | 113 | 114 | 115 | 116 | 122 | 123 | 124 | 125 | 131 | 132 | 133 | 134 | 140 | 141 | 142 | 143 | 148 | 149 | 150 | 151 | 157 | 158 | 159 | 160 | 167 | 168 | 169 | 170 | 175 | 176 | 177 | 178 | 183 | 184 | 185 | 186 | 194 | 195 | 196 | 197 | 203 | 204 | 205 | 206 | 211 | 212 | 213 | 214 | 219 | 220 | 221 | 222 | 228 | 229 | 230 | 231 | 238 | 239 | 240 | 241 | 246 | 247 | 248 | 249 | 254 | 255 | 256 | 257 | 262 | 263 | 264 | 265 | 274 | 275 | 276 | 277 | 283 | 284 | 285 | 286 | 294 | 295 | 296 | 297 | 304 | 305 | 306 | 307 | 312 | 313 | 314 | 315 | 324 | 325 | 326 | 327 | 332 | 333 | 334 | 335 | 341 | 342 | 343 | 344 | 349 | 350 | 351 | 352 | 360 | 361 | 362 | 363 | 368 | 369 | 370 | 371 | 376 | 377 | 378 | 379 | 384 | 385 | 386 | 387 | 392 | 393 | 394 | 395 | 402 | 403 | 404 | 405 | 411 | 412 | 413 | 414 | 419 | 420 | 421 |
배포 일자이력 사항
2021-01-18 26 |
    27 |
  • 비정상 동작하는 custom extension의 운영 중단 유예 기간을 3 개월에서 1 개월로 변경함
  • 28 |
29 |
2020-11-26 34 | 37 |
2020-09-28 42 | 45 |
2020-06-24 50 |
    51 |
  • Clova의 표기를 CLOVA로 수정
  • 52 |
53 |
2019-08-19 58 |
    59 |
  • API 레퍼런스와 developer console 가이드의 목차 수준을 한 단계씩 올림
  • 60 |
61 |
2019-08-05 66 | 70 |
2019-07-31 75 |
    76 |
  • CLOVA developer guide에서 CLOVA custom extension guide 문서로 분리됨
  • 77 |
  • 일부 링크 오류 수정 및 오탈자 교정
  • 78 |
79 |
2019-07-02 84 |
    85 |
  • Interaction 모델 등록하기에서 발화 예시 등록 및 TSV 파일 업로드와 관련된 제약 사항을 설명에 추가
  • 86 |
  • 일부 예제 오탈자 교정 및 노트 상자 수준 조정
  • 87 |
88 |
2019-06-10 93 | 96 |
2019-05-20 101 | 104 |
2019-04-01 109 | 112 |
2019-03-25 117 |
    118 |
  • HLS 음원 제공을 위해 contentType 필드를 custom extension 메시지의 SpeechInfoObject에 추가
  • 119 |
  • 일부 링크 오류 및 예제 수정
  • 120 |
121 |
2019-03-13 126 |
    127 |
  • 일부 레퍼런스 문서의 내용 순서 수정
  • 128 |
  • 내외부 피드백을 문서에 반영
  • 129 |
130 |
2019-02-26 135 |
    136 |
  • Extension이라는 표현이 custom extension과 CLOVA Home extension을 포괄하고 있어, 문서에서 extension만 단독으로 사용된 부분에서 둘 중 어느 것을 뜻하는지 명시함
  • 137 |
  • UI 요소를 제외한 것에 대해 URL이라는 표현 대신 URI로 수정함
  • 138 |
139 |
2019-01-25 144 |
    145 |
  • 다이어그램 일부 스타일 수정 및 표의 열 간격 조정
  • 146 |
147 |
2019-01-07 152 |
    153 |
  • 문서에 사용되 일부 UML 다이어그램의 스타일 통일
  • 154 |
  • 문서 이력의 일부 표기 오류 수정
  • 155 |
156 |
2018-12-24 161 |
    162 |
  • Custom extension 설계 문서의 오디오 콘텐츠 재생 유형 설명에서 예제 시나리오에 잘못 표기된 지시 메시지의 이름을 수정
  • 163 |
  • 오디오 콘텐츠 제공하기 설명에서 CIC 명세 도입 시 이를 독자가 인지할 수 있도록 표현을 수정
  • 164 |
  • 일부 시퀀스 다이어그램에 잘못 표기된 노드의 유형을 수정
  • 165 |
166 |
2018-12-22 171 | 174 |
2018-10-13 179 | 182 |
2018-09-21 187 |
    188 |
  • CLOVA에서 전달하는 메시지의 검증을 위해 HTTP 헤더에 SignatureCEK 필드 설명을 추가하고 custom extension 만들기 문서에 요청 메시지 검증 절을 추가
  • 189 |
  • 일부 잘못된 코드 예제를 수정
  • 190 |
  • 일부 잘못된 링크를 수정
  • 191 |
  • 일부 사용자 접점에 있는 Extension 표기를 Skill로 변경(UI 캡처 이미지 함께 업데이트)
  • 192 |
193 |
2018-09-07 198 |
    199 |
  • 디자인 가이드라인의 플랫폼 지원 오디오 포맷에 오디오 콘텐츠별 음질 관련 속성과 음량에 대한 권고 사항 추가
  • 200 |
  • 예제 설명 중 "yourdomain.com"으로 표시된 예제를 문서 작성용 도메인 이름인 "example.com"으로 변경
  • 201 |
202 |
2018-08-24 207 | 210 |
2018-08-09 215 | 218 |
2018-07-09 223 | 227 |
2018-06-25 232 | 237 |
2018-05-14 242 |
    243 |
  • HTTP 요청 메시지에 헤더(SignatureCEK, SignatureCEKCertChainUrl) 추가 및 요청 메시지 검증 절 추가
  • 244 |
245 |
2018-04-02 250 |
    251 |
  • CLOVA developer console의 일부 UI 업데이트 적용
  • 252 |
253 |
2018-03-05 258 | 261 |
2018-02-05 266 | 273 |
2018-01-29 278 | 282 |
2018-01-22 287 | 293 |
2018-01-08 298 | 303 |
2018-01-02 308 |
    309 |
  • 일부 문서 오류, 오타 수정
  • 310 |
311 |
2017-12-18 316 | 323 |
2017-12-11 328 | 331 |
2017-12-04 336 |
    337 |
  • 사용자 multi-turn 대화를 위해 reprompt 필드를 응답 메시지에 추가
  • 338 |
  • 일부 문서 오류 수정
  • 339 |
340 |
2017-11-06 345 |
    346 |
  • Custom extension 메시지 중 요청 메시지에서 context.System.device.displayType 필드의 이름을 context.System.device.display로 바꾸고 하위 필드 구성을 변경
  • 347 |
348 |
2017-10-30 353 | 359 |
2017-10-23 364 | 367 |
2017-10-16 372 |
    373 |
  • 일부 문서 이미지 수정 및 문서 오류 교정
  • 374 |
375 |
2017-09-04 380 |
    381 |
  • 일부 문서 오류 수정
  • 382 |
383 |
2017-08-14 388 | 391 |
2017-07-07 396 | 401 |
2017-07-03 406 |
    407 |
  • CEK 문서 이미지 내용 업데이트
  • 408 |
  • 문서 리뷰 결과 반영
  • 409 |
410 |
2017-06-19 415 |
    416 |
  • CEK 문서 파트 작성
  • 417 |
418 |
422 | --------------------------------------------------------------------------------