{"id":19841,"date":"2021-02-17T12:45:55","date_gmt":"2021-02-17T11:45:55","guid":{"rendered":"https:\/\/www.inovex.de\/blog\/?p=19841"},"modified":"2026-03-23T12:27:29","modified_gmt":"2026-03-23T11:27:29","slug":"building-a-contextual-assistant-with-rasa-and-flutter","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/","title":{"rendered":"Building a Contextual Assistant with Rasa and Flutter"},"content":{"rendered":"<p>In the following blog post we talk about the challenge of developing a contextual assistant (aka chatbot) with Rasa, the flexibility of Flutter and the communication between these two frameworks.<span style=\"font-weight: 400;\">The project started in the context of an <em>inovex practice<\/em>, a student-only project which emulates all aspects of a regular billed project, including a stakeholder, PO, scrum master and technical coaches.<\/span><\/p>\n<p>As we looked into new frameworks and technologies for inspiration, two of them caught our attention. Flutter as a new cross-platform framework, and Rasa as a framework for building contextual assistants. We decided to combine both frameworks to build a cross-platform chatbot, called JAVEX.<!--more--><\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/#Rasa\" >Rasa<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/#Flutter\" >Flutter<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/#Communication-with-Rasa\" >Communication with Rasa<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/#Flutter-%E2%80%93-Web\" >Flutter \u2013 Web<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/#Future-Prospects\" >Future Prospects<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Rasa\"><\/span>Rasa<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p style=\"text-align: justify;\">This blogpost is not exactly intended as an <a href=\"https:\/\/rasa.com\">Rasa<\/a> tutorial for beginners, for the fact that there are already informative documentation pages along with well written <a href=\"https:\/\/blog.rasa.com\/tag\/tutorials\/\">tutorials<\/a>.<\/p>\n<p style=\"text-align: justify;\">Building our first chatbot functions, it was very important for us to test the chatbot with real users. Therefore we used <a href=\"https:\/\/rasa.com\/docs\/rasa-x\/\">Rasa X<\/a>, a tool for <em>Conversation-Driven Development<\/em> (CDD). It was motivating for us as a developer team to see the assistant already in action with test users after the first week of development. With the help of Rasa X we were immediately able to review the conversations with test users and annotate the wrong and right decisions that the assistant made. These user tests resulted in more Natural Language Understanding (NLU) training data for our chatbot&#8217;s NLU components to learn from. To synchronize those newly acquired training data examples with our Git repository, we used the comfortable Gitlab CI\/CD integration of Rasa X.<\/p>\n<p style=\"text-align: justify;\">Our main goal was <strong>not<\/strong> to build a simple FAQ chatbot, which would only answer questions to some predefined topics. We wanted to go further \u2013 up to the level of a c<span style=\"color: #333399;\">ontextual assistant<\/span>.<\/p>\n<p style=\"text-align: justify;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-20119\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/11\/Javex_Icon.png\" alt=\"graphical element, inovex cube\" width=\"75\" height=\"97\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/11\/Javex_Icon.png 594w, https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/11\/Javex_Icon-232x300.png 232w, https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/11\/Javex_Icon-400x518.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/11\/Javex_Icon-360x466.png 360w\" sizes=\"auto, (max-width: 75px) 100vw, 75px\" \/><\/p>\n<p style=\"text-align: justify;\">To understand the meaning of the term <span style=\"color: #333399;\">Contextual Assistant<\/span> we would like to encourage you to read a <a href=\"https:\/\/blog.rasa.com\/level-3-contextual-assistants-beyond-answering-simple-questions\/\">Rasa blog post<\/a> about this topic.\u00a0But to sum it up briefly, a <span style=\"color: #333399;\">Contextual Assistant<\/span> should, according to Alex Weidauer, Co-founder &amp; CEO of Rasa, meet the following six requirements:<\/p>\n<ol style=\"text-align: justify;\">\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Gracefully Handle Any User Goal<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Read\/Write Contextual Data<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Disambiguation: Remove Uncertainty<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Extract Contextual Data<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Change of Context<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Business Logic<\/span><\/li>\n<\/ol>\n<p style=\"text-align: justify;\">We kept all these requirements in mind when we developed our chatbot and tried to meet as many of them as possible. We would like to elaborate on a few selected approaches below.<\/p>\n<p style=\"text-align: justify;\">To gracefully handle any user goal we used the Two Stage Fallback policy of Rasa which is used when the chatbot is not sure enough how to proceed the dialogue flow or what the intent of the user was. The Two Stage Fallback asks the user for confirmation of his intent when uncertain \u2013 e.g. when the user asks: \u201cWho works for inovex?\u201c, the chatbot might ask for additional confirmation: \u201cDo you mean \u2018How many employees does inovex have\u2019?\u201c. In addition to that, we implemented a functionality that we call Three Stage Fallback. When using only the Two Stage Fallback policy and the user denies the suggestion of the chatbot, the bot asks the user to rephrase his question.<\/p>\n<p style=\"text-align: justify;\">When the chatbot then still cannot understand the next question, it asks for a rephrasing of the question again. The result is an endless conversational loop of misunderstanding. With the third stage we give the user one chance to rephrase the question. However, if the chatbot is still uncertain about what to answer, it responds with a message that tells the user that this feature is not yet supported but that the developers will have a look at it. That is possible because we are able to review the user chat history by using the Rasa X Conversation-Driven Development functionalities.<\/p>\n<p>As an additional functionality to achieve the goal of a <span style=\"color: #333399;\">Contextual Assistant<\/span> we considered the fifth requirement from above:\u00a0Change of Context.<\/p>\n<p style=\"text-align: justify;\">With the use of the experimental <a href=\"https:\/\/blog.rasa.com\/response-retrieval-models\/\">response selector<\/a> feature of Rasa we were able to classify our simple FAQs into topics. E.g. we distinguished between questions regarding inovex and the chatbot itself. With the possibility to know in which context the user is chatting, we were able to tell the user that a change of context is happening but that the chatbot was very pleased to discuss and help with other topics as well. This behavior should make the conversation seem more natural in contrast to ordinary FAQ responses.<\/p>\n<p style=\"text-align: justify;\">By using a similar approach, we were able to identify consecutive, identical user intents. If the user asks our assistant roughly the same question at a certain time after asking the question for the first time, our assistant will still answer but indicate that he has answered this particular question already.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Flutter\"><\/span>Flutter<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p style=\"text-align: justify;\">Flutter is a young framework which is constantly developed further by Google. The very versatile framework offers many advantages. One of the biggest is the possibility to develop one code base for several platforms. Besides Android and iOS, Flutter-based applications can be started on the web and recently on desktop. Web support is in beta and desktop is still under development by the Flutter Team.<\/p>\n<p>The\u00a0advantages of Flutter and the requirement from our stakeholders to support both mobile platforms lead to the usage of Flutter for this project.<\/p>\n<p style=\"text-align: justify;\">The single code base for Android and iOS was the main reason to use Flutter in the practice. The following part discusses the possibilities of Flutter and our experiences. In particular creating a basic Chat-UI and bringing the app to the web is considered.<\/p>\n<p>Obviously, every chatbot needs a chat window. New messages should be added below and older messages should be made visible again by scrolling.\u00a0<span style=\"font-weight: 400;\">Flutter offers a variety of widgets that help to create said window.\u00a0<\/span><\/p>\n<p style=\"text-align: justify;\">To create a chat window, all upcoming widgets have to be organized, that is what the <em>Scaffold<\/em> widget does. The first widget inside the <em>Scaffold<\/em> is the <em>Flexible<\/em> widget which can resize itself. The child widget below the <em>Flexible<\/em> is called <em>Consumer<\/em> widget. The child of the <em>Consumer<\/em> widget is a <em>ListView.builder<\/em> which receives a list of all messages and builds a <em>ListView<\/em> by including the messages. Accordingly, messages from the user are positioned on the right and messages from the bot on the left.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-20121\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/11\/JXX-Screens-1024x576.png\" alt=\"example screenshots of the Javex chatbot\" width=\"800\" height=\"450\" \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-20120\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/11\/JVX-Screens-2-1024x576.png\" alt=\"screenshots of an exemplary conversion with Javex\" width=\"801\" height=\"450\" \/><\/p>\n<p style=\"text-align: justify;\">But how to update the chat from bot and user? Therefore we need the <em>Notifier<\/em>, in order to handle the <a href=\"https:\/\/flutter.dev\/docs\/development\/data-and-backend\/state-mgmt\/simple\">state management<\/a>. When a new message is sent by the bot or the user, the <em>Consumer<\/em> widget is notified.<\/p>\n<p style=\"text-align: justify;\">The <em>Notifier<\/em> stores all messages written in one session.The <em>Consumer<\/em> updates itself and all its child widgets as soon as notified by the <em>Notifier<\/em>. Updating leads to all new messages being visible in the chat. Each time a message is added to the <em>Notifier<\/em>, it notifies the <em>Consumer<\/em> widget, whether the message comes from the bot or the user. Hence the UI is updated and the <em>ListView<\/em> is rebuilt including the new message.<\/p>\n<p style=\"text-align: justify;\">To chat with the chatbot, we need a text field and a sending button which is also part of the <em>Scaffold<\/em> widget. By pressing the button the text is saved as a message in the <em>Notifier<\/em>. As soon as a message is added, the <em>Consumer<\/em> is notified and the UI is updated \u2013 as the process described above. This message is also sent to Rasa. The reply will again trigger an update of the chat.<\/p>\n<p style=\"text-align: justify;\">The following is our approach for implementing a basic chat UI in Flutter. There are multiple ways explained online for achieving this functionality (see <a href=\"https:\/\/medium.com\/@mx_tino\">here<\/a>). We had no problems to integrate this solution into our app or to extend it with features. We even managed to add images and even interactive widgets to the chat with ease, so it was not limited to text.<\/p>\n<p style=\"text-align: justify;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-20088 size-large\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/10\/Blog-Notifier-1024x576.png\" alt=\"Picture of the widget structure of Rasa in the application\" width=\"1024\" height=\"576\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/10\/Blog-Notifier-1024x576.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/10\/Blog-Notifier-300x169.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/10\/Blog-Notifier-768x432.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/10\/Blog-Notifier-1536x864.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/10\/Blog-Notifier-400x225.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/10\/Blog-Notifier-720x406.png 720w, https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/10\/Blog-Notifier-360x203.png 360w, https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/10\/Blog-Notifier.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Communication-with-Rasa\"><\/span>Communication with Rasa<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p style=\"text-align: justify;\">We developed an app for Android and iOS with Flutter that allows the user to get in touch with the contextual assistant. Rasa was hosted in a <span style=\"font-weight: 400;\">Google Cloud managed Kubernetes cluster (GKE)<\/span>. The two components communicate via HTTP. The app itself communicates exclusively with Rasa, which in turn communicates with the rest of the backend.\u00a0The information transfer between Flutter and Rasa takes place via HTTP API. A defined webhook exists at Rasa, which expects a predefined JSON and responds accordingly. Flutter sends a request, as a GET, and receives a JSON response.<\/p>\n<p style=\"text-align: justify;\">The answers from RASA can be different. Various JSON objects are used for different purposes. If only one text needs to be displayed, the default JSON from Rasa can be used. If Rasa should trigger a custom action with the response in Flutter, a custom JSON has to be created.<\/p>\n<p style=\"text-align: justify;\">The response from Rasa is evaluated and a custom builder decides which widget will be added to the chat. All necessary information can be found in the JSON and must be extracted.\u00a0We also looked at two other functionalities. For creating a calendar event we need to communicate with the Google calendar <a href=\"https:\/\/developers.google.com\/calendar\/overview\">API<\/a>. Another service was developed for access and made available in the Google Cloud. Also our chatbot should be made available via Slack. The integration of Slack can easily be achieved with the help of this<a href=\"https:\/\/rasa.com\/docs\/rasa\/connectors\/slack\/\"> tutorial<\/a>.\u00a0In this case no widgets can be displayed which has to be considered when receiving custom JSONs from Rasa.<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-20554\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/01\/Javex-Architektur-1024x471.png\" alt=\"\" width=\"1024\" height=\"471\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/01\/Javex-Architektur-1024x471.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/01\/Javex-Architektur-300x138.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/01\/Javex-Architektur-768x353.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/01\/Javex-Architektur-1536x706.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/01\/Javex-Architektur-2048x941.png 2048w, https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/01\/Javex-Architektur-1920x882.png 1920w, https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/01\/Javex-Architektur-400x184.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/01\/Javex-Architektur-360x165.png 360w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\">Besides providing information about the company inovex, we have implemented additional functionalities.<\/p>\n<ol style=\"text-align: justify;\">\n<li>Google Calendar integration<\/li>\n<li>custom theme &#8211; dark mode<\/li>\n<li>reminder notifications<\/li>\n<li>speech recognition<\/li>\n<li>image capturing<\/li>\n<\/ol>\n<p style=\"text-align: justify;\">The user had to login with his Google credentials and grant access to his Google calendar. So it was possible to create an appointment with an optional description by chatting with Rasa and to display any number of future appointments. We used the feature for custom themes to experiment with the framework and handling of state management. As a final feature we implemented a reminder function with local push notifications. The note &#8222;Remember appointment with inovex in 3 hours&#8220; resulted in a local notification on the cell phone in 3h \u2013 regardless of whether the app is running or not. Speech\u00a0recognition and image capturing were easy to integrate with third party libraries from the <a href=\"https:\/\/pub.dev\/\">pub.dev<\/a> website.<\/p>\n<ul>\n<li style=\"text-align: left;\"><a href=\"https:\/\/pub.dev\/packages\/speech_to_text\">speech_to_text<\/a><\/li>\n<li style=\"text-align: left;\"><a href=\"https:\/\/pub.dev\/packages\/image_picker\">image_picker<\/a><\/li>\n<li style=\"text-align: left;\"><a href=\"https:\/\/pub.dev\/packages\/multi_image_picker\">multi_image_picker<\/a><\/li>\n<li style=\"text-align: left;\"><a href=\"https:\/\/pub.dev\/packages\/firebase_core\">firebase_core<\/a><\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"Flutter-%E2%80%93-Web\"><\/span>Flutter \u2013 Web<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>In the last weeks of the project <span style=\"font-weight: 400;\">we evaluated the possibility to move the existing project to the web<\/span>. Flutter advertises with the possibility to deploy not only to Android and iOS but also to the web. This function however is only in a beta phase and not stable yet. Since there was only little time left in our six month project and a completely new UI design had to be implemented, we agreed to consider only the fundamental functions. Thus, a large part of the code could be reused without changes, but in some places it was still necessary to make case distinctions. Nevertheless, the deployment to a web app was a success.<\/p>\n<p style=\"text-align: justify;\">All in all, we can say that Flutter supported the cross-platform implementation of our chatbot. Even late decisions like the web application were doable. All of us are really looking forward to working with Flutter in future projects again.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Future-Prospects\"><\/span>Future Prospects<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>But we accomplished to build a real <span style=\"color: #333399;\">Contextual Assistant,<\/span><span style=\"font-weight: 400;\">\u00a0even though the project had a predefined, narrow scheduled of six months<\/span>.\u00a0W<span style=\"font-weight: 400;\">e were able to tackle many different features<\/span>\u00a0\u2013 from starting with a simple FAQ, to including Google Calendar functions and ending with the web support. Before the project ended we reached out to other internal projects, like the <a href=\"https:\/\/www.servicemeister.org\">Service-Meister<\/a> team which is part of a large consortium of IT and production companies. This consortiums goal is to establish an AI-based Ecosystem for Technical Service in the age of Industry 4.0. Our projects were a perfect supplement, so we decided to go forward and integrated them.<\/p>\n<p>Finally, we can say that <span style=\"font-weight: 400;\">Flutter and Rasa are young, yet solid frameworks to build a real-world application. The architecture of both frameworks is very flexible, allowing the dev team to easily handle feature requests without having to rewrite existing components<\/span>. Please see <a href=\"https:\/\/flutter.dev\">Flutter&#8217;s<\/a> and <a href=\"https:\/\/rasa.com\">Rasa&#8217;s<\/a> websites for more detailed information. Both are open-source frameworks and provide easy getting-started tutorials, codelabs, and master classes.<\/p>\n<p style=\"text-align: justify;\">We encourage you to look into and read more about both frameworks. Here are some good starting points from our reading list.<\/p>\n<p style=\"text-align: justify;\">Further reading list for this topic:<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"text-align: justify;\"><a href=\"https:\/\/www.inovex.de\/blog\/flutter-beginning-of-a-new-era-part-1\/\">Flutter &#8211; beginning of a new Era?<\/a><\/li>\n<li><a href=\"https:\/\/www.inovex.de\/de\/referenzen\/case-studies\/suedzucker-self-service-app-beet2go\/\">Flutter &#8211; Case Study S\u00fcdzucker<\/a><\/li>\n<li style=\"text-align: justify;\">Chatbots und digitale Assistenten<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the following blog post we talk about the challenge of developing a contextual assistant (aka chatbot) with Rasa, the flexibility of Flutter and the communication between these two frameworks.The project started in the context of an inovex practice, a student-only project which emulates all aspects of a regular billed project, including a stakeholder, PO, [&hellip;]<\/p>\n","protected":false},"author":97,"featured_media":20085,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[508,372,373,374,375,376,377,378,379,380,381,382],"service":[424,420,76],"coauthors":[],"class_list":["post-19841","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-agile-2","tag-app","tag-chatbot","tag-conversation-driven-development","tag-conversational-ai","tag-cross-platform","tag-development","tag-flutter","tag-nlu","tag-rasa","tag-service-meister","tag-widgets","service-agile","service-apps","service-artificial-intelligence"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Building a Contextual Assistant with Rasa and Flutter - inovex GmbH<\/title>\n<meta name=\"description\" content=\"In this blog post we talk about the development of a cross-platform contextual assistant (chatbot) with Rasa and Flutter.Our main goal was not to build a simple FAQ chatbot which would only answer questions to some predefined topics. We wanted to improve our chatbot further \u2013 up to the level of a Contextual Assistant.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building a Contextual Assistant with Rasa and Flutter - inovex GmbH\" \/>\n<meta property=\"og:description\" content=\"In this blog post we talk about the development of a cross-platform contextual assistant (chatbot) with Rasa and Flutter.Our main goal was not to build a simple FAQ chatbot which would only answer questions to some predefined topics. We wanted to improve our chatbot further \u2013 up to the level of a Contextual Assistant.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2021-02-17T11:45:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-23T11:27:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/10\/Blog-title-Logo.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Tino Kallinich-Friedrich\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/10\/Blog-title-Logo-1024x576.png\" \/>\n<meta name=\"twitter:creator\" content=\"@mx_tino\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tino Kallinich-Friedrich\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"10\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/building-a-contextual-assistant-with-rasa-and-flutter\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/building-a-contextual-assistant-with-rasa-and-flutter\\\/\"},\"author\":{\"name\":\"Tino Kallinich-Friedrich\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/fcabd1e46229e68364e666b6732ff86f\"},\"headline\":\"Building a Contextual Assistant with Rasa and Flutter\",\"datePublished\":\"2021-02-17T11:45:55+00:00\",\"dateModified\":\"2026-03-23T11:27:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/building-a-contextual-assistant-with-rasa-and-flutter\\\/\"},\"wordCount\":2072,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/building-a-contextual-assistant-with-rasa-and-flutter\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/Blog-title-Logo.png\",\"keywords\":[\"Agile\",\"App\",\"Chatbot\",\"Conversation-Driven-Development\",\"Conversational Ai\",\"Cross-Platform\",\"Development\",\"Flutter\",\"NLU\",\"Rasa\",\"Service-Meister\",\"Widgets\"],\"articleSection\":[\"Applications\",\"English Content\",\"General\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/building-a-contextual-assistant-with-rasa-and-flutter\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/building-a-contextual-assistant-with-rasa-and-flutter\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/building-a-contextual-assistant-with-rasa-and-flutter\\\/\",\"name\":\"Building a Contextual Assistant with Rasa and Flutter - inovex GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/building-a-contextual-assistant-with-rasa-and-flutter\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/building-a-contextual-assistant-with-rasa-and-flutter\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/Blog-title-Logo.png\",\"datePublished\":\"2021-02-17T11:45:55+00:00\",\"dateModified\":\"2026-03-23T11:27:29+00:00\",\"description\":\"In this blog post we talk about the development of a cross-platform contextual assistant (chatbot) with Rasa and Flutter.Our main goal was not to build a simple FAQ chatbot which would only answer questions to some predefined topics. We wanted to improve our chatbot further \u2013 up to the level of a Contextual Assistant.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/building-a-contextual-assistant-with-rasa-and-flutter\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/building-a-contextual-assistant-with-rasa-and-flutter\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/building-a-contextual-assistant-with-rasa-and-flutter\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/Blog-title-Logo.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/Blog-title-Logo.png\",\"width\":1920,\"height\":1080,\"caption\":\"Javex Logo\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/building-a-contextual-assistant-with-rasa-and-flutter\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building a Contextual Assistant with Rasa and Flutter\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/inovexde\",\"https:\\\/\\\/x.com\\\/inovexgmbh\",\"https:\\\/\\\/www.instagram.com\\\/inovexlife\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/inovex\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/fcabd1e46229e68364e666b6732ff86f\",\"name\":\"Tino Kallinich-Friedrich\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/cropped-profil-small-96x96.jpg163197d5916185dd18c854751cbd8b08\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/cropped-profil-small-96x96.jpg\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/cropped-profil-small-96x96.jpg\",\"caption\":\"Tino Kallinich-Friedrich\"},\"description\":\"B.Sc. Informatik and B.Sc. Nautik\",\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/in\\\/tino-k-friedrich\\\/\",\"https:\\\/\\\/x.com\\\/mx_tino\"],\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/author\\\/tkallinich-2-2-2-2-2\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Building a Contextual Assistant with Rasa and Flutter - inovex GmbH","description":"In this blog post we talk about the development of a cross-platform contextual assistant (chatbot) with Rasa and Flutter.Our main goal was not to build a simple FAQ chatbot which would only answer questions to some predefined topics. We wanted to improve our chatbot further \u2013 up to the level of a Contextual Assistant.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/","og_locale":"de_DE","og_type":"article","og_title":"Building a Contextual Assistant with Rasa and Flutter - inovex GmbH","og_description":"In this blog post we talk about the development of a cross-platform contextual assistant (chatbot) with Rasa and Flutter.Our main goal was not to build a simple FAQ chatbot which would only answer questions to some predefined topics. We wanted to improve our chatbot further \u2013 up to the level of a Contextual Assistant.","og_url":"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2021-02-17T11:45:55+00:00","article_modified_time":"2026-03-23T11:27:29+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/10\/Blog-title-Logo.png","type":"image\/png"}],"author":"Tino Kallinich-Friedrich","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/10\/Blog-title-Logo-1024x576.png","twitter_creator":"@mx_tino","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Tino Kallinich-Friedrich","Gesch\u00e4tzte Lesezeit":"10\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/"},"author":{"name":"Tino Kallinich-Friedrich","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/fcabd1e46229e68364e666b6732ff86f"},"headline":"Building a Contextual Assistant with Rasa and Flutter","datePublished":"2021-02-17T11:45:55+00:00","dateModified":"2026-03-23T11:27:29+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/"},"wordCount":2072,"commentCount":0,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/10\/Blog-title-Logo.png","keywords":["Agile","App","Chatbot","Conversation-Driven-Development","Conversational Ai","Cross-Platform","Development","Flutter","NLU","Rasa","Service-Meister","Widgets"],"articleSection":["Applications","English Content","General"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/","url":"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/","name":"Building a Contextual Assistant with Rasa and Flutter - inovex GmbH","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/10\/Blog-title-Logo.png","datePublished":"2021-02-17T11:45:55+00:00","dateModified":"2026-03-23T11:27:29+00:00","description":"In this blog post we talk about the development of a cross-platform contextual assistant (chatbot) with Rasa and Flutter.Our main goal was not to build a simple FAQ chatbot which would only answer questions to some predefined topics. We wanted to improve our chatbot further \u2013 up to the level of a Contextual Assistant.","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/10\/Blog-title-Logo.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/10\/Blog-title-Logo.png","width":1920,"height":1080,"caption":"Javex Logo"},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/building-a-contextual-assistant-with-rasa-and-flutter\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"Building a Contextual Assistant with Rasa and Flutter"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/fcabd1e46229e68364e666b6732ff86f","name":"Tino Kallinich-Friedrich","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/wp-content\/uploads\/cropped-profil-small-96x96.jpg163197d5916185dd18c854751cbd8b08","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/cropped-profil-small-96x96.jpg","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/cropped-profil-small-96x96.jpg","caption":"Tino Kallinich-Friedrich"},"description":"B.Sc. Informatik and B.Sc. Nautik","sameAs":["https:\/\/www.linkedin.com\/in\/tino-k-friedrich\/","https:\/\/x.com\/mx_tino"],"url":"https:\/\/www.inovex.de\/de\/blog\/author\/tkallinich-2-2-2-2-2\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/19841","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/97"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=19841"}],"version-history":[{"count":5,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/19841\/revisions"}],"predecessor-version":[{"id":66676,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/19841\/revisions\/66676"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/20085"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=19841"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=19841"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=19841"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=19841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}