Step-by-Step Tutorial: Create a RAG Chatbot with n8n AI Agents in MINUTES

440 views4014 WordsCopy TextShare
Leon van Zyl
In this n8n AI Agent tutorial you will learn how to create a RAG Chatbot that can answer questions f...
Video Transcript:
<b>Imagine having an AI assistant that can</b> <b>answer questions using the documents in</b> <b>your Google Drve folder. </b> <b>Today, I'll show you how to build exactly</b> <b>that using N8N's AI Agent node. </b> <b>With the rapid development of AI,</b> <b>learning to create your own AI agents is</b> <b>becoming an essential skill for</b> <b>developers and businesses alike.
</b> <b>So in this video, we'll focus on one of</b> <b>the most popular applications of AI</b> <b>agents in N8N, creating RAG chatbots. </b> <b>These intelligent chatbots can answer</b> <b>questions from various data sources like</b> <b>databases or documents. </b> <b>They're perfect for automating email</b> <b>responses, powering website FAQs, or</b> <b>creating custom knowledge assistants.
</b> <b>Of course, there are many more things</b> <b>that you can do with</b> <b>these AI agent nodes,</b> <b>but I believe that this tutorial will</b> <b>give you a strong foundation for building</b> <b>your very own agent-driven applications. </b> <b>Now let's have a look at</b> <b>what we'll be building. </b> <b>We will create this intelligent AI</b> <b>chatbot that can answer questions from</b> <b>our very own knowledge base.
</b> <b>For instance, what are</b> <b>the current specials? </b> <b>And the agent was able to answer this</b> <b>question using the files</b> <b>in this Google Drve folder. </b> <b>And if I wanted to add more information</b> <b>to this knowledge base, all I have to do</b> <b>is add another file to this folder.
</b> <b>For instance, this list of</b> <b>menu items with their prices. </b> <b>So if I go back to the chatbot, I'll now</b> <b>be able to ask it questions from the</b> <b>menu, like how much are the land chops,</b> <b>and we do get the correct response back. </b> <b>So you could use that folder to upload</b> <b>lecture notes or whatever you want.
</b> <b>You can also share this chatbot with your</b> <b>friends or clients by copying this chat</b> <b>URL and then opening it in the browser. </b> <b>And of course, we can</b> <b>continue chatting to our chatbot. </b> <b>Or we could take this a step further and</b> <b>embed this chatbot into a website.
</b> <b>And now we have an assistant that's</b> <b>available 24-7 that can</b> <b>assist users with their queries. </b> <b>And in this video, I will show you how to</b> <b>embed this into a website and customize</b> <b>the look and feel of this chat window. </b> <b>So let's get started.
</b> <b>This video will be on the longer side,</b> <b>but I really wanted to give</b> <b>you as much value as possible. </b> <b>So make a cup of</b> <b>coffee and get comfortable. </b> <b>Let's get started.
</b> <b>There are basically two phases involved</b> <b>in building out this application. </b> <b>The first phase involves loading data</b> <b>from a data source like a</b> <b>PDF file, a database, etc. </b> <b>And then loading the</b> <b>data into a vector store.
</b> <b>You can simply see the vector store as</b> <b>the knowledge base that the AI model will</b> <b>use to answer questions. </b> <b>The second phase is</b> <b>building the AI assistant itself. </b> <b>But enough talk.
</b> <b>Let's actually build this. </b> <b>Let's click on Add Workflow and let's</b> <b>call this workflow Update Knowledge Base. </b> <b>So what this workflow will do is grab the</b> <b>data from a data source and then up-serve</b> <b>that data into a vector store.
</b> <b>In this example, we will use a Google</b> <b>Drve containing</b> <b>files as our data source. </b> <b>So go ahead and create a new folder in</b> <b>your Google Drve account. </b> <b>I simply called mine Oak and Barrel.
</b> <b>Just to keep with the</b> <b>restaurant example from earlier. </b> <b>Here, I'll upload this Q&A document that</b> <b>contains some simple information about</b> <b>our Oak and Barrel restaurant. </b> <b>Now what we want to do is the moment the</b> <b>user uploads a file to this folder, we</b> <b>want our workflow to be triggered.
</b> <b>So as the first step,</b> <b>let's search for Drve. </b> <b>Let's add Google Drve. </b> <b>And for the trigger, let's select on</b> <b>changes involving a specific folder.
</b> <b>Under credentials, let's</b> <b>select Create New Credential. </b> <b>Now we need to provide a</b> <b>client ID and a client secret. </b> <b>To get those, go to</b> <b>Google Cloud Platform.
</b> <b>So I'll simply click on Console and let's</b> <b>first create a new project. </b> <b>So under this dropdown, let's click on</b> <b>New Project and let's call</b> <b>the project N8N Tutorial. </b> <b>Let's create this project and let's also</b> <b>go ahead and select this project.
</b> <b>Either by clicking on it here or in the</b> <b>dropdown, simply select the</b> <b>project that you just created. </b> <b>Now on the left hand side,</b> <b>let's go to APIs and services. </b> <b>Let's go to Library.
</b> <b>Let's search for Google Drve. </b> <b>Let's then select the Google Drve API</b> <b>and let's click on Enable. </b> <b>After that, go to the OAuth consent</b> <b>screen, select External, click on Create.
</b> <b>Let's call the app N8N Tutorial. </b> <b>Select your email address and scrolling</b> <b>down, enter your</b> <b>developer contact information. </b> <b>Then click on Save and Continue.
</b> <b>We don't have to do</b> <b>anything on the scopes page. </b> <b>So scroll down and</b> <b>click on Save and Continue. </b> <b>We don't have to do</b> <b>anything under Test Users.
</b> <b>So click on Save and Continue and then</b> <b>click on Back to Dashboard. </b> <b>And then lastly, click on</b> <b>Publish App and confirm this. </b> <b>We can finally go ahead and</b> <b>create our OAuth credentials.
</b> <b>Click on Create</b> <b>Credentials, OAuth Client ID. </b> <b>Under the Application</b> <b>Type, select Web Application. </b> <b>Let's give our web app a name.
</b> <b>And under Authorized Redirect URIs, click</b> <b>on Add URI and then</b> <b>back in N8N, copy this</b> <b>redirect URL and</b> <b>paste it into this field. </b> <b>And finally, we can click on Create. </b> <b>We can now copy our client ID and paste</b> <b>it into N8N and let's do</b> <b>the same for the client</b> <b>secret.
</b> <b>After doing that, you should see the sign</b> <b>in with Google popup. </b> <b>So let's click on that, select your email</b> <b>address, click on Select All and click on</b> <b>Continue. </b> <b>If you've done everything correctly, you</b> <b>should see this account connected message</b> <b>over here.
</b> <b>We can now close this popup and we're now</b> <b>able to connect to our</b> <b>Google Drve account. </b> <b>So under Pulled Times, we can tell N8N</b> <b>how often to check for</b> <b>new files in our Google</b> <b>Drve folder. </b> <b>So I'll just leave it as Every Minute.
</b> <b>Then on Trigger On, select Changes</b> <b>Involving a Specific Folder. </b> <b>Then under the folder list, go ahead and</b> <b>search for the folder</b> <b>that you just created. </b> <b>I called mine Oak and Barrel.
</b> <b>Under Watch 4, I'll select File Created. </b> <b>So whenever a file is created on that</b> <b>folder, we will execute this workflow. </b> <b>I'm going to go ahead and test this.
</b> <b>And indeed, I get a response back and</b> <b>looking at the schema, I</b> <b>can see under the original</b> <b>file name that this is indeed the file</b> <b>that I just uploaded. </b> <b>So whenever we upload a file, this</b> <b>workflow will be triggered,</b> <b>giving us all this information</b> <b>related to the file that was just added. </b> <b>The next thing we want to do is to</b> <b>actually download that</b> <b>file so that we can pull its</b> <b>contents.
</b> <b>Let's click on Add Node and</b> <b>let's add Google Drve again. </b> <b>But this time, select Download File. </b> <b>We've already set up the credentials for</b> <b>Google Drve, so simply</b> <b>select your connection.
</b> <b>Under Resource, leave it as File. </b> <b>The operation should be download. </b> <b>And now for File, what we'll do is change</b> <b>it to Buy ID and we'll</b> <b>then grab the ID from</b> <b>this Google Drve trigger.
</b> <b>So scrolling down, we're looking for this</b> <b>ID field, which we can just drag and drop</b> <b>into this input over here. </b> <b>I'll go ahead and test this step as well. </b> <b>And this message means that the file was</b> <b>indeed downloaded to N8N.
</b> <b>Great. </b> <b>Now finally, we need to grab the content</b> <b>from the file and insert</b> <b>it into a vector store. </b> <b>For the vector store, we will be using</b> <b>Pinecone, so go over to</b> <b>pinecone.
io and log in or sign</b> <b>up for your account. </b> <b>Pinecone offers a generous free tier, so</b> <b>this one cost you anything. </b> <b>After signing in, click on Create Index</b> <b>and give your index a name like N8N.
</b> <b>Then under Dimensions, I'll click on Set</b> <b>Up by Model and also</b> <b>select the text embedding</b> <b>3 small model. </b> <b>And let's click on Set Configuration. </b> <b>Then simply click on Create Index.
</b> <b>Great. </b> <b>Now that we have our database set up, we</b> <b>can go to API Keys, then</b> <b>click on Create API Key. </b> <b>I'll call mine N8N Tutorial and let's</b> <b>click on Create API Key.
</b> <b>We can then copy the key value and back</b> <b>in N8N, let's search</b> <b>for Pinecone Vector Store. </b> <b>Under Credentials, let's</b> <b>select Create New Credential. </b> <b>Let's paste in that API</b> <b>key and let's click on Save.
</b> <b>Let's close this popup. </b> <b>Then let's change the</b> <b>operation mode to Insert Documents. </b> <b>From the Pinecone</b> <b>Index, let's select N8N.
</b> <b>And what I like to do is to add a</b> <b>Pinecone namespace</b> <b>for each of my projects. </b> <b>I'll call this Oak Ant Barrel. </b> <b>It's closed as popup and it's simply</b> <b>connect our Google</b> <b>Drve node to Pinecone.
</b> <b>The Pinecone Vector Store accepts two</b> <b>inputs, the embedding</b> <b>function and a document loader. </b> <b>Let's start with the embedding function. </b> <b>For this tutorial, I will be using the</b> <b>OpenAI models for both</b> <b>the embedding functions as</b> <b>well as the chat models for our agent.
</b> <b>OpenAI is not free to use,</b> <b>but it is extremely cheap. </b> <b>Honestly speaking, from my professional</b> <b>experience, it's one of</b> <b>those providers that you need</b> <b>to learn if you do want to pursue this as</b> <b>a career or build your own SaaS apps. </b> <b>You can also download and run free models</b> <b>using Olama, but for</b> <b>simplicity's sake, I'm</b> <b>simply going to stick with OpenAI.
</b> <b>Under Credentials, let's click on Create</b> <b>New Credentials and all we</b> <b>have to do now is generate</b> <b>an OpenAI API key. </b> <b>And I promise, that's the last API key</b> <b>that we need to</b> <b>generate for this tutorial. </b> <b>Go to platform.
openai. com slash API keys</b> <b>and then click on Create New Secret Key. </b> <b>I'll call mine N8N Tutorial.
</b> <b>Let's click on Create Secret Key. </b> <b>Let's copy this key and add it to N8N. </b> <b>The connection was successful, so I'll</b> <b>simply close this popup.
</b> <b>Let's change the model to</b> <b>Text in Beddings 3 Small. </b> <b>This needs to be the same model that we</b> <b>used when creating our pinecone index. </b> <b>Now all we have to do is add this</b> <b>document loader, or simply use the</b> <b>default data loader.
</b> <b>Let's change the data type from JSON to</b> <b>binary, and we can</b> <b>actually go ahead and close this</b> <b>popup. </b> <b>Then the data loader expects a text</b> <b>splitter, so let's click on that. </b> <b>Let's select a recursive</b> <b>character text splitter.
</b> <b>Also the chunk size to</b> <b>500, with an overlap of 20. </b> <b>For larger documents, I do recommend</b> <b>changing the chunk size to</b> <b>something like 1000 to 2000</b> <b>characters, with a chunk</b> <b>overlap of perhaps 200. </b> <b>We can now test this workflow by clicking</b> <b>on Test Workflow, and we</b> <b>can see that 10 documents</b> <b>were added to the vector store, and if we</b> <b>go back to pinecone,</b> <b>we can indeed see that</b> <b>10 documents were added.
</b> <b>And if we have a look at the document, we</b> <b>can see the text</b> <b>contained in this document,</b> <b>and this text was indeed extracted from</b> <b>the file in our Google Drve. </b> <b>However there is one announcement that I</b> <b>do want to make to this. </b> <b>At the moment I can't see which file this</b> <b>information was extracted from.
</b> <b>It's quite simple at the moment because</b> <b>we only have this one</b> <b>file, but we could have</b> <b>as many files as we want. </b> <b>It would be ideal in these documents if</b> <b>we could see which file this relates to. </b> <b>This is really easy to set up.
</b> <b>In our document loader, let's simply go</b> <b>to Options, let's go to</b> <b>Metadata, Add Property,</b> <b>and now we can call</b> <b>this whatever we want. </b> <b>I'll simply call this property file, and</b> <b>for the value, I want</b> <b>to add the file name. </b> <b>So on the left hand side, I'll change to</b> <b>Mapping, I'll select</b> <b>Schema, and from Google Drve,</b> <b>I'll scroll down a bit, and what I want</b> <b>is this file name over here.
</b> <b>Great. </b> <b>So let's run this, let's go back to</b> <b>Pinecone, and let's remove</b> <b>the documents that we currently</b> <b>have. </b> <b>Now it could be quite tedious to delete</b> <b>these documents one by</b> <b>one, but because we specified</b> <b>a namespace, we can now see the namespace</b> <b>over here, and we can</b> <b>delete style data simply</b> <b>by deleting this namespace, like so.
</b> <b>Now our database should be clean. </b> <b>Let's execute N8N again, we can see those</b> <b>10 documents over</b> <b>here, but this time if we</b> <b>look at the documents, we can see this</b> <b>file property with the</b> <b>name of the file that this</b> <b>information was retrieved from. </b> <b>So this seems to be working, so let's go</b> <b>ahead and save this</b> <b>workflow, and let's activate</b> <b>it as well.
</b> <b>Great. </b> <b>This workflow will now listen for changes</b> <b>to my Google Drve folder. </b> <b>So let's go ahead and add</b> <b>another file to this drive.
</b> <b>This time I've uploaded this menu. csv</b> <b>file, which contains</b> <b>items and the prices. </b> <b>Because this is a CSV file, the document</b> <b>loader in N8N will</b> <b>actually add a unique document</b> <b>for each of these rows.
</b> <b>So we should see an additional 20</b> <b>documents being added to Pinecone. </b> <b>And within a few seconds, we can see that</b> <b>the record count now increased from 10 to</b> <b>30. </b> <b>And if we look at the documents, we can</b> <b>see that items were</b> <b>added from the menu file,</b> <b>like the item sirloin and this price.
</b> <b>Awesome. </b> <b>Now that we have a solid solution for</b> <b>updating our</b> <b>knowledge base, let's move on. </b> <b>Move on to the more exciting part, and</b> <b>that's building our AI assistant.
</b> <b>Let's add a new workflow. </b> <b>Let's call it Oak and Barrel Assistant. </b> <b>For the first step, let's actually choose</b> <b>the On Chat Message node.
</b> <b>After adding this node, you will actually</b> <b>notice that you now have this chat button</b> <b>that you can use to chat to your chatbot. </b> <b>Let's also go ahead</b> <b>and add an AI Agent node. </b> <b>So let's go to Add Nodes.
</b> <b>Let's go to Advanced AI. </b> <b>And now we're going to</b> <b>add this AI Agent node. </b> <b>Alternatively, you could simply use this</b> <b>question and answer</b> <b>chain, but I find that</b> <b>this node is way too limiting, as you</b> <b>can't set system messages</b> <b>and provide tools to the</b> <b>agent.
</b> <b>So I'll go with the</b> <b>AI Agent node instead. </b> <b>For the Agent type, I'll select the Tool</b> <b>Agent, but you can</b> <b>see that there are other</b> <b>types of agents available as well, like</b> <b>the SQL Agent that can</b> <b>interact with SQL databases</b> <b>to extract information. </b> <b>For the prompt, we'll simply grab the</b> <b>message from the</b> <b>previous node, which is the chat</b> <b>node.
</b> <b>And under Options, we can now set</b> <b>additional attributes</b> <b>like a System Message. </b> <b>For the System Message, I'm going to</b> <b>enter "You are a customer</b> <b>support agent for a restaurant</b> <b>called Oak and Barrel. </b> <b>Your name is Max.
</b> <b>Your tone should be friendly and helpful. </b> <b>When asked questions about the</b> <b>restaurant, use the provided context. </b> <b>If you don't know the answer, then simply</b> <b>respond with "I don't know.
"</b> <b>This part about using the provided</b> <b>context will ensure that</b> <b>our agent will answer the</b> <b>questions from our Vector Store or our</b> <b>Knowledge Base, instead</b> <b>of hallucinating and making</b> <b>up its own answers. </b> <b>Let's close this popup, and for the AI</b> <b>Agent node, we need to</b> <b>provide a chat model, a memory,</b> <b>as well as a tool. </b> <b>For the chat model, I'll continue using</b> <b>the OpenAI chat model.
</b> <b>So we'll select our OpenAI credentials,</b> <b>which we created earlier. </b> <b>And for the model, let's select the</b> <b>GPT-4-O Mini model, which is</b> <b>a super fast and affordable</b> <b>model. </b> <b>Let's go back to the canvas,</b> <b>and let's add a Memory node.
</b> <b>The Memory node will allow the agent to</b> <b>recall information from</b> <b>our previous messages. </b> <b>I'm simply going to select</b> <b>the Window Buffer Memory node. </b> <b>I'll leave the defaults.
</b> <b>We want our agent to have access to that</b> <b>point code Vector Store. </b> <b>So what we'll do is add a new tool, and</b> <b>more specifically, the Vector Store tool. </b> <b>Let's give our tool a name, like Oak and</b> <b>Barrel Information, and a description of</b> <b>returns documents related to the</b> <b>restaurant and its menu.
</b> <b>This description is extremely important,</b> <b>as it will be used by</b> <b>the LLM to determine when</b> <b>to call this tool. </b> <b>Let's go back to the canvas, and let's</b> <b>continue working on this tool. </b> <b>We need to provide a</b> <b>model and a Vector Store.
</b> <b>For the Vector Store, let's add the</b> <b>Pinecane Vector Store, of course. </b> <b>Let's select our Pinecane credentials. </b> <b>We'll leave the Operation</b> <b>mode as retrieve documents.
</b> <b>And from the Pinecane Index, let's select</b> <b>N8N, and under</b> <b>Options, let's specify that</b> <b>Pinecane namespace, which</b> <b>we called Oak and Barrel. </b> <b>And hopefully you can also see the</b> <b>benefits of using namespaces. </b> <b>In theory, if we had different namespaces</b> <b>within Pinecane, we could simply grab the</b> <b>name of the specific namespace, and then</b> <b>swap it out over here to</b> <b>retrieve a different set</b> <b>of information.
</b> <b>Now lastly, let's add our model. </b> <b>And again, we'll use</b> <b>the OpenAI chat model. </b> <b>From here, we'll select</b> <b>the GPT40 Mini model again.
</b> <b>Let's close this. </b> <b>And the Pinecane database needs an</b> <b>embeddings function. </b> <b>So let's click on that, and let's select</b> <b>the OpenAI embeddings node.
</b> <b>And again, let's change</b> <b>this to Text embeddings3 small. </b> <b>Believe it or not, that's actually all we</b> <b>need to build this AI agent. </b> <b>And we can go ahead and</b> <b>test it by clicking on Chat.
</b> <b>And let's say, hello. </b> <b>We are getting a response back from the</b> <b>LLM, which means that</b> <b>everything is set up correctly. </b> <b>And what I really like about NNN's</b> <b>interface is the section on</b> <b>the right over here, where</b> <b>we can see all the steps</b> <b>that were taken by our agent.
</b> <b>So first, the agent tried to go to the</b> <b>VectorStore tool, but</b> <b>obviously we didn't ask a question</b> <b>related to the VectorStore,</b> <b>so nothing was executed here. </b> <b>Then it pulled information from the</b> <b>conversation history, or</b> <b>from the memory node, and then</b> <b>paused that along with our current</b> <b>question and the system</b> <b>message to the LLM, which finally</b> <b>returned this response. </b> <b>I really like this transparency.
</b> <b>Let's also ask a question from the</b> <b>VectorStore then, like,</b> <b>what are your current specials? </b> <b>We can see the response coming back, and</b> <b>this time this</b> <b>information came from the Knowledge</b> <b>Base. </b> <b>And this time, if we look at this</b> <b>Pinecane VectorStore</b> <b>node, and we expand the Output</b> <b>node, we can see the documents that were</b> <b>returned from our VectorStore.
</b> <b>And finally, our question, including the</b> <b>context from the</b> <b>VectorStore, were injected</b> <b>into the prompt, and that allowed our LLM</b> <b>to provide this accurate response. </b> <b>Now that we have this workflow working,</b> <b>how do we actually share</b> <b>this agent with the world? </b> <b>So next I am going to show you how to</b> <b>share this agent as a</b> <b>standalone app to your friends</b> <b>and family, or embed it into a website.
</b> <b>But first, if you found this video</b> <b>useful, then please hit the</b> <b>like button, and subscribe</b> <b>to my channel. </b> <b>The first way is to share this agent</b> <b>using a public-facing URL. </b> <b>If you are running N8N in a cloud</b> <b>instance, like I'm doing</b> <b>here, you can open up the</b> <b>chat message node, and in this node, you</b> <b>will see this toggle to</b> <b>make this chat public.
</b> <b>When you enable this, you will be</b> <b>provided with this URL. </b> <b>We can then copy this URL,</b> <b>and open it in the browser. </b> <b>Of course, we first need to save this</b> <b>chat flow, and if I</b> <b>refresh this, I can actually</b> <b>see my chatbot over here, and everything</b> <b>is working as expected.
</b> <b>What's also cool about this is you can</b> <b>password protect this</b> <b>application as well. </b> <b>So under authentication, we can select</b> <b>basic auth, and then set</b> <b>a username and password,</b> <b>and that way you can control</b> <b>access to your application. </b> <b>What we can also do is embed</b> <b>this chatbot into a website.
</b> <b>So let's change the mode</b> <b>from hosted to embedded chat. </b> <b>Let's go back to the canvas. </b> <b>I'm going to save this workflow, and if</b> <b>we now click on chat,</b> <b>and if we click on this</b> <b>more info link over here, we can see this</b> <b>pop-up with</b> <b>instructions on embedding this</b> <b>chatbot into websites using the CDN or</b> <b>frameworks like Vue or React.
</b> <b>To demonstrate this, I created this</b> <b>simple landing page for the</b> <b>Oak and Battle restaurant,</b> <b>and what I want is a little chat bubble</b> <b>to show up on the</b> <b>bottom right of our webpage</b> <b>so that people can chat to</b> <b>our customer support agent. </b> <b>So all we have to do is copy this code</b> <b>and paste it anywhere in</b> <b>the body tag of our webpage. </b> <b>So back in our code, I'm simply going to</b> <b>paste this towards the end</b> <b>of the script just before</b> <b>this closing body tag, and if I go back</b> <b>to our website, I can</b> <b>see that pop-up over here,</b> <b>and if we click on this, we can start</b> <b>interacting with our chatbot.
</b> <b>This is working, but it</b> <b>doesn't look very good. </b> <b>I want the theme to match</b> <b>the style of my webpage. </b> <b>For instance, this button shouldn't be</b> <b>pink, but perhaps a</b> <b>brownish color, and I want the</b> <b>same thing for the background in the</b> <b>chat, and I also want to</b> <b>customize these messages</b> <b>over here, and perhaps</b> <b>this intro message as well.
</b> <b>Thankfully, NNN makes it very easy to</b> <b>customize this chat bubble by going to</b> <b>their documentation. </b> <b>When you scroll down, you will find this</b> <b>options section that shows</b> <b>you a whole bunch of attributes</b> <b>that you can use to</b> <b>customize this chat window. </b> <b>For example, if you wanted to change the</b> <b>initial messages, we</b> <b>could simply grab this</b> <b>section over here, and then in the code</b> <b>where we create this</b> <b>chatbot after this webhook URL,</b> <b>we can simply paste in this initial</b> <b>messages property, and</b> <b>let's change it from "My name</b> <b>is Nathan" to "My name is Max", and maybe</b> <b>something like</b> <b>"Welcome to Oak and Barrel",</b> <b>like so.
</b> <b>Now, if I go back to our website, let's</b> <b>open the chat window, we</b> <b>can see that the welcome</b> <b>message was indeed changed, and of</b> <b>course, we can do the same</b> <b>thing to change the title</b> <b>and the subtitle, or add a footer, but</b> <b>let's have a look at</b> <b>changing the styling. </b> <b>Under this customization section, we can</b> <b>see the CSS variables</b> <b>that are used to control</b> <b>the look and feel of this application,</b> <b>and these are all the standard values. </b> <b>So to customize this, I'm actually going</b> <b>to cut this link URL,</b> <b>and this is the link to</b> <b>the default styles, and I'm going to move</b> <b>it up just above my</b> <b>own style sheet import</b> <b>over here.
</b> <b>Now, so far, everything still looks the</b> <b>same, but what I can do</b> <b>now is change the styling</b> <b>within my own style sheet. </b> <b>So I'll actually start this off with this</b> <b>root property, just like I</b> <b>have it in the documentation,</b> <b>and now I'm going to grab all the</b> <b>variables pertaining to</b> <b>the colors, and I'll simply</b> <b>paste that into this root tag over here. </b> <b>Now we can visually see the colors that</b> <b>are being used in our chatbot.
</b> <b>I actually want to make it this brownish</b> <b>color that I'm using in</b> <b>my header, so I'll just</b> <b>copy this value and replace these pink</b> <b>values with my brown color. </b> <b>I'm actually also going to replace this</b> <b>green color with this</b> <b>brown color as well, and after</b> <b>saving this, I can see that my chat</b> <b>bubble is now this brown</b> <b>color, and it's saying the</b> <b>message like, "What is your name? "</b> <b>And we can see that the background</b> <b>message is also this</b> <b>brownish color as well.
</b> <b>Of course, we can change other attributes</b> <b>as well, like the</b> <b>width and height of this</b> <b>bubble by simply copying the rest of</b> <b>these properties and</b> <b>adding it to our style sheet. </b> <b>I hope you found this video useful. </b> <b>If you would like to learn more about</b> <b>N8N, then please</b> <b>subscribe to my channel, and also</b> <b>check out these other videos over here.
</b> <b>I'll see you in the next one. </b> <b>Bye bye.
Copyright © 2024. Made with ♥ in London by YTScribe.com