{"id":3299,"date":"2021-04-26T10:30:00","date_gmt":"2021-04-26T08:30:00","guid":{"rendered":"https:\/\/ellycode.com\/?p=3299"},"modified":"2021-04-27T13:09:51","modified_gmt":"2021-04-27T11:09:51","slug":"artificial-intelligence-for-everyone-bot-framework-composer","status":"publish","type":"post","link":"https:\/\/ellycode.com\/en\/blog-en\/artificial-intelligence-for-everyone-bot-framework-composer\/","title":{"rendered":"Artificial intelligence for everyone: Bot Framework Composer"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">When building an application that involves artificial intelligence, the interaction between different departments within the company is the key to success. This is especially true for conversational applications, where each of the team members can focus on their specific areas: domain experts, for instance, can contribute to the implementation of useful features in their own application domain, translators can translate dialogues into a different language, and so on.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Not everyone has the technical knowledge to build an application from code. In these cases we can use tools that allow us to build applications with little code, called <strong>low-code tools<\/strong>, or even without any code, called <strong>no-code tools<\/strong>. These solutions make it possible for those who don\u2019t have knowledge of coding or artificial intelligence to still be included in the development process.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There are many platforms, both Cloud-based and not, that offer such tools. Today we will focus on the one offered by Microsoft, which includes several solutions for the creation of Bots that fit a variety of needs: in this article we will take a look at the Bot Framework Composer.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-what-is-it\"><strong>What is it<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">As you can already guess from the name, Composer is based upon <a href=\"https:\/\/dev.botframework.com\" target=\"_blank\" rel=\"noreferrer noopener\">Bot Framework<\/a>, a set of open source libraries and tools for the development of Bots. Writing code is no longer a strict requirement since Composer uses a graphical approach based on building flow charts and text templates that will form the logic of the Bot, while still allowing for the customization of some technical aspects. To make the most of the framework\u2019s features, it can be useful to know its conventions and which integrations it offers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One example is the integration with different services on the Azure Cloud, for which the tool offers native integration, like the NLP services LUIS and QnA Maker, that help us build a rich and smart application.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you don\u2019t know LUIS, you can get a general idea of which features it offers by looking at this previous <a href=\"https:\/\/ellycode.com\/en\/blog-en\/learning-to-understand-the-language\/\" target=\"_blank\" rel=\"noreferrer noopener\">article<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once <a href=\"https:\/\/docs.microsoft.com\/en-us\/composer\/install-composer\" target=\"_blank\" rel=\"noreferrer noopener\">installed<\/a> and opened, Composer immediately shows us many examples from which to start or even just draw inspiration. Among these we will take a look at \u201cTo Do with LUIS\u201d, a Bot for the management of to do lists and that uses LUIS to understand user requests.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"760\" src=\"https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/main_screen_numbers.png?resize=1024%2C760&#038;ssl=1\" alt=\"\" class=\"wp-image-3274\" srcset=\"https:\/\/ellycode.com\/wp-content\/uploads\/2021\/04\/main_screen_numbers-980x727.png 980w, https:\/\/ellycode.com\/wp-content\/uploads\/2021\/04\/main_screen_numbers-480x356.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">After opening a new project, the main screen looks like this:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>A side menu to move between different parts of Composer.<\/li><li>The list of the <em>dialogs <\/em>managed by the Bot.<\/li><li>The flow of the selected <em>dialog<\/em>.<\/li><li>The properties of a single block in the flow.<\/li><\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">But what are these <em>dialogs<\/em>?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-dialog-management\"><strong>Dialog management<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A conversation with a user is managed in what is called a <em>dialog<\/em>, that represents a specific sequence of interactions with the user. Inside a dialog we can request information from the user, send him messages, evaluate data we have at hand and perform actions. Let\u2019s see this in practice by selecting the <em>WelcomeUser<\/em> dialog from the list.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This dialog sends a welcome message to the users that open a conversation with the Bot. The message is sent from the <em>Send a Response<\/em> block.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"470\" height=\"407\" data-attachment-id=\"3280\" data-permalink=\"https:\/\/ellycode.com\/en\/blog-en\/artificial-intelligence-for-everyone-bot-framework-composer\/attachment\/send_response-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/send_response.png?fit=470%2C407&amp;ssl=1\" data-orig-size=\"470,407\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"send_response\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/send_response.png?fit=470%2C407&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/send_response.png?resize=470%2C407&#038;ssl=1\" alt=\"\" class=\"wp-image-3280\" srcset=\"https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/send_response.png?w=470&amp;ssl=1 470w, https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/send_response.png?resize=300%2C260&amp;ssl=1 300w\" sizes=\"auto, (max-width: 470px) 100vw, 470px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">From here it is possible to enrich the response. We can add variations to the phrases, to make the conversation more dynamic, or we can add a spoken response by synthesizing the text.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We can use the graphical approach, or directly edit the text template that uses the <a href=\"https:\/\/docs.microsoft.com\/en-us\/composer\/how-to-send-messages\" target=\"_blank\" rel=\"noreferrer noopener\">LanguageGenerator<\/a> syntax. This syntax allows us to go beyond simple text, and respond with rich and interactive cards, for instance including audio or video, or using <a href=\"https:\/\/adaptivecards.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Adaptive Cards<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With Adaptive Cards, it is possible to create interactive cards to present information graphically and interactively, like this card with flight info, that is only one of the many examples provided on the Adaptive Card portal.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"398\" height=\"307\" data-attachment-id=\"3282\" data-permalink=\"https:\/\/ellycode.com\/en\/blog-en\/artificial-intelligence-for-everyone-bot-framework-composer\/attachment\/flight_card-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/flight_card.png?fit=398%2C307&amp;ssl=1\" data-orig-size=\"398,307\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"flight_card\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/flight_card.png?fit=398%2C307&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/flight_card.png?resize=398%2C307&#038;ssl=1\" alt=\"\" class=\"wp-image-3282\" srcset=\"https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/flight_card.png?w=398&amp;ssl=1 398w, https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/flight_card.png?resize=300%2C231&amp;ssl=1 300w\" sizes=\"auto, (max-width: 398px) 100vw, 398px\" \/><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-intent-recognition\"><strong>Intent recognition<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">User intent recognition can be done by defining fixed rules, or relying on LUIS. In Composer we can define the example phrases and even the entities contained in them.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"734\" src=\"https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/intent_recog.png?resize=1024%2C734&#038;ssl=1\" alt=\"\" class=\"wp-image-3283\" srcset=\"https:\/\/ellycode.com\/wp-content\/uploads\/2021\/04\/intent_recog-1024x734.png 1024w, https:\/\/ellycode.com\/wp-content\/uploads\/2021\/04\/intent_recog-980x702.png 980w, https:\/\/ellycode.com\/wp-content\/uploads\/2021\/04\/intent_recog-480x344.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">In the event that you don\u2019t want to rely upon LUIS, you can define a list of regular expressions in the <em>trigger phrases<\/em> field. With this method it is possible to recognize simple phrases and it\u2019s a good method when we expect phrases that won\u2019t vary much, or when using custom codes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With regular expressions not only it is possible to recognize the user\u2019s intent, but we can even extract parts of the phrase as variables to use in our dialogs.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"465\" height=\"186\" data-attachment-id=\"3287\" data-permalink=\"https:\/\/ellycode.com\/en\/blog-en\/artificial-intelligence-for-everyone-bot-framework-composer\/attachment\/regexp_intent-1-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/regexp_intent-1.png?fit=465%2C186&amp;ssl=1\" data-orig-size=\"465,186\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"regexp_intent-1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/regexp_intent-1.png?fit=465%2C186&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/regexp_intent-1.png?resize=465%2C186&#038;ssl=1\" alt=\"\" class=\"wp-image-3287\" srcset=\"https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/regexp_intent-1.png?w=465&amp;ssl=1 465w, https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/regexp_intent-1.png?resize=300%2C120&amp;ssl=1 300w\" sizes=\"auto, (max-width: 465px) 100vw, 465px\" \/><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-additional-features\"><strong>Additional features<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">It\u2019s often necessary to access external services in order to perform the required actions or retrieve information to be returned to the user. Composer provides many tools for accessing external resources. For instance, it\u2019s possible to invoke a REST API. The result of the invocation can then be manipulated in the dialog flow and returned to the user.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bot Framework Composer also allows us to manage dialogs in multiple languages, so it is easy to translate the app into your users\u2019 languages.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As we mentioned before, Bot Framework Composer is part of a bigger framework called <a href=\"https:\/\/dev.botframework.com\" target=\"_blank\" rel=\"noreferrer noopener\">Bot Framework<\/a>: a flexible system, to which we can apply many customizations that suit every use case. In <a href=\"https:\/\/microsoft.github.io\/botframework-solutions\/\" target=\"_blank\" rel=\"noreferrer noopener\">Bot Framework Solutions<\/a>, for example, you can find the implementation of a feedback mechanism to ask for the users\u2019 opinion of the Bot, so we can improve it based on user feedback.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-testing-the-application\"><strong>Testing the application<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To test the application, it is possible to start the Bot and open a conversation. Composer runs the Bot and creates the resources we need to test the application, in this case, for example, it creates the LUIS apps automatically.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"394\" height=\"592\" data-attachment-id=\"3289\" data-permalink=\"https:\/\/ellycode.com\/en\/blog-en\/artificial-intelligence-for-everyone-bot-framework-composer\/attachment\/test_webchat-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/test_webchat.png?fit=394%2C592&amp;ssl=1\" data-orig-size=\"394,592\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"test_webchat\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/test_webchat.png?fit=394%2C592&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/test_webchat.png?resize=394%2C592&#038;ssl=1\" alt=\"\" class=\"wp-image-3289\" srcset=\"https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/test_webchat.png?w=394&amp;ssl=1 394w, https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/test_webchat.png?resize=200%2C300&amp;ssl=1 200w\" sizes=\"auto, (max-width: 394px) 100vw, 394px\" \/><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-to-production\"><strong>To production!<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">There are many ways to deploy the application, one is completely automatic and there\u2019s also a manual one. For the former, the tool will take care of creating and managing all the resources needed to run our bot on Azure, for example the LUIS and QnA maker apps.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In project settings, we create a <em>publish profile.<\/em> The wizard will ask us to login to our Azure account (for which we must have a valid subscription) and will then do the rest.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"733\" src=\"https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/app_publish.png?resize=1024%2C733&#038;ssl=1\" alt=\"\" class=\"wp-image-3290\" srcset=\"https:\/\/ellycode.com\/wp-content\/uploads\/2021\/04\/app_publish-1024x733.png 1024w, https:\/\/ellycode.com\/wp-content\/uploads\/2021\/04\/app_publish-980x702.png 980w, https:\/\/ellycode.com\/wp-content\/uploads\/2021\/04\/app_publish-480x344.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The second way is exporting the application code and deploying it manually into the preferred environment. <a href=\"https:\/\/docs.microsoft.com\/en-us\/composer\/how-to-add-custom-action?tabs=csharp#export-the-bot-runtime\" target=\"_blank\" rel=\"noreferrer noopener\">This procedure<\/a> \u00a0is for expert users, and allows us to customize the applications\u2019 more technical aspects.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Either way, once exported the Bot can be published on the available channels like Teams, Skype, Facebook and <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/bot-service\/bot-service-manage-channels?view=azure-bot-service-4.0\" target=\"_blank\" rel=\"noreferrer noopener\">many others<\/a>. \u00a0Alternatively, we can use the Web Chat project to integrate a chat into an already existing site.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-finally\"><strong>Finally<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Bot Framework Composer with its low-code approach helps us separate the technical problems from the domain ones, allowing non-technical people to be included in the product development cycle, while leaving the door open to Bot customization by modifying the code to integrate features that are not already included.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It\u2019s very important to understand that technology like this shouldn\u2019t be left to developers alone, which is the main reason why we are creating <a href=\"https:\/\/ellycode.com\/en\/blog-en\/artificial-intelligence-and-data-access-challenge-accepted\" target=\"_blank\" rel=\"noreferrer noopener\">Elly<\/a>: to build tools that help the experts give value to their own data!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Keep following us!<\/p>\n\n\n[et_pb_section global_module=\"1791\"][\/et_pb_section]\n","protected":false},"excerpt":{"rendered":"<p>When building an application that involves artificial intelligence, the interaction between different departments within the company is the key to success. This is especially true for conversational applications, where each of the team members can focus on their specific areas: domain experts, for instance, can contribute to the implementation of useful features in their own [&hellip;]<\/p>\n","protected":false},"author":195423238,"featured_media":3296,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_crdt_document":"","inline_featured_image":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[688637375],"tags":[],"class_list":["post-3299","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-en"],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/ellycode.com\/wp-content\/uploads\/2021\/04\/14_1105x656_blog_Composer.png?fit=1105%2C656&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/pcuDuD-Rd","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ellycode.com\/en\/wp-json\/wp\/v2\/posts\/3299","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ellycode.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ellycode.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ellycode.com\/en\/wp-json\/wp\/v2\/users\/195423238"}],"replies":[{"embeddable":true,"href":"https:\/\/ellycode.com\/en\/wp-json\/wp\/v2\/comments?post=3299"}],"version-history":[{"count":10,"href":"https:\/\/ellycode.com\/en\/wp-json\/wp\/v2\/posts\/3299\/revisions"}],"predecessor-version":[{"id":3317,"href":"https:\/\/ellycode.com\/en\/wp-json\/wp\/v2\/posts\/3299\/revisions\/3317"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ellycode.com\/en\/wp-json\/wp\/v2\/media\/3296"}],"wp:attachment":[{"href":"https:\/\/ellycode.com\/en\/wp-json\/wp\/v2\/media?parent=3299"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ellycode.com\/en\/wp-json\/wp\/v2\/categories?post=3299"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ellycode.com\/en\/wp-json\/wp\/v2\/tags?post=3299"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}