{"id":3199,"date":"2025-06-28T18:00:00","date_gmt":"2025-06-28T18:00:00","guid":{"rendered":"https:\/\/cybrancee.com\/blog\/?p=3199"},"modified":"2025-06-29T10:37:07","modified_gmt":"2025-06-29T10:37:07","slug":"integrating-ai-into-a-discord-bot-ultimate-guide","status":"publish","type":"post","link":"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/","title":{"rendered":"Integrating AI Into a Discord Bot: Ultimate Guide"},"content":{"rendered":"\n<p>Discord bots are a powerful tool for managing your server with commands. But what if your bot could do more than just follow commands? What if it could understand nuance, generate creative content, or even engage in meaningful conversations? We&#8217;re on the cusp of a revolution where artificial intelligence is transforming simple bots into powerful, intelligent companions.<\/p>\n\n\n\n<p>For example:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Instead of typing a specific command, your members could simply ask your bot, &#8220;Hey, what&#8217;s new in the latest game update?&#8221; or &#8220;Tell me a joke!&#8221; and receive a relevant, natural response, making every interaction feel more personal and natural<\/li>\n<\/ul>\n\n\n\n<p>In this ultimate guide, you will gain a full understanding of how to use AI with a Discord bot, and we will then guide you through creating your own for smarter, more natural interactions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Contents of this blog:<\/h2>\n\n\n\n<p>In this blog, we are going to cover the following topics:<\/p>\n\n\n\n<p><strong>1. Creating and Running a Discord Bot<\/strong><\/p>\n\n\n\n<p><strong>2. Integrating AI Into a Discord Bot<\/strong><\/p>\n\n\n\n<p><strong>3. Allowing a Discord Bot to Reply Across All Channels&nbsp;<\/strong><\/p>\n\n\n\n<p><strong>4. Giving Your Discord Bot Personality &amp; Rules<\/strong><\/p>\n\n\n\n<p><strong>5. Giving Your Discord Bot the Ability to Remember<\/strong><\/p>\n\n\n\n<p><strong>6. Integrating Web Search Ability Into Your Discord Bot<\/strong><\/p>\n\n\n\n<p><strong>7. Adding The Ability For Your Discord Bot to Read Images<\/strong><\/p>\n\n\n\n<p><strong>8. Adding The Ability For Your Discord Bot to Generate Images<\/strong><\/p>\n\n\n\n<p><strong>9. Hosting Your Discord Bot<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Code Structure:<\/h2>\n\n\n\n<p><strong>\/home\/container\/<\/strong><\/p>\n\n\n\n<p><strong>|- index.js<\/strong><\/p>\n\n\n\n<p><strong>|- .env<\/strong><\/p>\n\n\n\n<p><strong>|- config.json<\/strong><\/p>\n\n\n\n<p><strong>|- utils<\/strong><\/p>\n\n\n\n<p><strong>&nbsp;&nbsp;|-aiResponse.js<\/strong><\/p>\n\n\n\n<p><strong>&nbsp;&nbsp;|-memory.js<\/strong><\/p>\n\n\n\n<p><strong>&nbsp;&nbsp;|-search.js<\/strong><\/p>\n\n\n\n<p><strong>&nbsp;&nbsp;|-imageRead.js<\/strong><\/p>\n\n\n\n<p><strong>&nbsp;&nbsp;|-imageGenerate.js<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dependencies:<\/h2>\n\n\n\n<p><a href=\"https:\/\/www.npmjs.com\/package\/discord.js\">discord.js<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.npmjs.com\/package\/dotenv\">dotenv<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.npmjs.com\/package\/@google\/generative-ai\">@google\/generative-ai<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.npmjs.com\/package\/axios\">axios<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Hosting Your Bot<\/h2>\n\n\n\n<p>I\u2019m currently hosting the bot in Cybrancee, which provides excellent server speed &amp; quality, also they ensure your bot runs correctly with no downtime. If you are interested, you can choose your plan &amp; register at <a href=\"https:\/\/cybrancee.com\">Cybrancee<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Creating &amp; Running A Discord Bot<\/h2>\n\n\n\n<p>Create your bot in the <a href=\"https:\/\/discord.com\/developers\/applications\">Discord Developer Portal<\/a>, then copy your token.<\/p>\n\n\n\n<p>Run the bot to ensure it\u2019s working properly.\u00a0Paste the following code in <strong>\u201cindex.js\u201d<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Import packages\nconst { Client, GatewayIntentBits } = require('discord.js');\nconst dotenv = require('dotenv');\n\n\/\/ Load environment variables\ndotenv.config();\n\n\/\/ Create Discord client\nconst client = new Client({\n    intents: &#091;\n        GatewayIntentBits.Guilds,\n        GatewayIntentBits.GuildMessages,\n        GatewayIntentBits.MessageContent,\n    ],\n});\n\n\/\/ Bot ready event\nclient.once('ready', () =&gt; {\n    console.log('Bot is online!');\n});\n\n\/\/ Login to Discord\nclient.login(process.env.DISCORD_BOT_TOKEN);\n<\/code><\/pre>\n\n\n\n<p>Also, your <strong>\u201c.env\u201d <\/strong>should look like this:<\/p>\n\n\n\n<p>Now, start your bot. You will see that it prints <strong>\u201cBot is online!\u201d <\/strong>in the console. And your bot will be online.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"441\" height=\"123\" src=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im1.png\" alt=\"Screenshot of a bot active\" class=\"wp-image-3200\" srcset=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im1.png 441w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im1-300x84.png 300w\" sizes=\"auto, (max-width: 441px) 100vw, 441px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">2. Integrating AI into a Discord Bot<\/h2>\n\n\n\n<p>Now, it\u2019s time to start integrating the AI into your bot. We will use Google Generative AI, specifically the Gemini 2.0 flash model, for now. But you can also choose an alternative.<\/p>\n\n\n\n<p><strong>How to get the Gemini API key?<\/strong><\/p>\n\n\n\n<p>To get the Gemini API key, you have to<\/p>\n\n\n\n<p>1. Visit<a href=\"https:\/\/aistudio.google.com\/app\/apikey\"> the Google AI Studio <\/a>website.<\/p>\n\n\n\n<p>2. Click the Create API Key button on the right<\/p>\n\n\n\n<p>3. Select your Google Cloud Project, then click the \u201cCreate an API key in the existing project\u201d button. And copy your API key.<\/p>\n\n\n\n<p><strong>Continuing:<\/strong><\/p>\n\n\n\n<p>At this point, you have to add <strong>\u201cGEMINI_API_KEY\u201d<\/strong> and <strong>\u201cCHANNEL_ID\u201d<\/strong> variables in your <strong>\u201c.env\u201d.<\/strong> Then, paste the Gemini API key that you copied, and select the channel where you want the bot to be located.<\/p>\n\n\n\n<p>Your <strong>\u201c.env\u201d<\/strong> should look like this:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2\"><span style=\"align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JavaScript<\/span><span role=\"button\" data-code=\"DISCORD_BOT_TOKEN=&quot;&quot; # Paste in here your Discord bot token.\nGEMINI_API_KEY=&quot;&quot; # Paste in here your Gemini API key.\nCHANNEL_ID=&quot;&quot; # Paste in here the channel ID you want the bot to listen to.\" style=\"color:#D4D4D4\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\"><code><span class=\"line\"><span style=\"color: #4FC1FF\">DISCORD_BOT_TOKEN<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;&quot;<\/span><span style=\"color: #D4D4D4\"> # <\/span><span style=\"color: #9CDCFE\">Paste<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">here<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">your<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Discord<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">bot<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">token<\/span><span style=\"color: #D4D4D4\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #4FC1FF\">GEMINI_API_KEY<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;&quot;<\/span><span style=\"color: #D4D4D4\"> # <\/span><span style=\"color: #9CDCFE\">Paste<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">here<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">your<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Gemini<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">API<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">key<\/span><span style=\"color: #D4D4D4\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #4FC1FF\">CHANNEL_ID<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;&quot;<\/span><span style=\"color: #D4D4D4\"> # <\/span><span style=\"color: #9CDCFE\">Paste<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">here<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">the<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">channel<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">ID<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">you<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">want<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">the<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">bot<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">to<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">listen<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">to<\/span><span style=\"color: #D4D4D4\">.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Then, update your \u201cindex.js\u201d file to include the new chatbot function.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2\"><span style=\"align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JavaScript<\/span><span role=\"button\" data-code=\"\/\/ Simple Discord AI Chatbot\n\/\/ Responds to messages in a specific channel with AI responses\n\/\/ Import packages\nconst { Client, GatewayIntentBits } = require('discord.js');\nconst { GoogleGenerativeAI } = require('@google\/generative-ai');\nconst dotenv = require('dotenv');\n\/\/ Load environment variables\ndotenv.config();\n\/\/ Initialize Gemini AI\nconst genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);\nconst model = genAI.getGenerativeModel({ model: &quot;gemini-2.0-flash&quot; });\n\/\/ Create Discord client\nconst client = new Client({\n    intents: [\n        GatewayIntentBits.Guilds,\n        GatewayIntentBits.GuildMessages,\n        GatewayIntentBits.MessageContent,\n    ],\n});\n\/\/ Bot ready event\nclient.once('ready', () =&gt; {\n    console.log('Bot is online!');\n});\n\/\/ Message event handler\nclient.on('messageCreate', async (message) =&gt; {\n    \/\/ Ignore bot messages\n    if (message.author.bot) return;\n    \/\/ Only respond in the specific channel\n    if (message.channel.id !== process.env.CHANNEL_ID) return;\n    try {\n        \/\/ Generate AI response\n        const result = await model.generateContent(message.content);\n        const aiResponse = result.response.text();\n        \/\/ Send response\n        await message.reply(aiResponse);\n        console.log(`Responded to ${message.author.username}: &quot;${message.content}&quot;`);\n    } catch (error) {\n        console.error('Error:', error);\n        await message.reply('Sorry, I had an error processing your message.');\n    }\n});\n\/\/ Login to Discord\nclient.login(process.env.DISCORD_BOT_TOKEN);\" style=\"color:#D4D4D4\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ Simple Discord AI Chatbot<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Responds to messages in a specific channel with AI responses<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Import packages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #4FC1FF\">Client<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4FC1FF\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\"> } = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;discord.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #4FC1FF\">GoogleGenerativeAI<\/span><span style=\"color: #D4D4D4\"> } = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;@google\/generative-ai&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">dotenv<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;dotenv&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Load environment variables<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">dotenv<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">config<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Initialize Gemini AI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">genAI<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">GoogleGenerativeAI<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">process<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">env<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4FC1FF\">GEMINI_API_KEY<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">model<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">genAI<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getGenerativeModel<\/span><span style=\"color: #D4D4D4\">({ <\/span><span style=\"color: #9CDCFE\">model:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;gemini-2.0-flash&quot;<\/span><span style=\"color: #D4D4D4\"> });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Create Discord client<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">client<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Client<\/span><span style=\"color: #D4D4D4\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">intents:<\/span><span style=\"color: #D4D4D4\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Guilds<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">GuildMessages<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">MessageContent<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    ],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Bot ready event<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">once<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;ready&#039;<\/span><span style=\"color: #D4D4D4\">, () <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;Bot is online!&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Message event handler<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">on<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;messageCreate&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">async<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Ignore bot messages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">bot<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Only respond in the specific channel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">channel<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\"> !== <\/span><span style=\"color: #9CDCFE\">process<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">env<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4FC1FF\">CHANNEL_ID<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Generate AI response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">result<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">generateContent<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">aiResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">text<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Send response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">reply<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">aiResponse<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`Responded to <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">username<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">: &quot;<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">&quot;`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;Error:&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">reply<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;Sorry, I had an error processing your message.&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Login to Discord<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">login<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">process<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">env<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4FC1FF\">DISCORD_BOT_TOKEN<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Start your bot. And then start chatting with him.<\/p>\n\n\n\n<p><strong>An example:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"512\" height=\"159\" src=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im2-3.png\" alt=\"Screenshot of messaging a Discord Bot\" class=\"wp-image-3202\" srcset=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im2-3.png 512w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im2-3-300x93.png 300w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">3. <strong>Allowing a Discord to Bot Reply Across All Channels<\/strong><\/h2>\n\n\n\n<p>You have now finished the second step. What if we could let the bot send messages in all channels instead of just one? It will have the ability to chat in all channels. That is exactly what we are going to do.<\/p>\n\n\n\n<p>In the <strong>\u201cindex.js\u201d<\/strong> below, we added a new ability to the bot. The bot answers whenever someone mentions it in a message.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2\"><span style=\"align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JavaScript<\/span><span role=\"button\" data-code=\"\/\/ Simple Discord AI Chatbot\n\/\/ Responds to mentions in any channel with AI responses\n\/\/ Import packages\nconst { Client, GatewayIntentBits } = require('discord.js');\nconst { GoogleGenerativeAI } = require('@google\/generative-ai');\nconst dotenv = require('dotenv');\n\/\/ Load environment variables\ndotenv.config();\n\/\/ Initialize Gemini AI\nconst genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);\nconst model = genAI.getGenerativeModel({ model: &quot;gemini-2.0-flash&quot; });\n\/\/ Create Discord client\nconst client = new Client({\n    intents: [\n        GatewayIntentBits.Guilds,\n        GatewayIntentBits.GuildMessages,\n        GatewayIntentBits.MessageContent,\n    ],\n});\n\/\/ Bot ready event\nclient.once('ready', () =&gt; {\n    console.log('Bot is online!');\n});\n\/\/ Message event handler\nclient.on('messageCreate', async (message) =&gt; {\n    \/\/ Ignore bot messages\n    if (message.author.bot) return;\n    \/\/ Only respond when mentioned\n    if (!message.mentions.has(client.user)) return;\n    try {\n        \/\/ Generate AI response\n        const result = await model.generateContent(message.content);\n        const aiResponse = result.response.text();\n        \/\/ Send response\n        await message.reply(aiResponse);\n        console.log(`Responded to ${message.author.username}: &quot;${message.content}&quot;`);\n    } catch (error) {\n        console.error('Error:', error);\n        await message.reply('Sorry, I had an error processing your message.');\n    }\n});\n\/\/ Login to Discord\nclient.login(process.env.DISCORD_BOT_TOKEN);\n\" style=\"color:#D4D4D4\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ Simple Discord AI Chatbot<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Responds to mentions in any channel with AI responses<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Import packages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #4FC1FF\">Client<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4FC1FF\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\"> } = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;discord.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #4FC1FF\">GoogleGenerativeAI<\/span><span style=\"color: #D4D4D4\"> } = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;@google\/generative-ai&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">dotenv<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;dotenv&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Load environment variables<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">dotenv<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">config<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Initialize Gemini AI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">genAI<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">GoogleGenerativeAI<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">process<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">env<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4FC1FF\">GEMINI_API_KEY<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">model<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">genAI<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getGenerativeModel<\/span><span style=\"color: #D4D4D4\">({ <\/span><span style=\"color: #9CDCFE\">model:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;gemini-2.0-flash&quot;<\/span><span style=\"color: #D4D4D4\"> });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Create Discord client<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">client<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Client<\/span><span style=\"color: #D4D4D4\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">intents:<\/span><span style=\"color: #D4D4D4\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Guilds<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">GuildMessages<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">MessageContent<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    ],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Bot ready event<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">once<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;ready&#039;<\/span><span style=\"color: #D4D4D4\">, () <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;Bot is online!&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Message event handler<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">on<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;messageCreate&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">async<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Ignore bot messages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">bot<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Only respond when mentioned<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">mentions<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">has<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">user<\/span><span style=\"color: #D4D4D4\">)) <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Generate AI response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">result<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">generateContent<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">aiResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">text<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Send response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">reply<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">aiResponse<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`Responded to <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">username<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">: &quot;<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">&quot;`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;Error:&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">reply<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;Sorry, I had an error processing your message.&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Login to Discord<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">login<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">process<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">env<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4FC1FF\">DISCORD_BOT_TOKEN<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Get your bot started, then try mentioning it with your message on any channel, like in the example.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"325\" height=\"75\" src=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im2.png\" alt=\"Screenshot of metion discord bot in a message\" class=\"wp-image-3201\" srcset=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im2.png 325w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im2-300x69.png 300w\" sizes=\"auto, (max-width: 325px) 100vw, 325px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">4. <strong>Giving Your Discord Bot Personality &amp; Rules<\/strong><\/h2>\n\n\n\n<p>It\u2019s time to add some cool features to your blog, such as giving it a name, providing me with information about it, and setting rules etc.&nbsp;<\/p>\n\n\n\n<p>We will use the <strong>\u201cconfig.json\u201d<\/strong> file for data and the <strong>\u201cutils\/aiResponse.js\u201d <\/strong>file to handle the AI response generation context.<\/p>\n\n\n\n<p>Paste the following code in <strong>\u201cconfig.json\u201d<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2\"><span style=\"align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JavaScript<\/span><span role=\"button\" data-code=\"{\n  &quot;prompt&quot;: &quot;You are a helpful AI assistant Discord bot. You should be conversational, engaging, and provide accurate information while maintaining a professional yet approachable tone.&quot;,\n  &quot;rules&quot;: [\n    &quot;Keep responses under 2000 characters to fit Discord's message limit&quot;,\n    &quot;Be respectful and polite to all users&quot;,\n    &quot;Stay on topic and provide relevant responses&quot;,\n    &quot;If you don't know something, be honest about it&quot;,\n    &quot;Follow Discord's community guidelines&quot;,\n    &quot;Don't share personal information about users&quot;,\n    &quot;Don't engage in harmful or inappropriate conversations&quot;,\n    &quot;Use emojis sparingly and appropriately&quot;,\n    &quot;Be helpful and try to solve user problems&quot;,\n    &quot;Maintain a friendly and professional tone&quot;,\n    &quot;Only mention your name (GG Bot) and creator (programmers) if specifically asked about your identity or who made you&quot;,\n    &quot;Don't introduce yourself unless asked&quot;\n  ]\n}\" style=\"color:#D4D4D4\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #CE9178\">&quot;prompt&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;You are a helpful AI assistant Discord bot. You should be conversational, engaging, and provide accurate information while maintaining a professional yet approachable tone.&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #CE9178\">&quot;rules&quot;<\/span><span style=\"color: #D4D4D4\">: [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&quot;Keep responses under 2000 characters to fit Discord&#039;s message limit&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&quot;Be respectful and polite to all users&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&quot;Stay on topic and provide relevant responses&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&quot;If you don&#039;t know something, be honest about it&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&quot;Follow Discord&#039;s community guidelines&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&quot;Don&#039;t share personal information about users&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&quot;Don&#039;t engage in harmful or inappropriate conversations&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&quot;Use emojis sparingly and appropriately&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&quot;Be helpful and try to solve user problems&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&quot;Maintain a friendly and professional tone&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&quot;Only mention your name (GG Bot) and creator (programmers) if specifically asked about your identity or who made you&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&quot;Don&#039;t introduce yourself unless asked&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Also, paste the following code in the <strong>\u201cutils\/aiResponse.js\u201d<\/strong> file.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2\"><span style=\"align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JavaScript<\/span><span role=\"button\" data-code=\"\/**\n * Generate AI response using Gemini model\n * @param {string} userMessage - The user's message\n * @param {Object} model - The Gemini AI model instance\n * @param {string} systemPrompt - The system prompt with rules\n * @returns {Promise&lt;string&gt;} - The AI response\n *\/\nasync function generateAIResponse(userMessage, model, systemPrompt) {\n  try {\n    \/\/ Clean user message (remove mentions)\n    const cleanedUserMessage = cleanUserMessage(userMessage);\n    \/\/ Create the full prompt with context\n    const fullPrompt = `${systemPrompt}\\n\\nUser message: ${cleanedUserMessage}`;\n    \/\/ Generate response from AI\n    const result = await model.generateContent(fullPrompt);\n    const aiResponse = result.response.text();\n    \/\/ Clean and validate response\n    const cleanedResponse = cleanResponse(aiResponse);\n    return cleanedResponse;\n  } catch (error) {\n    console.error('AI Response Error:', error);\n    throw new Error('Failed to generate AI response');\n  }\n}\n\/**\n * Clean user message (remove mentions and extra whitespace)\n * @param {string} message - Raw user message\n * @returns {string} - Cleaned message\n *\/\nfunction cleanUserMessage(message) {\n  if (!message || typeof message !== 'string') {\n    return '';\n  }\n  \/\/ Remove mentions (like &lt;@123456789&gt;)\n  let cleaned = message.replace(\/&lt;@!?\\d+&gt;\/g, '').trim();\n  \/\/ Remove extra whitespace\n  cleaned = cleaned.replace(\/\\s+\/g, ' ').trim();\n  return cleaned || 'hi';\n}\n\/**\n * Clean and validate the AI response\n * @param {string} response - Raw AI response\n * @returns {string} - Cleaned response\n *\/\nfunction cleanResponse(response) {\n  if (!response || typeof response !== 'string') {\n    return 'Sorry, I couldn\\'t generate a proper response.';\n  }\n  \/\/ Trim whitespace\n  let cleaned = response.trim();\n  \/\/ Ensure response is not too long for Discord (2000 char limit)\n  if (cleaned.length &gt; 1900) {\n    cleaned = cleaned.substring(0, 1900) + '...';\n  }\n  \/\/ Remove any potential harmful content markers\n  cleaned = cleaned.replace(\/\\[HARMFUL\\]|\\[NSFW\\]|\\[INAPPROPRIATE\\]\/gi, '');\n  return cleaned || 'Sorry, I couldn\\'t generate a response.';\n}\n\/**\n * Build system prompt from config\n * @param {Object} config - Configuration object with prompt and rules\n * @returns {string} - Complete system prompt\n *\/\nfunction buildSystemPrompt(config) {\n  let systemPrompt = config.prompt || 'You are a helpful AI assistant.';\n  if (config.rules &amp;&amp; Array.isArray(config.rules)) {\n    systemPrompt += '\\n\\nRules you must follow:\\n';\n    config.rules.forEach((rule, index) =&gt; {\n      systemPrompt += `${index + 1}. ${rule}\\n`;\n    });\n  }\n  return systemPrompt;\n}\nmodule.exports = {\n  generateAIResponse,\n  cleanResponse,\n  cleanUserMessage,\n  buildSystemPrompt\n};\" style=\"color:#D4D4D4\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Generate AI response using Gemini model<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #6A9955\"> - The user&#039;s message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Object}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #6A9955\"> - The Gemini AI model instance<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #6A9955\"> - The system prompt with rules<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Promise&lt;string&gt;}<\/span><span style=\"color: #6A9955\"> - The AI response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">async<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">generateAIResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Clean user message (remove mentions)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">cleanUserMessage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Create the full prompt with context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">fullPrompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n\\n<\/span><span style=\"color: #CE9178\">User message: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Generate response from AI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">result<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">generateContent<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">fullPrompt<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">aiResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">text<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Clean and validate response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">cleanedResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">cleanResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">aiResponse<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleanedResponse<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;AI Response Error:&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">throw<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;Failed to generate AI response&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Clean user message (remove mentions and extra whitespace)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #6A9955\"> - Raw user message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> - Cleaned message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">cleanUserMessage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #569CD6\">typeof<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\"> !== <\/span><span style=\"color: #CE9178\">&#039;string&#039;<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Remove mentions (like &lt;@123456789&gt;)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">replace<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #D16969\">\/&lt;@!<\/span><span style=\"color: #D7BA7D\">?<\/span><span style=\"color: #D16969\">\\d<\/span><span style=\"color: #D7BA7D\">+<\/span><span style=\"color: #D16969\">&gt;\/<\/span><span style=\"color: #569CD6\">g<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">trim<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Remove extra whitespace<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">replace<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #D16969\">\/\\s<\/span><span style=\"color: #D7BA7D\">+<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #569CD6\">g<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039; &#039;<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">trim<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&#039;hi&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Clean and validate the AI response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #6A9955\"> - Raw AI response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> - Cleaned response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">cleanResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #569CD6\">typeof<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\"> !== <\/span><span style=\"color: #CE9178\">&#039;string&#039;<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;Sorry, I couldn<\/span><span style=\"color: #D7BA7D\">\\&#039;<\/span><span style=\"color: #CE9178\">t generate a proper response.&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Trim whitespace<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">trim<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Ensure response is not too long for Discord (2000 char limit)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #B5CEA8\">1900<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">substring<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1900<\/span><span style=\"color: #D4D4D4\">) + <\/span><span style=\"color: #CE9178\">&#039;...&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Remove any potential harmful content markers<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">replace<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #D7BA7D\">\\[<\/span><span style=\"color: #D16969\">HARMFUL<\/span><span style=\"color: #D7BA7D\">\\]<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D7BA7D\">\\[<\/span><span style=\"color: #D16969\">NSFW<\/span><span style=\"color: #D7BA7D\">\\]<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D7BA7D\">\\[<\/span><span style=\"color: #D16969\">INAPPROPRIATE<\/span><span style=\"color: #D7BA7D\">\\]<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #569CD6\">gi<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&#039;Sorry, I couldn<\/span><span style=\"color: #D7BA7D\">\\&#039;<\/span><span style=\"color: #CE9178\">t generate a response.&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Build system prompt from config<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Object}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #6A9955\"> - Configuration object with prompt and rules<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> - Complete system prompt<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">buildSystemPrompt<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&#039;You are a helpful AI assistant.&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">rules<\/span><span style=\"color: #D4D4D4\"> &amp;&amp; <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">isArray<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">rules<\/span><span style=\"color: #D4D4D4\">)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D7BA7D\">\\n\\n<\/span><span style=\"color: #CE9178\">Rules you must follow:<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">rules<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">forEach<\/span><span style=\"color: #D4D4D4\">((<\/span><span style=\"color: #9CDCFE\">rule<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">index<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">index<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">. <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">rule<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">module<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4EC9B0\">exports<\/span><span style=\"color: #D4D4D4\"> = {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">generateAIResponse<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleanResponse<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleanUserMessage<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">buildSystemPrompt<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Also, you have to update<strong> \u201cindex.js\u201d<\/strong> to better handle all functions and run the bot correctly.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2\"><span style=\"align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JavaScript<\/span><span role=\"button\" data-code=\"\/\/ Import packages\nconst { Client, GatewayIntentBits } = require('discord.js');\nconst { GoogleGenerativeAI } = require('@google\/generative-ai');\nconst dotenv = require('dotenv');\nconst fs = require('fs');\n\/\/ Import utilities\nconst aiResponse = require('.\/utils\/aiResponse.js');\n\/\/ Load environment variables\ndotenv.config();\n\/\/ Load configuration\nconst config = JSON.parse(fs.readFileSync('.\/config.json', 'utf8'));\n\/\/ Initialize Gemini AI\nconst genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);\nconst model = genAI.getGenerativeModel({ model: &quot;gemini-2.0-flash&quot; });\n\/\/ Build system prompt from config\nconst systemPrompt = aiResponse.buildSystemPrompt(config);\n\/\/ Create Discord client\nconst client = new Client({\n    intents: [\n        GatewayIntentBits.Guilds,\n        GatewayIntentBits.GuildMessages,\n        GatewayIntentBits.MessageContent,\n    ],\n});\n\/\/ Bot ready event\nclient.once('ready', () =&gt; {\n    console.log('CybranceBot is online!');\n    console.log(`System prompt loaded: ${systemPrompt.substring(0, 100)}...`);\n});\n\/\/ Track processed messages to prevent duplicates\nconst processedMessages = new Set();\n\/\/ Message event handler\nclient.on('messageCreate', async (message) =&gt; {\n    \/\/ Ignore bot messages\n    if (message.author.bot) return;\n    \/\/ Only respond when mentioned\n    if (!message.mentions.has(client.user)) return;\n    \/\/ Prevent duplicate processing\n    if (processedMessages.has(message.id)) return;\n    processedMessages.add(message.id);\n    \/\/ Clean up old message IDs (keep only last 100)\n    if (processedMessages.size &gt; 100) {\n        const oldIds = Array.from(processedMessages).slice(0, processedMessages.size - 100);\n        oldIds.forEach(id =&gt; processedMessages.delete(id));\n    }\n    try {\n        console.log(`Processing message from ${message.author.username}: &quot;${message.content}&quot;`);\n        \/\/ Generate AI response using utility\n        const response = await aiResponse.generateAIResponse(\n            message.content,\n            model,\n            systemPrompt\n        );\n        \/\/ Send response\n        await message.reply(response);\n        console.log(`\u2705 Responded to ${message.author.username}`);\n    } catch (error) {\n        console.error('\u274c Error:', error);\n        await message.reply('Sorry, I had an error processing your message.');\n    }\n});\n\/\/ Login to Discord\nclient.login(process.env.DISCORD_BOT_TOKEN);\n\" style=\"color:#D4D4D4\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ Import packages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #4FC1FF\">Client<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4FC1FF\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\"> } = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;discord.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #4FC1FF\">GoogleGenerativeAI<\/span><span style=\"color: #D4D4D4\"> } = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;@google\/generative-ai&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">dotenv<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;dotenv&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">fs<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;fs&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Import utilities<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">aiResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/utils\/aiResponse.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Load environment variables<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">dotenv<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">config<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Load configuration<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">config<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #4FC1FF\">JSON<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">parse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">fs<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">readFileSync<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/config.json&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;utf8&#039;<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Initialize Gemini AI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">genAI<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">GoogleGenerativeAI<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">process<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">env<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4FC1FF\">GEMINI_API_KEY<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">model<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">genAI<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getGenerativeModel<\/span><span style=\"color: #D4D4D4\">({ <\/span><span style=\"color: #9CDCFE\">model:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;gemini-2.0-flash&quot;<\/span><span style=\"color: #D4D4D4\"> });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Build system prompt from config<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">systemPrompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">aiResponse<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">buildSystemPrompt<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Create Discord client<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">client<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Client<\/span><span style=\"color: #D4D4D4\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">intents:<\/span><span style=\"color: #D4D4D4\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Guilds<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">GuildMessages<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">MessageContent<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    ],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Bot ready event<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">once<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;ready&#039;<\/span><span style=\"color: #D4D4D4\">, () <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;CybranceBot is online!&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`System prompt loaded: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">substring<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #D4D4D4\">)<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">...`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Track processed messages to prevent duplicates<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">processedMessages<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Set<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Message event handler<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">on<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;messageCreate&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">async<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Ignore bot messages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">bot<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Only respond when mentioned<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">mentions<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">has<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">user<\/span><span style=\"color: #D4D4D4\">)) <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Prevent duplicate processing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">has<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">)) <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">add<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Clean up old message IDs (keep only last 100)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">size<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">oldIds<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">from<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">slice<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">size<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">oldIds<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">forEach<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">delete<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`Processing message from <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">username<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">: &quot;<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">&quot;`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Generate AI response using utility<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">response<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">aiResponse<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">generateAIResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        );<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Send response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">reply<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u2705 Responded to <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">username<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;\u274c Error:&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">reply<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;Sorry, I had an error processing your message.&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Login to Discord<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">login<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">process<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">env<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4FC1FF\">DISCORD_BOT_TOKEN<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>You have made it now! Test your bot and see all the changes. The bot will have better context &amp; response handling and the ability to have perfect knowledge.<\/p>\n\n\n\n<p><strong>An Example:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"215\" src=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im4-1024x215.png\" alt=\"Screenshot of A Discord Chatbot that haves a personality &amp; rules\" class=\"wp-image-3203\" srcset=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im4-1024x215.png 1024w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im4-300x63.png 300w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im4-768x161.png 768w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im4-512x108.png 512w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im4-920x193.png 920w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im4.png 1232w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">5. <strong>Giving Your Discord Bot the Ability to Remember<\/strong><\/h2>\n\n\n\n<p>Adding memory to your bot is important, as it will allow your bot to respond more like a human.&nbsp;<\/p>\n\n\n\n<p>That is exactly what we will do in this part; we will be adding a function that will store at least 10 past user conversations with the bot. So your bot will have more context.<\/p>\n\n\n\n<p>This time, we will use <strong>\u201cutils\/memory.js\u201d<\/strong> to handle the memory functions. We will update <strong>\u201cutils\/aiResponse.js\u201d<\/strong> to include the new memory in the AI response context. And we will update <strong>\u201cindex.js\u201d<\/strong> to pass the userId to the AI response function.<\/p>\n\n\n\n<p>Here is <strong>\u201cutils\/memory.js\u201d<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2\"><span style=\"align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JavaScript<\/span><span role=\"button\" data-code=\"\/\/ In-memory storage for user conversations\n\/\/ Structure: { userId: [{ user: &quot;message&quot;, bot: &quot;response&quot;, timestamp: Date }] }\nconst userMemories = new Map();\n\/\/ Maximum number of conversations to store per user\nconst MAX_CONVERSATIONS = 10;\n\/**\n * Add a conversation to the user's memory\n * @param {string} userId - Discord user ID\n * @param {string} userMessage - User's message\n * @param {string} botResponse - Bot's response\n *\/\nfunction addToMemory(userId, userMessage, botResponse) {\n  try {\n    \/\/ Get existing memory or create a new array\n    let userConversations = userMemories.get(userId) || [];\n    \/\/ Create conversation entry\n    const conversation = {\n      user: userMessage,\n      bot: botResponse,\n      timestamp: new Date()\n    };\n    \/\/ Add to memory\n    userConversations.push(conversation);\n    \/\/ Keep only the last MAX_CONVERSATIONS\n    if (userConversations.length &gt; MAX_CONVERSATIONS) {\n      userConversations = userConversations.slice(-MAX_CONVERSATIONS);\n    }\n    \/\/ Update memory\n    userMemories.set(userId, userConversations);\n    console.log(`\ud83d\udcbe Stored conversation for user ${userId} (${userConversations.length}\/${MAX_CONVERSATIONS})`);\n  } catch (error) {\n    console.error('Memory storage error:', error);\n  }\n}\n\/**\n * Get the user's conversation history\n * @param {string} userId - Discord user ID\n * @returns {Array} - Array of conversation objects\n *\/\nfunction getMemory(userId) {\n  return userMemories.get(userId) || [];\n}\n\/**\n * Format memory for AI context\n * @param {string} userId - Discord user ID\n * @returns {string} - Formatted conversation history\n *\/\nfunction formatMemoryForAI(userId) {\n  const conversations = getMemory(userId);\n  if (conversations.length === 0) {\n    return '';\n  }\n  let memoryContext = '\\n\\nPrevious conversation history:\\n';\n  conversations.forEach((conv, index) =&gt; {\n    memoryContext += `${index + 1}. User: ${conv.user}\\n`;\n    memoryContext += `   Bot: ${conv.bot}\\n`;\n  });\n  memoryContext += '\\nUse this context to provide more relevant and personalized responses.\\n';\n  return memoryContext;\n}\n\/**\n * Clear memory for a specific user\n * @param {string} userId - Discord user ID\n *\/\nfunction clearMemory(userId) {\n  userMemories.delete(userId);\n  console.log(`\ud83d\uddd1\ufe0f Cleared memory for user ${userId}`);\n}\n\/**\n * Get memory statistics\n * @returns {Object} - Memory usage statistics\n *\/\nfunction getMemoryStats() {\n  const totalUsers = userMemories.size;\n  let totalConversations = 0;\n  userMemories.forEach(conversations =&gt; {\n    totalConversations += conversations.length;\n  });\n  return {\n    totalUsers,\n    totalConversations,\n    averageConversationsPerUser: totalUsers &gt; 0 ? (totalConversations \/ totalUsers).toFixed(2) : 0\n  };\n}\n\/**\n * Clean old memories (optional - for memory management)\n * Remove conversations older than specified days\n * @param {number} daysOld - Days to keep conversations\n *\/\nfunction cleanOldMemories(daysOld = 7) {\n  const cutoffDate = new Date();\n  cutoffDate.setDate(cutoffDate.getDate() - daysOld);\n  let cleanedCount = 0;\n  userMemories.forEach((conversations, userId) =&gt; {\n    const filteredConversations = conversations.filter(conv =&gt; conv.timestamp &gt; cutoffDate);\n    if (filteredConversations.length !== conversations.length) {\n      if (filteredConversations.length === 0) {\n        userMemories.delete(userId);\n      } else {\n        userMemories.set(userId, filteredConversations);\n      }\n      cleanedCount++;\n    }\n  });\n  console.log(`\ud83e\uddf9 Cleaned old memories for ${cleanedCount} users`);\n  return cleanedCount;\n}\nmodule.exports = {\n  addToMemory,\n  getMemory,\n  formatMemoryForAI,\n  clearMemory,\n  getMemoryStats,\n  cleanOldMemories\n};\" style=\"color:#D4D4D4\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ In-memory storage for user conversations<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Structure: { userId: [{ user: &quot;message&quot;, bot: &quot;response&quot;, timestamp: Date }] }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">userMemories<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Map<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Maximum number of conversations to store per user<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">MAX_CONVERSATIONS<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Add a conversation to the user&#039;s memory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #6A9955\"> - Discord user ID<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #6A9955\"> - User&#039;s message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">botResponse<\/span><span style=\"color: #6A9955\"> - Bot&#039;s response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">addToMemory<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">botResponse<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Get existing memory or create a new array<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">userConversations<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">userMemories<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">get<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">) || [];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Create conversation entry<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">conversation<\/span><span style=\"color: #D4D4D4\"> = {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">user:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">bot:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">botResponse<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">timestamp:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Date<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    };<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Add to memory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">userConversations<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">push<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">conversation<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Keep only the last MAX_CONVERSATIONS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">userConversations<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #4FC1FF\">MAX_CONVERSATIONS<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">userConversations<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">userConversations<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">slice<\/span><span style=\"color: #D4D4D4\">(-<\/span><span style=\"color: #4FC1FF\">MAX_CONVERSATIONS<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Update memory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">userMemories<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">set<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">userConversations<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udcbe Stored conversation for user <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\"> (<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">userConversations<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">\/<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #4FC1FF\">MAX_CONVERSATIONS<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">)`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;Memory storage error:&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Get the user&#039;s conversation history<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #6A9955\"> - Discord user ID<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Array}<\/span><span style=\"color: #6A9955\"> - Array of conversation objects<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">getMemory<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">userMemories<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">get<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">) || [];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Format memory for AI context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #6A9955\"> - Discord user ID<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> - Formatted conversation history<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">formatMemoryForAI<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">conversations<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">getMemory<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">conversations<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\"> === <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">memoryContext<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D7BA7D\">\\n\\n<\/span><span style=\"color: #CE9178\">Previous conversation history:<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">conversations<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">forEach<\/span><span style=\"color: #D4D4D4\">((<\/span><span style=\"color: #9CDCFE\">conv<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">index<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">memoryContext<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">index<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">. User: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">conv<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">user<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">memoryContext<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">`   Bot: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">conv<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">bot<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">memoryContext<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">Use this context to provide more relevant and personalized responses.<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">memoryContext<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Clear memory for a specific user<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #6A9955\"> - Discord user ID<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">clearMemory<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">userMemories<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">delete<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\uddd1\ufe0f Cleared memory for user <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Get memory statistics<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Object}<\/span><span style=\"color: #6A9955\"> - Memory usage statistics<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">getMemoryStats<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">totalUsers<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">userMemories<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">size<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">totalConversations<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">userMemories<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">forEach<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">conversations<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">totalConversations<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #9CDCFE\">conversations<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">totalUsers<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">totalConversations<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">averageConversationsPerUser:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">totalUsers<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\"> ? (<\/span><span style=\"color: #9CDCFE\">totalConversations<\/span><span style=\"color: #D4D4D4\"> \/ <\/span><span style=\"color: #9CDCFE\">totalUsers<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">toFixed<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">) : <\/span><span style=\"color: #B5CEA8\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  };<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Clean old memories (optional - for memory management)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Remove conversations older than specified days<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{number}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">daysOld<\/span><span style=\"color: #6A9955\"> - Days to keep conversations<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">cleanOldMemories<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">daysOld<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">7<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">cutoffDate<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Date<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cutoffDate<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">setDate<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">cutoffDate<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getDate<\/span><span style=\"color: #D4D4D4\">() - <\/span><span style=\"color: #9CDCFE\">daysOld<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleanedCount<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">userMemories<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">forEach<\/span><span style=\"color: #D4D4D4\">((<\/span><span style=\"color: #9CDCFE\">conversations<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">filteredConversations<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">conversations<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">filter<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">conv<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">conv<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">timestamp<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #9CDCFE\">cutoffDate<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">filteredConversations<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\"> !== <\/span><span style=\"color: #9CDCFE\">conversations<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">filteredConversations<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\"> === <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">userMemories<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">delete<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      } <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">userMemories<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">set<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">filteredConversations<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">cleanedCount<\/span><span style=\"color: #D4D4D4\">++;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83e\uddf9 Cleaned old memories for <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">cleanedCount<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\"> users`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleanedCount<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">module<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4EC9B0\">exports<\/span><span style=\"color: #D4D4D4\"> = {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">addToMemory<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">getMemory<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">formatMemoryForAI<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">clearMemory<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">getMemoryStats<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleanOldMemories<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Here are the updated <strong>\u201cutils\/aiResponse.js\u201d<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2\"><span style=\"align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JavaScript<\/span><span role=\"button\" data-code=\"const memory = require('.\/memory.js');\n\/**\n * Generate AI response using Gemini model with memory context\n * @param {string} userMessage - The user's message\n * @param {Object} model - The Gemini AI model instance\n * @param {string} systemPrompt - The system prompt with rules\n * @param {string} userId - Discord user ID for memory context\n * @returns {Promise&lt;string&gt;} - The AI response\n *\/\nasync function generateAIResponse(userMessage, model, systemPrompt, userId) {\n  try {\n    \/\/ Clean user message (remove mentions)\n    const cleanedUserMessage = cleanUserMessage(userMessage);\n    \/\/ Get memory context for this user\n    const memoryContext = memory.formatMemoryForAI(userId);\n    \/\/ Create the full prompt with system prompt, memory context, and current message\n    const fullPrompt = `${systemPrompt}${memoryContext}\\n\\nCurrent user message: ${cleanedUserMessage}`;\n    \/\/ Generate response from AI\n    const result = await model.generateContent(fullPrompt);\n    const aiResponse = result.response.text();\n    \/\/ Clean and validate response\n    const cleanedResponse = cleanResponse(aiResponse);\n    \/\/ Store this conversation in memory\n    memory.addToMemory(userId, cleanedUserMessage, cleanedResponse);\n    return cleanedResponse;\n  } catch (error) {\n    console.error('AI Response Error:', error);\n    throw new Error('Failed to generate AI response');\n  }\n}\n\/**\n * Clean user message (remove mentions and extra whitespace)\n * @param {string} message - Raw user message\n * @returns {string} - Cleaned message\n *\/\nfunction cleanUserMessage(message) {\n  if (!message || typeof message !== 'string') {\n    return '';\n  }\n  \/\/ Remove mentions (like &lt;@123456789&gt;)\n  let cleaned = message.replace(\/&lt;@!?\\d+&gt;\/g, '').trim();\n  \/\/ Remove extra whitespace\n  cleaned = cleaned.replace(\/\\s+\/g, ' ').trim();\n  return cleaned || 'hi';\n}\n\/**\n * Clean and validate the AI response\n * @param {string} response - Raw AI response\n * @returns {string} - Cleaned response\n *\/\nfunction cleanResponse(response) {\n  if (!response || typeof response !== 'string') {\n    return 'Sorry, I couldn\\'t generate a proper response.';\n  }\n  \/\/ Trim whitespace\n  let cleaned = response.trim();\n  \/\/ Ensure response is not too long for Discord (2000 char limit)\n  if (cleaned.length &gt; 1900) {\n    cleaned = cleaned.substring(0, 1900) + '...';\n  }\n  \/\/ Remove any potential harmful content markers\n  cleaned = cleaned.replace(\/\\[HARMFUL\\]|\\[NSFW\\]|\\[INAPPROPRIATE\\]\/gi, '');\n  return cleaned || 'Sorry, I couldn\\'t generate a response.';\n}\n\/**\n * Build system prompt from config\n * @param {Object} config - Configuration object with prompt and rules\n * @returns {string} - Complete system prompt\n *\/\nfunction buildSystemPrompt(config) {\n  let systemPrompt = config.prompt || 'You are a helpful AI assistant.';\n  if (config.rules &amp;&amp; Array.isArray(config.rules)) {\n    systemPrompt += '\\n\\nRules you must follow:\\n';\n    config.rules.forEach((rule, index) =&gt; {\n      systemPrompt += `${index + 1}. ${rule}\\n`;\n    });\n  }\n  return systemPrompt;\n}\nmodule.exports = {\n  generateAIResponse,\n  cleanResponse,\n  cleanUserMessage,\n  buildSystemPrompt\n};\" style=\"color:#D4D4D4\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\"><code><span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">memory<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/memory.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Generate AI response using Gemini model with memory context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #6A9955\"> - The user&#039;s message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Object}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #6A9955\"> - The Gemini AI model instance<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #6A9955\"> - The system prompt with rules<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #6A9955\"> - Discord user ID for memory context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Promise&lt;string&gt;}<\/span><span style=\"color: #6A9955\"> - The AI response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">async<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">generateAIResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Clean user message (remove mentions)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">cleanUserMessage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Get memory context for this user<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">memoryContext<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">memory<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">formatMemoryForAI<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Create the full prompt with system prompt, memory context, and current message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">fullPrompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #569CD6\">}${<\/span><span style=\"color: #9CDCFE\">memoryContext<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n\\n<\/span><span style=\"color: #CE9178\">Current user message: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Generate response from AI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">result<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">generateContent<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">fullPrompt<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">aiResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">text<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Clean and validate response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">cleanedResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">cleanResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">aiResponse<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Store this conversation in memory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">memory<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">addToMemory<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">cleanedResponse<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleanedResponse<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;AI Response Error:&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">throw<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;Failed to generate AI response&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Clean user message (remove mentions and extra whitespace)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #6A9955\"> - Raw user message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> - Cleaned message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">cleanUserMessage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #569CD6\">typeof<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\"> !== <\/span><span style=\"color: #CE9178\">&#039;string&#039;<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Remove mentions (like &lt;@123456789&gt;)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">replace<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #D16969\">\/&lt;@!<\/span><span style=\"color: #D7BA7D\">?<\/span><span style=\"color: #D16969\">\\d<\/span><span style=\"color: #D7BA7D\">+<\/span><span style=\"color: #D16969\">&gt;\/<\/span><span style=\"color: #569CD6\">g<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">trim<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Remove extra whitespace<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">replace<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #D16969\">\/\\s<\/span><span style=\"color: #D7BA7D\">+<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #569CD6\">g<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039; &#039;<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">trim<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&#039;hi&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Clean and validate the AI response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #6A9955\"> - Raw AI response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> - Cleaned response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">cleanResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #569CD6\">typeof<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\"> !== <\/span><span style=\"color: #CE9178\">&#039;string&#039;<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;Sorry, I couldn<\/span><span style=\"color: #D7BA7D\">\\&#039;<\/span><span style=\"color: #CE9178\">t generate a proper response.&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Trim whitespace<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">trim<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Ensure response is not too long for Discord (2000 char limit)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #B5CEA8\">1900<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">substring<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1900<\/span><span style=\"color: #D4D4D4\">) + <\/span><span style=\"color: #CE9178\">&#039;...&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Remove any potential harmful content markers<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">replace<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #D7BA7D\">\\[<\/span><span style=\"color: #D16969\">HARMFUL<\/span><span style=\"color: #D7BA7D\">\\]<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D7BA7D\">\\[<\/span><span style=\"color: #D16969\">NSFW<\/span><span style=\"color: #D7BA7D\">\\]<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D7BA7D\">\\[<\/span><span style=\"color: #D16969\">INAPPROPRIATE<\/span><span style=\"color: #D7BA7D\">\\]<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #569CD6\">gi<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&#039;Sorry, I couldn<\/span><span style=\"color: #D7BA7D\">\\&#039;<\/span><span style=\"color: #CE9178\">t generate a response.&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Build system prompt from config<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Object}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #6A9955\"> - Configuration object with prompt and rules<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> - Complete system prompt<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">buildSystemPrompt<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&#039;You are a helpful AI assistant.&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">rules<\/span><span style=\"color: #D4D4D4\"> &amp;&amp; <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">isArray<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">rules<\/span><span style=\"color: #D4D4D4\">)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D7BA7D\">\\n\\n<\/span><span style=\"color: #CE9178\">Rules you must follow:<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">rules<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">forEach<\/span><span style=\"color: #D4D4D4\">((<\/span><span style=\"color: #9CDCFE\">rule<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">index<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">index<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">. <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">rule<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">module<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4EC9B0\">exports<\/span><span style=\"color: #D4D4D4\"> = {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">generateAIResponse<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleanResponse<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleanUserMessage<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">buildSystemPrompt<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Here is also the updated <strong>\u201cindex.js\u201d<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2\"><span style=\"align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JavaScript<\/span><span role=\"button\" data-code=\"\/\/ Import packages\nconst { Client, GatewayIntentBits } = require('discord.js');\nconst { GoogleGenerativeAI } = require('@google\/generative-ai');\nconst dotenv = require('dotenv');\nconst fs = require('fs');\n\/\/ Import utilities\nconst aiResponse = require('.\/utils\/aiResponse.js');\n\/\/ Load environment variables\ndotenv.config();\n\/\/ Load configuration\nconst config = JSON.parse(fs.readFileSync('.\/config.json', 'utf8'));\n\/\/ Initialize Gemini AI\nconst genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);\nconst model = genAI.getGenerativeModel({ model: &quot;gemini-2.0-flash&quot; });\n\/\/ Build system prompt from config\nconst systemPrompt = aiResponse.buildSystemPrompt(config);\n\/\/ Create Discord client\nconst client = new Client({\n    intents: [\n        GatewayIntentBits.Guilds,\n        GatewayIntentBits.GuildMessages,\n        GatewayIntentBits.MessageContent,\n    ],\n});\n\/\/ Bot ready event\nclient.once('ready', () =&gt; {\n    console.log('CybranceBot is online!');\n    console.log(`System prompt loaded: ${systemPrompt.substring(0, 100)}...`);\n});\n\/\/ Track processed messages to prevent duplicates\nconst processedMessages = new Set();\n\/\/ Message event handler\nclient.on('messageCreate', async (message) =&gt; {\n    \/\/ Ignore bot messages\n    if (message.author.bot) return;\n    \/\/ Only respond when mentioned\n    if (!message.mentions.has(client.user)) return;\n    \/\/ Prevent duplicate processing\n    if (processedMessages.has(message.id)) return;\n    processedMessages.add(message.id);\n    \/\/ Clean up old message IDs (keep only last 100)\n    if (processedMessages.size &gt; 100) {\n        const oldIds = Array.from(processedMessages).slice(0, processedMessages.size - 100);\n        oldIds.forEach(id =&gt; processedMessages.delete(id));\n    }\n    try {\n        console.log(`Processing message from ${message.author.username}: &quot;${message.content}&quot;`);\n        \/\/ Generate AI response using utility with memory\n        const response = await aiResponse.generateAIResponse(\n            message.content,\n            model,\n            systemPrompt,\n            message.author.id \/\/ Pass the user ID for memory handling\n        );\n        \/\/ Send response\n        await message.reply(response);\n        console.log(`\u2705 Responded to ${message.author.username}`);\n    } catch (error) {\n        console.error('\u274c Error:', error);\n        await message.reply('Sorry, I had an error processing your message.');\n    }\n});\n\/\/ Login to Discord\nclient.login(process.env.DISCORD_BOT_TOKEN);\n\" style=\"color:#D4D4D4\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ Import packages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #4FC1FF\">Client<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4FC1FF\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\"> } = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;discord.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #4FC1FF\">GoogleGenerativeAI<\/span><span style=\"color: #D4D4D4\"> } = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;@google\/generative-ai&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">dotenv<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;dotenv&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">fs<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;fs&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Import utilities<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">aiResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/utils\/aiResponse.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Load environment variables<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">dotenv<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">config<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Load configuration<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">config<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #4FC1FF\">JSON<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">parse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">fs<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">readFileSync<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/config.json&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;utf8&#039;<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Initialize Gemini AI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">genAI<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">GoogleGenerativeAI<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">process<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">env<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4FC1FF\">GEMINI_API_KEY<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">model<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">genAI<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getGenerativeModel<\/span><span style=\"color: #D4D4D4\">({ <\/span><span style=\"color: #9CDCFE\">model:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;gemini-2.0-flash&quot;<\/span><span style=\"color: #D4D4D4\"> });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Build system prompt from config<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">systemPrompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">aiResponse<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">buildSystemPrompt<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Create Discord client<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">client<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Client<\/span><span style=\"color: #D4D4D4\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">intents:<\/span><span style=\"color: #D4D4D4\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Guilds<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">GuildMessages<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">MessageContent<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    ],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Bot ready event<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">once<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;ready&#039;<\/span><span style=\"color: #D4D4D4\">, () <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;CybranceBot is online!&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`System prompt loaded: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">substring<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #D4D4D4\">)<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">...`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Track processed messages to prevent duplicates<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">processedMessages<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Set<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Message event handler<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">on<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;messageCreate&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">async<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Ignore bot messages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">bot<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Only respond when mentioned<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">mentions<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">has<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">user<\/span><span style=\"color: #D4D4D4\">)) <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Prevent duplicate processing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">has<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">)) <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">add<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Clean up old message IDs (keep only last 100)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">size<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">oldIds<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">from<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">slice<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">size<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">oldIds<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">forEach<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">delete<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`Processing message from <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">username<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">: &quot;<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">&quot;`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Generate AI response using utility with memory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">response<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">aiResponse<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">generateAIResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">\/\/ Pass the user ID for memory handling<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        );<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Send response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">reply<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u2705 Responded to <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">username<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;\u274c Error:&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">reply<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;Sorry, I had an error processing your message.&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Login to Discord<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">login<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">process<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">env<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4FC1FF\">DISCORD_BOT_TOKEN<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Boom! You have now implemented a useful feature in your bot. Start and test it now; you will see that the bot remembers 10 past conversations with you.<\/p>\n\n\n\n<p><strong>Here is an Example Of Using Memory:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"226\" src=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im5-1024x226.png\" alt=\"Screenshot of A Discord Chatbot that haves ability to remember\" class=\"wp-image-3204\" srcset=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im5-1024x226.png 1024w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im5-300x66.png 300w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im5-768x170.png 768w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im5-512x113.png 512w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im5-920x203.png 920w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im5.png 1268w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">6. <strong>Integrating Web Search Ability Into Your Discord Bot<\/strong><\/h2>\n\n\n\n<p>Enhancing your bot with web search ability could make it even better. Your bot can search the web for anything that it couldn\u2019t find, it can help people with searching for information they need, and much more.<\/p>\n\n\n\n<p>We will be using the Serper API for web search.<\/p>\n\n\n\n<p><strong>How to get the Serper API key?<\/strong><\/p>\n\n\n\n<p><strong>1\/- Visit<\/strong><a href=\"https:\/\/serper.dev\/\"><strong> <\/strong><strong>Serper\u2019s Website<\/strong><\/a><\/p>\n\n\n\n<p><strong>2\/- Click the Sign in or Sign up (if you don\u2019t have an account yet) button<\/strong><\/p>\n\n\n\n<p><strong>3\/- Once accessed the Dashboard, click the API key tab in your sidebar, then copy your API key<\/strong><\/p>\n\n\n\n<p><strong>Continuing:<\/strong><\/p>\n\n\n\n<p>You will be using<strong> \u201cutils\/search.js\u201d<\/strong> to get the search function, and you will need to update <strong>\u201cutils\/aiResponse.js\u201d<\/strong> to include the search function. And also your new <strong>\u201c.env\u201d <\/strong>should look like this:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2\"><span style=\"align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JavaScript<\/span><span role=\"button\" data-code=\"DISCORD_BOT_TOKEN=&quot;&quot; # Paste in here your Discord bot token.\nGEMINI_API_KEY=&quot;&quot; # Paste in here your Gemini API key.\nSERPER_API_KEY=&quot;&quot; # Paste in here your Serper API key.\" style=\"color:#D4D4D4\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\"><code><span class=\"line\"><span style=\"color: #4FC1FF\">DISCORD_BOT_TOKEN<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;&quot;<\/span><span style=\"color: #D4D4D4\"> # <\/span><span style=\"color: #9CDCFE\">Paste<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">here<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">your<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Discord<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">bot<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">token<\/span><span style=\"color: #D4D4D4\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #4FC1FF\">GEMINI_API_KEY<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;&quot;<\/span><span style=\"color: #D4D4D4\"> # <\/span><span style=\"color: #9CDCFE\">Paste<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">here<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">your<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Gemini<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">API<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">key<\/span><span style=\"color: #D4D4D4\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #4FC1FF\">SERPER_API_KEY<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;&quot;<\/span><span style=\"color: #D4D4D4\"> # <\/span><span style=\"color: #9CDCFE\">Paste<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">here<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">your<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Serper<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">API<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">key<\/span><span style=\"color: #D4D4D4\">.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Here is<strong> \u201cutils\/search.js\u201d<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2\"><span style=\"align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JavaScript<\/span><span role=\"button\" data-code=\"\/**\n * Perform a web search using the Serper API\n * @param {string} query - Search query\n * @returns {Promise&lt;Object&gt;} - Search results object\n *\/\nasync function performSearch(query) {\n  try {\n    const response = await fetch('https:\/\/google.serper.dev\/search', {\n      method: 'POST',\n      headers: {\n        'X-API-KEY': process.env.SERPER_API_KEY,\n        'Content-Type': 'application\/json'\n      },\n      body: JSON.stringify({\n        q: query,\n        num: 5 \/\/ Get top 5 results\n      })\n    });\n    if (!response.ok) {\n      throw new Error(`Serper API error: ${response.status} ${response.statusText}`);\n    }\n    const data = await response.json();\n    return {\n      success: true,\n      query: query,\n      results: data\n    };\n  } catch (error) {\n    console.error('Search error:', error);\n    return {\n      success: false,\n      query: query,\n      error: error.message\n    };\n  }\n}\n\/**\n * Detect if the user message needs a web search\n * @param {string} message - User's message\n * @returns {boolean} - Whether search is needed\n *\/\nfunction detectSearchIntent(message) {\n  if (!message || typeof message !== 'string') {\n    return false;\n  }\n  const searchKeywords = [\n    \/\/ Direct search requests\n    'search for', 'look up', 'find information', 'google', 'search',\n    \/\/ Current information requests\n    'latest', 'recent', 'current', 'today', 'now', 'this year', 'new',\n    \/\/ News and events\n    'news', 'breaking', 'happened', 'event', 'update',\n    \/\/ Weather and time-sensitive\n    'weather', 'temperature', 'forecast', 'stock price', 'exchange rate',\n    \/\/ Questions about the current state\n    'what is happening', 'what happened', 'tell me about', 'information about',\n    \/\/ Specific domains that need current info\n    'price of', 'cost of', 'how much', 'when did', 'who is', 'where is'\n  ];\n  const lowerMessage = message.toLowerCase();\n  \/\/ Check for search keywords\n  const hasSearchKeywords = searchKeywords.some(keyword =&gt;\n    lowerMessage.includes(keyword)\n  );\n  \/\/ Check for question patterns that might need current info\n  const questionPatterns = [\n    \/what.*(?:latest|recent|current|new|today)\/i,\n    \/when.*(?:did|will|does)\/i,\n    \/who.*(?:is|was|are|were)\/i,\n    \/where.*(?:is|are|can)\/i,\n    \/how.*(?:much|many|to)\/i,\n    \/why.*(?:did|is|are)\/i\n  ];\n  const hasQuestionPattern = questionPatterns.some(pattern =&gt;\n    pattern.test(message)\n  );\n  return hasSearchKeywords || hasQuestionPattern;\n}\n\/**\n * Format search results for AI context\n * @param {Object} searchData - Search results from Serper API\n * @returns {string} - Formatted search context\n *\/\nfunction formatSearchResults(searchData) {\n  if (!searchData.success || !searchData.results) {\n    return '';\n  }\n  const { results } = searchData;\n  let formattedResults = `\\n\\nCurrent web search results for &quot;${searchData.query}&quot;:\\n`;\n  \/\/ Add organic search results\n  if (results.organic &amp;&amp; results.organic.length &gt; 0) {\n    formattedResults += '\\nTop search results:\\n';\n    results.organic.slice(0, 3).forEach((result, index) =&gt; {\n      formattedResults += `${index + 1}. ${result.title}\\n`;\n      formattedResults += `   ${result.snippet}\\n`;\n      formattedResults += `   Source: ${result.link}\\n\\n`;\n    });\n  }\n  \/\/ Add knowledge graph if available\n  if (results.knowledgeGraph) {\n    const kg = results.knowledgeGraph;\n    formattedResults += `Knowledge Graph:\\n`;\n    formattedResults += `Title: ${kg.title}\\n`;\n    if (kg.description) {\n      formattedResults += `Description: ${kg.description}\\n`;\n    }\n    if (kg.attributes) {\n      Object.entries(kg.attributes).forEach(([key, value]) =&gt; {\n        formattedResults += `${key}: ${value}\\n`;\n      });\n    }\n    formattedResults += '\\n';\n  }\n  \/\/ Add people also ask if available\n  if (results.peopleAlsoAsk &amp;&amp; results.peopleAlsoAsk.length &gt; 0) {\n    formattedResults += 'Related questions:\\n';\n    results.peopleAlsoAsk.slice(0, 2).forEach((item, index) =&gt; {\n      formattedResults += `${index + 1}. ${item.question}\\n`;\n    });\n    formattedResults += '\\n';\n  }\n  formattedResults += 'Use this current information to provide an accurate and up-to-date response.\\n';\n  return formattedResults;\n}\n\/**\n * Perform search and format results (main function)\n * @param {string} query - Search query\n * @returns {Promise&lt;Object&gt;} - Formatted search results\n *\/\nasync function searchAndFormat(query) {\n  const searchResults = await performSearch(query);\n  if (searchResults.success) {\n    const formattedContext = formatSearchResults(searchResults);\n    return {\n      success: true,\n      query: query,\n      context: formattedContext,\n      rawResults: searchResults.results\n    };\n  } else {\n    return {\n      success: false,\n      query: query,\n      error: searchResults.error\n    };\n  }\n}\nmodule.exports = {\n  performSearch,\n  detectSearchIntent,\n  formatSearchResults,\n  searchAndFormat\n};\" style=\"color:#D4D4D4\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Perform a web search using the Serper API<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">query<\/span><span style=\"color: #6A9955\"> - Search query<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Promise&lt;Object&gt;}<\/span><span style=\"color: #6A9955\"> - Search results object<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">async<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">performSearch<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">query<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">response<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">fetch<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;https:\/\/google.serper.dev\/search&#039;<\/span><span style=\"color: #D4D4D4\">, {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">method:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;POST&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">headers:<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #CE9178\">&#039;X-API-KEY&#039;<\/span><span style=\"color: #9CDCFE\">:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">process<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">env<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4FC1FF\">SERPER_API_KEY<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #CE9178\">&#039;Content-Type&#039;<\/span><span style=\"color: #9CDCFE\">:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;application\/json&#039;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">body:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">JSON<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">stringify<\/span><span style=\"color: #D4D4D4\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">q:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">query<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">num:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">\/\/ Get top 5 results<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      })<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">ok<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">throw<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`Serper API error: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">status<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\"> <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">statusText<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">data<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">json<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">success:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">query:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">query<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">results:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    };<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;Search error:&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">success:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">query:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">query<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">error:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    };<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Detect if the user message needs a web search<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #6A9955\"> - User&#039;s message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{boolean}<\/span><span style=\"color: #6A9955\"> - Whether search is needed<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">detectSearchIntent<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #569CD6\">typeof<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\"> !== <\/span><span style=\"color: #CE9178\">&#039;string&#039;<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">searchKeywords<\/span><span style=\"color: #D4D4D4\"> = [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Direct search requests<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;search for&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;look up&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;find information&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;google&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;search&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Current information requests<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;latest&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;recent&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;current&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;today&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;now&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;this year&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;new&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ News and events<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;news&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;breaking&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;happened&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;event&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;update&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Weather and time-sensitive<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;weather&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;temperature&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;forecast&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;stock price&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;exchange rate&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Questions about the current state<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;what is happening&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;what happened&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;tell me about&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;information about&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Specific domains that need current info<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;price of&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;cost of&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;how much&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;when did&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;who is&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;where is&#039;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  ];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">lowerMessage<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">toLowerCase<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Check for search keywords<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">hasSearchKeywords<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">searchKeywords<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">some<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">keyword<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">=&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">lowerMessage<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">includes<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">keyword<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  );<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Check for question patterns that might need current info<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">questionPatterns<\/span><span style=\"color: #D4D4D4\"> = [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #D16969\">\/what.<\/span><span style=\"color: #D7BA7D\">*<\/span><span style=\"color: #CE9178\">(?:<\/span><span style=\"color: #D16969\">latest<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">recent<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">current<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">new<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">today<\/span><span style=\"color: #CE9178\">)<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #569CD6\">i<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #D16969\">\/when.<\/span><span style=\"color: #D7BA7D\">*<\/span><span style=\"color: #CE9178\">(?:<\/span><span style=\"color: #D16969\">did<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">will<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">does<\/span><span style=\"color: #CE9178\">)<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #569CD6\">i<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #D16969\">\/who.<\/span><span style=\"color: #D7BA7D\">*<\/span><span style=\"color: #CE9178\">(?:<\/span><span style=\"color: #D16969\">is<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">was<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">are<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">were<\/span><span style=\"color: #CE9178\">)<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #569CD6\">i<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #D16969\">\/where.<\/span><span style=\"color: #D7BA7D\">*<\/span><span style=\"color: #CE9178\">(?:<\/span><span style=\"color: #D16969\">is<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">are<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">can<\/span><span style=\"color: #CE9178\">)<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #569CD6\">i<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #D16969\">\/how.<\/span><span style=\"color: #D7BA7D\">*<\/span><span style=\"color: #CE9178\">(?:<\/span><span style=\"color: #D16969\">much<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">many<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">to<\/span><span style=\"color: #CE9178\">)<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #569CD6\">i<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #D16969\">\/why.<\/span><span style=\"color: #D7BA7D\">*<\/span><span style=\"color: #CE9178\">(?:<\/span><span style=\"color: #D16969\">did<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">is<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">are<\/span><span style=\"color: #CE9178\">)<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #569CD6\">i<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  ];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">hasQuestionPattern<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">questionPatterns<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">some<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">pattern<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">=&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">pattern<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">test<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  );<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">hasSearchKeywords<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #9CDCFE\">hasQuestionPattern<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Format search results for AI context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Object}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">searchData<\/span><span style=\"color: #6A9955\"> - Search results from Serper API<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> - Formatted search context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">formatSearchResults<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">searchData<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">searchData<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">success<\/span><span style=\"color: #D4D4D4\"> || !<\/span><span style=\"color: #9CDCFE\">searchData<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">results<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #4FC1FF\">results<\/span><span style=\"color: #D4D4D4\"> } = <\/span><span style=\"color: #9CDCFE\">searchData<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">formattedResults<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D7BA7D\">\\n\\n<\/span><span style=\"color: #CE9178\">Current web search results for &quot;<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">searchData<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">query<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">&quot;:<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Add organic search results<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">results<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">organic<\/span><span style=\"color: #D4D4D4\"> &amp;&amp; <\/span><span style=\"color: #9CDCFE\">results<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">organic<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">formattedResults<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">Top search results:<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">results<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">organic<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">slice<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">forEach<\/span><span style=\"color: #D4D4D4\">((<\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">index<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">formattedResults<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">index<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">. <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">title<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">formattedResults<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">`   <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">snippet<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">formattedResults<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">`   Source: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">link<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n\\n<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Add knowledge graph if available<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">results<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">knowledgeGraph<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">kg<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">results<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">knowledgeGraph<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">formattedResults<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">`Knowledge Graph:<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">formattedResults<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">`Title: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">kg<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">title<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">kg<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">description<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">formattedResults<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">`Description: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">kg<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">description<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">kg<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">attributes<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">Object<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">entries<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">kg<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">attributes<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">forEach<\/span><span style=\"color: #D4D4D4\">(([<\/span><span style=\"color: #9CDCFE\">key<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">value<\/span><span style=\"color: #D4D4D4\">]) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">formattedResults<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">key<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">value<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">formattedResults<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Add people also ask if available<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">results<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">peopleAlsoAsk<\/span><span style=\"color: #D4D4D4\"> &amp;&amp; <\/span><span style=\"color: #9CDCFE\">results<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">peopleAlsoAsk<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">formattedResults<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">&#039;Related questions:<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">results<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">peopleAlsoAsk<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">slice<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">forEach<\/span><span style=\"color: #D4D4D4\">((<\/span><span style=\"color: #9CDCFE\">item<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">index<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">formattedResults<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">index<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">. <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">item<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">question<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">formattedResults<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">formattedResults<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">&#039;Use this current information to provide an accurate and up-to-date response.<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">formattedResults<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Perform search and format results (main function)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">query<\/span><span style=\"color: #6A9955\"> - Search query<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Promise&lt;Object&gt;}<\/span><span style=\"color: #6A9955\"> - Formatted search results<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">async<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">searchAndFormat<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">query<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">searchResults<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">performSearch<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">query<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">searchResults<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">success<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">formattedContext<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">formatSearchResults<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">searchResults<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">success:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">query:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">query<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">context:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">formattedContext<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">rawResults:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">searchResults<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">results<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    };<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  } <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">success:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">query:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">query<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">error:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">searchResults<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">error<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    };<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">module<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4EC9B0\">exports<\/span><span style=\"color: #D4D4D4\"> = {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">performSearch<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">detectSearchIntent<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">formatSearchResults<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">searchAndFormat<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Here is the updated<strong> \u201cutils\/aiResponse.js\u201d<br><\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2\"><span style=\"align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JavaScript<\/span><span role=\"button\" data-code=\"const memory = require('.\/memory.js');\nconst search = require('.\/search.js');\n\/**\n * Generate AI response using Gemini model with memory context\n * @param {string} userMessage - The user's message\n * @param {Object} model - The Gemini AI model instance\n * @param {string} systemPrompt - The system prompt with rules\n * @param {string} userId - Discord user ID for memory context\n * @returns {Promise&lt;string&gt;} - The AI response\n *\/\nasync function generateAIResponse(userMessage, model, systemPrompt, userId) {\n  try {\n    \/\/ Clean user message (remove mentions)\n    const cleanedUserMessage = cleanUserMessage(userMessage);\n    \/\/ Get memory context for this user\n    const memoryContext = memory.formatMemoryForAI(userId);\n    \/\/ Check if search is needed and perform search\n    let searchContext = '';\n    const needsSearch = search.detectSearchIntent(cleanedUserMessage);\n    if (needsSearch) {\n      console.log(`\ud83d\udd0d Search detected for: &quot;${cleanedUserMessage}&quot;`);\n      const searchResults = await search.searchAndFormat(cleanedUserMessage);\n      if (searchResults.success) {\n        searchContext = searchResults.context;\n        console.log(`\u2705 Search completed successfully`);\n      } else {\n        console.log(`\u274c Search failed: ${searchResults.error}`);\n      }\n    }\n    \/\/ Create the full prompt with system prompt, memory context, search context, and current message\n    const fullPrompt = `${systemPrompt}${memoryContext}${searchContext}\\n\\nCurrent user message: ${cleanedUserMessage}`;\n    \/\/ Generate response from AI\n    const result = await model.generateContent(fullPrompt);\n    const aiResponse = result.response.text();\n    \/\/ Clean and validate response\n    const cleanedResponse = cleanResponse(aiResponse);\n    \/\/ Store this conversation in memory\n    memory.addToMemory(userId, cleanedUserMessage, cleanedResponse);\n    return cleanedResponse;\n  } catch (error) {\n    console.error('AI Response Error:', error);\n    throw new Error('Failed to generate AI response');\n  }\n}\n\/**\n * Clean user message (remove mentions and extra whitespace)\n * @param {string} message - Raw user message\n * @returns {string} - Cleaned message\n *\/\nfunction cleanUserMessage(message) {\n  if (!message || typeof message !== 'string') {\n    return '';\n  }\n  \/\/ Remove mentions (like &lt;@123456789&gt;)\n  let cleaned = message.replace(\/&lt;@!?\\d+&gt;\/g, '').trim();\n  \/\/ Remove extra whitespace\n  cleaned = cleaned.replace(\/\\s+\/g, ' ').trim();\n  return cleaned || 'hi';\n}\n\/**\n * Clean and validate the AI response\n * @param {string} response - Raw AI response\n * @returns {string} - Cleaned response\n *\/\nfunction cleanResponse(response) {\n  if (!response || typeof response !== 'string') {\n    return 'Sorry, I couldn\\'t generate a proper response.';\n  }\n  \/\/ Trim whitespace\n  let cleaned = response.trim();\n  \/\/ Ensure response is not too long for Discord (2000 char limit)\n  if (cleaned.length &gt; 1900) {\n    cleaned = cleaned.substring(0, 1900) + '...';\n  }\n  \/\/ Remove any potential harmful content markers\n  cleaned = cleaned.replace(\/\\[HARMFUL\\]|\\[NSFW\\]|\\[INAPPROPRIATE\\]\/gi, '');\n  return cleaned || 'Sorry, I couldn\\'t generate a response.';\n}\n\/**\n * Build system prompt from config\n * @param {Object} config - Configuration object with prompt and rules\n * @returns {string} - Complete system prompt\n *\/\nfunction buildSystemPrompt(config) {\n  let systemPrompt = config.prompt || 'You are a helpful AI assistant.';\n  if (config.rules &amp;&amp; Array.isArray(config.rules)) {\n    systemPrompt += '\\n\\nRules you must follow:\\n';\n    config.rules.forEach((rule, index) =&gt; {\n      systemPrompt += `${index + 1}. ${rule}\\n`;\n    });\n  }\n  return systemPrompt;\n}\nmodule.exports = {\n  generateAIResponse,\n  cleanResponse,\n  cleanUserMessage,\n  buildSystemPrompt\n};\" style=\"color:#D4D4D4\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\"><code><span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">memory<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/memory.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">search<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/search.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Generate AI response using Gemini model with memory context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #6A9955\"> - The user&#039;s message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Object}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #6A9955\"> - The Gemini AI model instance<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #6A9955\"> - The system prompt with rules<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #6A9955\"> - Discord user ID for memory context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Promise&lt;string&gt;}<\/span><span style=\"color: #6A9955\"> - The AI response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">async<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">generateAIResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Clean user message (remove mentions)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">cleanUserMessage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Get memory context for this user<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">memoryContext<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">memory<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">formatMemoryForAI<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Check if search is needed and perform search<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">searchContext<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">needsSearch<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">search<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">detectSearchIntent<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">needsSearch<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udd0d Search detected for: &quot;<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">&quot;`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">searchResults<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">search<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">searchAndFormat<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">searchResults<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">success<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">searchContext<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">searchResults<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u2705 Search completed successfully`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      } <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u274c Search failed: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">searchResults<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Create the full prompt with system prompt, memory context, search context, and current message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">fullPrompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #569CD6\">}${<\/span><span style=\"color: #9CDCFE\">memoryContext<\/span><span style=\"color: #569CD6\">}${<\/span><span style=\"color: #9CDCFE\">searchContext<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n\\n<\/span><span style=\"color: #CE9178\">Current user message: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Generate response from AI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">result<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">generateContent<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">fullPrompt<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">aiResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">text<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Clean and validate response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">cleanedResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">cleanResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">aiResponse<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Store this conversation in memory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">memory<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">addToMemory<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">cleanedResponse<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleanedResponse<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;AI Response Error:&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">throw<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;Failed to generate AI response&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Clean user message (remove mentions and extra whitespace)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #6A9955\"> - Raw user message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> - Cleaned message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">cleanUserMessage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #569CD6\">typeof<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\"> !== <\/span><span style=\"color: #CE9178\">&#039;string&#039;<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Remove mentions (like &lt;@123456789&gt;)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">replace<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #D16969\">\/&lt;@!<\/span><span style=\"color: #D7BA7D\">?<\/span><span style=\"color: #D16969\">\\d<\/span><span style=\"color: #D7BA7D\">+<\/span><span style=\"color: #D16969\">&gt;\/<\/span><span style=\"color: #569CD6\">g<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">trim<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Remove extra whitespace<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">replace<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #D16969\">\/\\s<\/span><span style=\"color: #D7BA7D\">+<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #569CD6\">g<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039; &#039;<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">trim<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&#039;hi&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Clean and validate the AI response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #6A9955\"> - Raw AI response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> - Cleaned response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">cleanResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #569CD6\">typeof<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\"> !== <\/span><span style=\"color: #CE9178\">&#039;string&#039;<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;Sorry, I couldn<\/span><span style=\"color: #D7BA7D\">\\&#039;<\/span><span style=\"color: #CE9178\">t generate a proper response.&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Trim whitespace<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">trim<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Ensure response is not too long for Discord (2000 char limit)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #B5CEA8\">1900<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">substring<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1900<\/span><span style=\"color: #D4D4D4\">) + <\/span><span style=\"color: #CE9178\">&#039;...&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Remove any potential harmful content markers<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">replace<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #D7BA7D\">\\[<\/span><span style=\"color: #D16969\">HARMFUL<\/span><span style=\"color: #D7BA7D\">\\]<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D7BA7D\">\\[<\/span><span style=\"color: #D16969\">NSFW<\/span><span style=\"color: #D7BA7D\">\\]<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D7BA7D\">\\[<\/span><span style=\"color: #D16969\">INAPPROPRIATE<\/span><span style=\"color: #D7BA7D\">\\]<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #569CD6\">gi<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&#039;Sorry, I couldn<\/span><span style=\"color: #D7BA7D\">\\&#039;<\/span><span style=\"color: #CE9178\">t generate a response.&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Build system prompt from config<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Object}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #6A9955\"> - Configuration object with prompt and rules<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> - Complete system prompt<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">buildSystemPrompt<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&#039;You are a helpful AI assistant.&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">rules<\/span><span style=\"color: #D4D4D4\"> &amp;&amp; <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">isArray<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">rules<\/span><span style=\"color: #D4D4D4\">)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D7BA7D\">\\n\\n<\/span><span style=\"color: #CE9178\">Rules you must follow:<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">rules<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">forEach<\/span><span style=\"color: #D4D4D4\">((<\/span><span style=\"color: #9CDCFE\">rule<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">index<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">index<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">. <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">rule<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">module<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4EC9B0\">exports<\/span><span style=\"color: #D4D4D4\"> = {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">generateAIResponse<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleanResponse<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleanUserMessage<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">buildSystemPrompt<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>You have successfully added a new Web Search ability! Start and test your bot.<\/p>\n\n\n\n<p><strong>An Example of Using the Web Search Function:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"317\" src=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im6-1024x317.png\" alt=\"Screenshot of A Discord Chat Bot Uses Web Search\" class=\"wp-image-3205\" srcset=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im6-1024x317.png 1024w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im6-300x93.png 300w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im6-768x237.png 768w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im6-512x158.png 512w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im6-920x284.png 920w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im6.png 1229w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">7. <strong>Adding The Ability For Your Discord Bot to Read Images<\/strong><\/h2>\n\n\n\n<p>Adding the ability to read images is an important feature for your bot to have. It can help people with their homework documents or image descriptions.<\/p>\n\n\n\n<p>Let\u2019s set it up.<\/p>\n\n\n\n<p>You will be using<strong> \u201cutils\/imageRead.js\u201d<\/strong> to handle reading image functions, and you need to update your <strong>\u201cutils\/aiResponse.js\u201d<\/strong> to work perfectly with the image, and you will also need to update <strong>\u201cindex.js\u201d<\/strong> to handle attachments.<\/p>\n\n\n\n<p>Here is <strong>\u201cutils\/imageRead.js\u201d<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2\"><span style=\"align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JavaScript<\/span><span role=\"button\" data-code=\"\/**\n * Supported image types and their MIME types\n *\/\nconst SUPPORTED_IMAGE_TYPES = {\n  \/\/ Common formats\n  'image\/jpeg': ['.jpg', '.jpeg'],\n  'image\/png': ['.png'],\n  'image\/gif': ['.gif'],\n  'image\/webp': ['.webp'],\n  'image\/bmp': ['.bmp'],\n  'image\/tiff': ['.tiff', '.tif'],\n  'image\/svg+xml': ['.svg'],\n  \/\/ Additional formats\n  'image\/x-icon': ['.ico'],\n  'image\/vnd.microsoft.icon': ['.ico'],\n  'image\/avif': ['.avif'],\n  'image\/heic': ['.heic'],\n  'image\/heif': ['.heif']\n};\n\/**\n * Check if the attachment is a supported image\n * @param {Object} attachment - Discord attachment object\n * @returns {boolean} - Whether the attachment is a supported image\n *\/\nfunction isSupportedImage(attachment) {\n  if (!attachment) {\n    return false;\n  }\n  \/\/ Check by content type first\n  if (attachment.contentType) {\n    const contentType = attachment.contentType.toLowerCase();\n    const isSupported = Object.keys(SUPPORTED_IMAGE_TYPES).includes(contentType);\n    if (isSupported) {\n      return true;\n    }\n  }\n  \/\/ Fallback to filename extension check\n  if (attachment.name) {\n    const extension = getFileExtension(attachment.name);\n    const isSupported = Object.values(SUPPORTED_IMAGE_TYPES).some(extensions =&gt;\n      extensions.includes(extension)\n    );\n    return isSupported;\n  }\n  \/\/ Last resort: check URL extension\n  if (attachment.url) {\n    const extension = getFileExtension(attachment.url);\n    const isSupported = Object.values(SUPPORTED_IMAGE_TYPES).some(extensions =&gt;\n      extensions.includes(extension)\n    );\n    return isSupported;\n  }\n  return false;\n}\n\/**\n * Get file extension from filename\n * @param {string} filename - The filename\n * @returns {string} - File extension with dot (e.g., '.jpg')\n *\/\nfunction getFileExtension(filename) {\n  if (!filename || typeof filename !== 'string') {\n    return '';\n  }\n  const lastDot = filename.lastIndexOf('.');\n  if (lastDot === -1) {\n    return '';\n  }\n  return filename.substring(lastDot).toLowerCase();\n}\n\/**\n * Download image and convert to base64\n * @param {string} imageUrl - URL of the image\n * @returns {Promise&lt;string&gt;} - Base64 encoded image data\n *\/\nasync function downloadImageAsBase64(imageUrl) {\n  try {\n    console.log(`\ud83d\udce5 Downloading image: ${imageUrl}`);\n    const response = await fetch(imageUrl);\n    if (!response.ok) {\n      throw new Error(`Failed to download image: ${response.status} ${response.statusText}`);\n    }\n    \/\/ Get the image data as an array buffer\n    const arrayBuffer = await response.arrayBuffer();\n    \/\/ Convert to base64\n    const base64 = Buffer.from(arrayBuffer).toString('base64');\n    \/\/ Get content type from response or guess from URL\n    let mimeType = response.headers.get('content-type');\n    if (!mimeType) {\n      mimeType = guessMimeTypeFromUrl(imageUrl);\n    }\n    console.log(`\u2705 Image downloaded successfully (${arrayBuffer.byteLength} bytes, ${mimeType})`);\n    return {\n      base64: base64,\n      mimeType: mimeType,\n      size: arrayBuffer.byteLength\n    };\n  } catch (error) {\n    console.error('\u274c Error downloading image:', error);\n    throw new Error(`Failed to download image: ${error.message}`);\n  }\n}\n\/**\n * Guess MIME type from URL extension\n * @param {string} url - Image URL\n * @returns {string} - Guessed MIME type\n *\/\nfunction guessMimeTypeFromUrl(url) {\n  const extension = getFileExtension(url.split('?')[0]); \/\/ Remove query params\n  for (const [mimeType, extensions] of Object.entries(SUPPORTED_IMAGE_TYPES)) {\n    if (extensions.includes(extension)) {\n      return mimeType;\n    }\n  }\n  return 'image\/jpeg'; \/\/ Default fallback\n}\n\/**\n * Validate image size and type\n * @param {Object} attachment - Discord attachment object\n * @returns {Object} - Validation result\n *\/\nfunction validateImage(attachment) {\n  const MAX_SIZE = 20 * 1024 * 1024; \/\/ 20MB limit\n  const result = {\n    valid: true,\n    errors: []\n  };\n  \/\/ Check if it's a supported image type\n  const isSupported = isSupportedImage(attachment);\n  if (!isSupported) {\n    result.valid = false;\n    result.errors.push(`Unsupported image format (${attachment.contentType || 'unknown type'})`);\n  }\n  \/\/ Check file size\n  if (attachment.size &amp;&amp; attachment.size &gt; MAX_SIZE) {\n    result.valid = false;\n    result.errors.push(`Image too large (${(attachment.size \/ 1024 \/ 1024).toFixed(2)}MB). Maximum size is 20MB`);\n  }\n  return result;\n}\n\/**\n * Get image information\n * @param {Object} attachment - Discord attachment object\n * @returns {Object} - Image information\n *\/\nfunction getImageInfo(attachment) {\n  return {\n    name: attachment.name || 'unknown',\n    size: attachment.size || 0,\n    contentType: attachment.contentType || guessMimeTypeFromUrl(attachment.url),\n    url: attachment.url,\n    width: attachment.width || null,\n    height: attachment.height || null,\n    extension: getFileExtension(attachment.name || attachment.url)\n  };\n}\nmodule.exports = {\n  isSupportedImage,\n  downloadImageAsBase64,\n  validateImage,\n  getImageInfo,\n  getFileExtension,\n  guessMimeTypeFromUrl,\n  SUPPORTED_IMAGE_TYPES\n};\" style=\"color:#D4D4D4\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Supported image types and their MIME types<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">SUPPORTED_IMAGE_TYPES<\/span><span style=\"color: #D4D4D4\"> = {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Common formats<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #CE9178\">&#039;image\/jpeg&#039;<\/span><span style=\"color: #9CDCFE\">:<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #CE9178\">&#039;.jpg&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;.jpeg&#039;<\/span><span style=\"color: #D4D4D4\">],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #CE9178\">&#039;image\/png&#039;<\/span><span style=\"color: #9CDCFE\">:<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #CE9178\">&#039;.png&#039;<\/span><span style=\"color: #D4D4D4\">],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #CE9178\">&#039;image\/gif&#039;<\/span><span style=\"color: #9CDCFE\">:<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #CE9178\">&#039;.gif&#039;<\/span><span style=\"color: #D4D4D4\">],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #CE9178\">&#039;image\/webp&#039;<\/span><span style=\"color: #9CDCFE\">:<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #CE9178\">&#039;.webp&#039;<\/span><span style=\"color: #D4D4D4\">],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #CE9178\">&#039;image\/bmp&#039;<\/span><span style=\"color: #9CDCFE\">:<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #CE9178\">&#039;.bmp&#039;<\/span><span style=\"color: #D4D4D4\">],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #CE9178\">&#039;image\/tiff&#039;<\/span><span style=\"color: #9CDCFE\">:<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #CE9178\">&#039;.tiff&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;.tif&#039;<\/span><span style=\"color: #D4D4D4\">],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #CE9178\">&#039;image\/svg+xml&#039;<\/span><span style=\"color: #9CDCFE\">:<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #CE9178\">&#039;.svg&#039;<\/span><span style=\"color: #D4D4D4\">],<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Additional formats<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #CE9178\">&#039;image\/x-icon&#039;<\/span><span style=\"color: #9CDCFE\">:<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #CE9178\">&#039;.ico&#039;<\/span><span style=\"color: #D4D4D4\">],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #CE9178\">&#039;image\/vnd.microsoft.icon&#039;<\/span><span style=\"color: #9CDCFE\">:<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #CE9178\">&#039;.ico&#039;<\/span><span style=\"color: #D4D4D4\">],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #CE9178\">&#039;image\/avif&#039;<\/span><span style=\"color: #9CDCFE\">:<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #CE9178\">&#039;.avif&#039;<\/span><span style=\"color: #D4D4D4\">],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #CE9178\">&#039;image\/heic&#039;<\/span><span style=\"color: #9CDCFE\">:<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #CE9178\">&#039;.heic&#039;<\/span><span style=\"color: #D4D4D4\">],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #CE9178\">&#039;image\/heif&#039;<\/span><span style=\"color: #9CDCFE\">:<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #CE9178\">&#039;.heif&#039;<\/span><span style=\"color: #D4D4D4\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Check if the attachment is a supported image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Object}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #6A9955\"> - Discord attachment object<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{boolean}<\/span><span style=\"color: #6A9955\"> - Whether the attachment is a supported image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">isSupportedImage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Check by content type first<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">contentType<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">contentType<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">contentType<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">toLowerCase<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">isSupported<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">Object<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">keys<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4FC1FF\">SUPPORTED_IMAGE_TYPES<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">includes<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">contentType<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">isSupported<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Fallback to filename extension check<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">name<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">extension<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">getFileExtension<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">name<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">isSupported<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">Object<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">values<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4FC1FF\">SUPPORTED_IMAGE_TYPES<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">some<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">extensions<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">=&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">extensions<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">includes<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">extension<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    );<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">isSupported<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Last resort: check URL extension<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">url<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">extension<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">getFileExtension<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">url<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">isSupported<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">Object<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">values<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4FC1FF\">SUPPORTED_IMAGE_TYPES<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">some<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">extensions<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">=&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">extensions<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">includes<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">extension<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    );<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">isSupported<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Get file extension from filename<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">filename<\/span><span style=\"color: #6A9955\"> - The filename<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> - File extension with dot (e.g., &#039;.jpg&#039;)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">getFileExtension<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">filename<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">filename<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #569CD6\">typeof<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">filename<\/span><span style=\"color: #D4D4D4\"> !== <\/span><span style=\"color: #CE9178\">&#039;string&#039;<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">lastDot<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">filename<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">lastIndexOf<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">lastDot<\/span><span style=\"color: #D4D4D4\"> === -<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">filename<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">substring<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">lastDot<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">toLowerCase<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Download image and convert to base64<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">imageUrl<\/span><span style=\"color: #6A9955\"> - URL of the image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Promise&lt;string&gt;}<\/span><span style=\"color: #6A9955\"> - Base64 encoded image data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">async<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">downloadImageAsBase64<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">imageUrl<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udce5 Downloading image: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">imageUrl<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">response<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">fetch<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">imageUrl<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">ok<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">throw<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`Failed to download image: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">status<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\"> <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">statusText<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Get the image data as an array buffer<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">arrayBuffer<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">arrayBuffer<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Convert to base64<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">base64<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">Buffer<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">from<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">arrayBuffer<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">toString<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;base64&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Get content type from response or guess from URL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">mimeType<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">headers<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">get<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;content-type&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">mimeType<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">mimeType<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">guessMimeTypeFromUrl<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">imageUrl<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u2705 Image downloaded successfully (<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">arrayBuffer<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">byteLength<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\"> bytes, <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">mimeType<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">)`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">base64:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">base64<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">mimeType:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">mimeType<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">size:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">arrayBuffer<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">byteLength<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    };<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;\u274c Error downloading image:&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">throw<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`Failed to download image: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Guess MIME type from URL extension<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">url<\/span><span style=\"color: #6A9955\"> - Image URL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> - Guessed MIME type<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">guessMimeTypeFromUrl<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">url<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">extension<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">getFileExtension<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">url<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">split<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;?&#039;<\/span><span style=\"color: #D4D4D4\">)[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">]); <\/span><span style=\"color: #6A9955\">\/\/ Remove query params<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #4FC1FF\">mimeType<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4FC1FF\">extensions<\/span><span style=\"color: #D4D4D4\">] <\/span><span style=\"color: #569CD6\">of<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Object<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">entries<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4FC1FF\">SUPPORTED_IMAGE_TYPES<\/span><span style=\"color: #D4D4D4\">)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">extensions<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">includes<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">extension<\/span><span style=\"color: #D4D4D4\">)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">mimeType<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;image\/jpeg&#039;<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #6A9955\">\/\/ Default fallback<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Validate image size and type<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Object}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #6A9955\"> - Discord attachment object<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Object}<\/span><span style=\"color: #6A9955\"> - Validation result<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">validateImage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">MAX_SIZE<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #B5CEA8\">1024<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #B5CEA8\">1024<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #6A9955\">\/\/ 20MB limit<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">result<\/span><span style=\"color: #D4D4D4\"> = {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">valid:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">errors:<\/span><span style=\"color: #D4D4D4\"> []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  };<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Check if it&#039;s a supported image type<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">isSupported<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">isSupportedImage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">isSupported<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">valid<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">errors<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">push<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`Unsupported image format (<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">contentType<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&#039;unknown type&#039;<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">)`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Check file size<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">size<\/span><span style=\"color: #D4D4D4\"> &amp;&amp; <\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">size<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #4FC1FF\">MAX_SIZE<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">valid<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">errors<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">push<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`Image too large (<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">size<\/span><span style=\"color: #D4D4D4\"> \/ <\/span><span style=\"color: #B5CEA8\">1024<\/span><span style=\"color: #D4D4D4\"> \/ <\/span><span style=\"color: #B5CEA8\">1024<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">toFixed<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">)<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">MB). Maximum size is 20MB`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Get image information<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Object}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #6A9955\"> - Discord attachment object<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Object}<\/span><span style=\"color: #6A9955\"> - Image information<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">getImageInfo<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">name:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">name<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&#039;unknown&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">size:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">size<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">contentType:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">contentType<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #DCDCAA\">guessMimeTypeFromUrl<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">url<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">url:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">url<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">width:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">width<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">height:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">height<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">extension:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">getFileExtension<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">name<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">url<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  };<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">module<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4EC9B0\">exports<\/span><span style=\"color: #D4D4D4\"> = {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">isSupportedImage<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">downloadImageAsBase64<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">validateImage<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">getImageInfo<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">getFileExtension<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">guessMimeTypeFromUrl<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">SUPPORTED_IMAGE_TYPES<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Here is <strong>\u201cutils\/aiResponse.js\u201d<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2\"><span style=\"align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JavaScript<\/span><span role=\"button\" data-code=\"const memory = require('.\/memory.js');\nconst search = require('.\/search.js');\nconst imageRead = require('.\/imageRead.js');\n\/**\n * Generate an AI response with image analysis\n * @param {string} userMessage - The user's message\n * @param {Object} model - The Gemini AI model instance\n * @param {string} systemPrompt - The system prompt with rules\n * @param {string} userId - Discord user ID for memory context\n * @param {Array} imageAttachments - Array of Discord image attachments\n * @returns {Promise&lt;string&gt;} - The AI response\n *\/\nasync function generateAIResponseWithImages(userMessage, model, systemPrompt, userId, imageAttachments) {\n  try {\n    \/\/ Clean user message (remove mentions)\n    const cleanedUserMessage = cleanUserMessage(userMessage);\n    \/\/ Get memory context for this user\n    const memoryContext = memory.formatMemoryForAI(userId);\n    \/\/ Process images if any\n    let imageContext = '';\n    const imageParts = [];\n    if (imageAttachments &amp;&amp; imageAttachments.length &gt; 0) {\n      console.log(`\ud83d\uddbc\ufe0f Processing ${imageAttachments.length} image(s)`);\n      for (const attachment of imageAttachments) {\n        \/\/ Validate image\n        const validation = imageRead.validateImage(attachment);\n        if (!validation.valid) {\n          console.log(`\u274c Invalid image: ${validation.errors.join(', ')}`);\n          continue;\n        }\n        try {\n          \/\/ Download and convert the image\n          const imageData = await imageRead.downloadImageAsBase64(attachment.url);\n          const imageInfo = imageRead.getImageInfo(attachment);\n          \/\/ Add image to Gemini parts\n          imageParts.push({\n            inlineData: {\n              data: imageData.base64,\n              mimeType: imageData.mimeType\n            }\n          });\n          \/\/ Add image context for AI\n          imageContext += `\\nImage attached: ${imageInfo.name} (${imageInfo.extension}, ${(imageInfo.size \/ 1024).toFixed(1)}KB)`;\n        } catch (error) {\n          console.error(`\u274c Error processing image ${attachment.name}:`, error);\n          imageContext += `\\nNote: Could not process image ${attachment.name || 'unknown'}`;\n        }\n      }\n    }\n    \/\/ Check if search is needed and perform search\n    let searchContext = '';\n    const needsSearch = search.detectSearchIntent(cleanedUserMessage);\n    if (needsSearch) {\n      console.log(`\ud83d\udd0d Search detected for: &quot;${cleanedUserMessage}&quot;`);\n      const searchResults = await search.searchAndFormat(cleanedUserMessage);\n      if (searchResults.success) {\n        searchContext = searchResults.context;\n        console.log(`\u2705 Search completed successfully`);\n      } else {\n        console.log(`\u274c Search failed: ${searchResults.error}`);\n      }\n    }\n    \/\/ Create the full prompt with all contexts\n    const textPrompt = `${systemPrompt}${memoryContext}${searchContext}${imageContext}\\n\\nCurrent user message: ${cleanedUserMessage}`;\n    \/\/ Prepare content for Gemini\n    const content = [{ text: textPrompt }, ...imageParts];\n    \/\/ Generate response from AI\n    const result = await model.generateContent(content);\n    const aiResponse = result.response.text();\n    \/\/ Clean and validate response\n    const cleanedResponse = cleanResponse(aiResponse);\n    \/\/ Store this conversation in memory\n    memory.addToMemory(userId, cleanedUserMessage, cleanedResponse);\n    return cleanedResponse;\n  } catch (error) {\n    console.error('AI Response Error:', error);\n    throw new Error('Failed to generate AI response');\n  }\n}\n\/**\n * Generate AI response using Gemini model with memory context (text only)\n * @param {string} userMessage - The user's message\n * @param {Object} model - The Gemini AI model instance\n * @param {string} systemPrompt - The system prompt with rules\n * @param {string} userId - Discord user ID for memory context\n * @returns {Promise&lt;string&gt;} - The AI response\n *\/\nasync function generateAIResponse(userMessage, model, systemPrompt, userId) {\n  try {\n    \/\/ Clean user message (remove mentions)\n    const cleanedUserMessage = cleanUserMessage(userMessage);\n    \/\/ Get memory context for this user\n    const memoryContext = memory.formatMemoryForAI(userId);\n    \/\/ Check if search is needed and perform search\n    let searchContext = '';\n    const needsSearch = search.detectSearchIntent(cleanedUserMessage);\n    if (needsSearch) {\n      console.log(`\ud83d\udd0d Search detected for: &quot;${cleanedUserMessage}&quot;`);\n      const searchResults = await search.searchAndFormat(cleanedUserMessage);\n      if (searchResults.success) {\n        searchContext = searchResults.context;\n        console.log(`\u2705 Search completed successfully`);\n      } else {\n        console.log(`\u274c Search failed: ${searchResults.error}`);\n      }\n    }\n    \/\/ Create the full prompt with system prompt, memory context, search context, and current message\n    const fullPrompt = `${systemPrompt}${memoryContext}${searchContext}\\n\\nCurrent user message: ${cleanedUserMessage}`;\n    \/\/ Generate response from AI\n    const result = await model.generateContent(fullPrompt);\n    const aiResponse = result.response.text();\n    \/\/ Clean and validate response\n    const cleanedResponse = cleanResponse(aiResponse);\n    \/\/ Store this conversation in memory\n    memory.addToMemory(userId, cleanedUserMessage, cleanedResponse);\n    return cleanedResponse;\n  } catch (error) {\n    console.error('AI Response Error:', error);\n    throw new Error('Failed to generate AI response');\n  }\n}\n\/**\n * Clean user message (remove mentions and extra whitespace)\n * @param {string} message - Raw user message\n * @returns {string} - Cleaned message\n *\/\nfunction cleanUserMessage(message) {\n  if (!message || typeof message !== 'string') {\n    return '';\n  }\n  \/\/ Remove mentions (like &lt;@123456789&gt;)\n  let cleaned = message.replace(\/&lt;@!?\\d+&gt;\/g, '').trim();\n  \/\/ Remove extra whitespace\n  cleaned = cleaned.replace(\/\\s+\/g, ' ').trim();\n  return cleaned || 'hi';\n}\n\/**\n * Clean and validate AI response\n * @param {string} response - Raw AI response\n * @returns {string} - Cleaned response\n *\/\nfunction cleanResponse(response) {\n  if (!response || typeof response !== 'string') {\n    return 'Sorry, I couldn\\'t generate a proper response.';\n  }\n  \/\/ Trim whitespace\n  let cleaned = response.trim();\n  \/\/ Ensure response is not too long for Discord (2000 char limit)\n  if (cleaned.length &gt; 1900) {\n    cleaned = cleaned.substring(0, 1900) + '...';\n  }\n  \/\/ Remove any potential harmful content markers\n  cleaned = cleaned.replace(\/\\[HARMFUL\\]|\\[NSFW\\]|\\[INAPPROPRIATE\\]\/gi, '');\n  return cleaned || 'Sorry, I couldn\\'t generate a response.';\n}\n\/**\n * Build system prompt from config\n * @param {Object} config - Configuration object with prompt and rules\n * @returns {string} - Complete system prompt\n *\/\nfunction buildSystemPrompt(config) {\n  let systemPrompt = config.prompt || 'You are a helpful AI assistant.';\n  if (config.rules &amp;&amp; Array.isArray(config.rules)) {\n    systemPrompt += '\\n\\nRules you must follow:\\n';\n    config.rules.forEach((rule, index) =&gt; {\n      systemPrompt += `${index + 1}. ${rule}\\n`;\n    });\n  }\n  return systemPrompt;\n}\nmodule.exports = {\n  generateAIResponse,\n  generateAIResponseWithImages,\n  cleanResponse,\n  cleanUserMessage,\n  buildSystemPrompt\n};\" style=\"color:#D4D4D4\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\"><code><span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">memory<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/memory.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">search<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/search.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">imageRead<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/imageRead.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Generate an AI response with image analysis<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #6A9955\"> - The user&#039;s message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Object}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #6A9955\"> - The Gemini AI model instance<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #6A9955\"> - The system prompt with rules<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #6A9955\"> - Discord user ID for memory context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Array}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #6A9955\"> - Array of Discord image attachments<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Promise&lt;string&gt;}<\/span><span style=\"color: #6A9955\"> - The AI response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">async<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">generateAIResponseWithImages<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Clean user message (remove mentions)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">cleanUserMessage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Get memory context for this user<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">memoryContext<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">memory<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">formatMemoryForAI<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Process images if any<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageContext<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">imageParts<\/span><span style=\"color: #D4D4D4\"> = [];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\"> &amp;&amp; <\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\uddbc\ufe0f Processing <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\"> image(s)`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">attachment<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">of<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Validate image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">validation<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">imageRead<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">validateImage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">validation<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">valid<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u274c Invalid image: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">validation<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">errors<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">join<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;, &#039;<\/span><span style=\"color: #D4D4D4\">)<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #C586C0\">continue<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #6A9955\">\/\/ Download and convert the image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">imageData<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageRead<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">downloadImageAsBase64<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">url<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">imageInfo<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">imageRead<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getImageInfo<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #6A9955\">\/\/ Add image to Gemini parts<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">imageParts<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">push<\/span><span style=\"color: #D4D4D4\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">inlineData:<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">              <\/span><span style=\"color: #9CDCFE\">data:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageData<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">base64<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">              <\/span><span style=\"color: #9CDCFE\">mimeType:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageData<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">mimeType<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #6A9955\">\/\/ Add image context for AI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">imageContext<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">Image attached: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">imageInfo<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">name<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\"> (<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">imageInfo<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">extension<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">, <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">imageInfo<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">size<\/span><span style=\"color: #D4D4D4\"> \/ <\/span><span style=\"color: #B5CEA8\">1024<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">toFixed<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">)<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">KB)`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u274c Error processing image <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">name<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">:`<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">imageContext<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">Note: Could not process image <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">name<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&#039;unknown&#039;<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Check if search is needed and perform search<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">searchContext<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">needsSearch<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">search<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">detectSearchIntent<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">needsSearch<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udd0d Search detected for: &quot;<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">&quot;`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">searchResults<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">search<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">searchAndFormat<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">searchResults<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">success<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">searchContext<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">searchResults<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u2705 Search completed successfully`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      } <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u274c Search failed: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">searchResults<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Create the full prompt with all contexts<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">textPrompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #569CD6\">}${<\/span><span style=\"color: #9CDCFE\">memoryContext<\/span><span style=\"color: #569CD6\">}${<\/span><span style=\"color: #9CDCFE\">searchContext<\/span><span style=\"color: #569CD6\">}${<\/span><span style=\"color: #9CDCFE\">imageContext<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n\\n<\/span><span style=\"color: #CE9178\">Current user message: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Prepare content for Gemini<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">content<\/span><span style=\"color: #D4D4D4\"> = [{ <\/span><span style=\"color: #9CDCFE\">text:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">textPrompt<\/span><span style=\"color: #D4D4D4\"> }, ...<\/span><span style=\"color: #9CDCFE\">imageParts<\/span><span style=\"color: #D4D4D4\">];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Generate response from AI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">result<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">generateContent<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">aiResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">text<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Clean and validate response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">cleanedResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">cleanResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">aiResponse<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Store this conversation in memory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">memory<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">addToMemory<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">cleanedResponse<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleanedResponse<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;AI Response Error:&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">throw<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;Failed to generate AI response&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Generate AI response using Gemini model with memory context (text only)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #6A9955\"> - The user&#039;s message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Object}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #6A9955\"> - The Gemini AI model instance<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #6A9955\"> - The system prompt with rules<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #6A9955\"> - Discord user ID for memory context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Promise&lt;string&gt;}<\/span><span style=\"color: #6A9955\"> - The AI response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">async<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">generateAIResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Clean user message (remove mentions)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">cleanUserMessage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Get memory context for this user<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">memoryContext<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">memory<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">formatMemoryForAI<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Check if search is needed and perform search<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">searchContext<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">needsSearch<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">search<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">detectSearchIntent<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">needsSearch<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udd0d Search detected for: &quot;<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">&quot;`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">searchResults<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">search<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">searchAndFormat<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">searchResults<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">success<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">searchContext<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">searchResults<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u2705 Search completed successfully`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      } <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u274c Search failed: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">searchResults<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Create the full prompt with system prompt, memory context, search context, and current message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">fullPrompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #569CD6\">}${<\/span><span style=\"color: #9CDCFE\">memoryContext<\/span><span style=\"color: #569CD6\">}${<\/span><span style=\"color: #9CDCFE\">searchContext<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n\\n<\/span><span style=\"color: #CE9178\">Current user message: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Generate response from AI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">result<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">generateContent<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">fullPrompt<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">aiResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">text<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Clean and validate response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">cleanedResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">cleanResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">aiResponse<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Store this conversation in memory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">memory<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">addToMemory<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">cleanedResponse<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleanedResponse<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;AI Response Error:&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">throw<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;Failed to generate AI response&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Clean user message (remove mentions and extra whitespace)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #6A9955\"> - Raw user message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> - Cleaned message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">cleanUserMessage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #569CD6\">typeof<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\"> !== <\/span><span style=\"color: #CE9178\">&#039;string&#039;<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Remove mentions (like &lt;@123456789&gt;)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">replace<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #D16969\">\/&lt;@!<\/span><span style=\"color: #D7BA7D\">?<\/span><span style=\"color: #D16969\">\\d<\/span><span style=\"color: #D7BA7D\">+<\/span><span style=\"color: #D16969\">&gt;\/<\/span><span style=\"color: #569CD6\">g<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">trim<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Remove extra whitespace<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">replace<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #D16969\">\/\\s<\/span><span style=\"color: #D7BA7D\">+<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #569CD6\">g<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039; &#039;<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">trim<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&#039;hi&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Clean and validate AI response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #6A9955\"> - Raw AI response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> - Cleaned response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">cleanResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #569CD6\">typeof<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\"> !== <\/span><span style=\"color: #CE9178\">&#039;string&#039;<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;Sorry, I couldn<\/span><span style=\"color: #D7BA7D\">\\&#039;<\/span><span style=\"color: #CE9178\">t generate a proper response.&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Trim whitespace<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">trim<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Ensure response is not too long for Discord (2000 char limit)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #B5CEA8\">1900<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">substring<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1900<\/span><span style=\"color: #D4D4D4\">) + <\/span><span style=\"color: #CE9178\">&#039;...&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Remove any potential harmful content markers<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">replace<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #D7BA7D\">\\[<\/span><span style=\"color: #D16969\">HARMFUL<\/span><span style=\"color: #D7BA7D\">\\]<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D7BA7D\">\\[<\/span><span style=\"color: #D16969\">NSFW<\/span><span style=\"color: #D7BA7D\">\\]<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D7BA7D\">\\[<\/span><span style=\"color: #D16969\">INAPPROPRIATE<\/span><span style=\"color: #D7BA7D\">\\]<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #569CD6\">gi<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&#039;Sorry, I couldn<\/span><span style=\"color: #D7BA7D\">\\&#039;<\/span><span style=\"color: #CE9178\">t generate a response.&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Build system prompt from config<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Object}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #6A9955\"> - Configuration object with prompt and rules<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> - Complete system prompt<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">buildSystemPrompt<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&#039;You are a helpful AI assistant.&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">rules<\/span><span style=\"color: #D4D4D4\"> &amp;&amp; <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">isArray<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">rules<\/span><span style=\"color: #D4D4D4\">)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D7BA7D\">\\n\\n<\/span><span style=\"color: #CE9178\">Rules you must follow:<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">rules<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">forEach<\/span><span style=\"color: #D4D4D4\">((<\/span><span style=\"color: #9CDCFE\">rule<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">index<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">index<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">. <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">rule<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">module<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4EC9B0\">exports<\/span><span style=\"color: #D4D4D4\"> = {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">generateAIResponse<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">generateAIResponseWithImages<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleanResponse<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleanUserMessage<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">buildSystemPrompt<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Finally, here is the <strong>\u201cindex.js\u201d<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2\"><span style=\"align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JavaScript<\/span><span role=\"button\" data-code=\"\/\/ Import packages\nconst { Client, GatewayIntentBits } = require('discord.js');\nconst { GoogleGenerativeAI } = require('@google\/generative-ai');\nconst dotenv = require('dotenv');\nconst fs = require('fs');\n\/\/ Import utilities\nconst aiResponse = require('.\/utils\/aiResponse.js');\nconst imageRead = require('.\/utils\/imageRead.js');\n\/\/ Load environment variables\ndotenv.config();\n\/\/ Load configuration\nconst config = JSON.parse(fs.readFileSync('.\/config.json', 'utf8'));\n\/\/ Initialize Gemini AI\nconst genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);\nconst model = genAI.getGenerativeModel({ model: &quot;gemini-2.0-flash&quot; });\n\/\/ Build system prompt from config\nconst systemPrompt = aiResponse.buildSystemPrompt(config);\n\/\/ Create Discord client\nconst client = new Client({\n    intents: [\n        GatewayIntentBits.Guilds,\n        GatewayIntentBits.GuildMessages,\n        GatewayIntentBits.MessageContent,\n    ],\n});\n\/\/ Bot ready event\nclient.once('ready', () =&gt; {\n    console.log('CybranceBot is online!');\n    console.log(`System prompt loaded: ${systemPrompt.substring(0, 100)}...`);\n});\n\/\/ Track processed messages to prevent duplicates\nconst processedMessages = new Set();\n\/\/ Message event handler\nclient.on('messageCreate', async (message) =&gt; {\n    \/\/ Ignore bot messages\n    if (message.author.bot) return;\n    \/\/ Only respond when mentioned\n    if (!message.mentions.has(client.user)) return;\n    \/\/ Prevent duplicate processing\n    if (processedMessages.has(message.id)) return;\n    processedMessages.add(message.id);\n    \/\/ Clean up old message IDs (keep only last 100)\n    if (processedMessages.size &gt; 100) {\n        const oldIds = Array.from(processedMessages).slice(0, processedMessages.size - 100);\n        oldIds.forEach(id =&gt; processedMessages.delete(id));\n    }\n    try {\n        console.log(`Processing message from ${message.author.username}: &quot;${message.content}&quot;`);\n        \/\/ Check for image attachments\n        console.log(`\ud83d\udcce Total attachments: ${message.attachments.size}`);\n        \/\/ Convert Discord Collection to Array first\n        const allAttachments = Array.from(message.attachments.values());\n        console.log(`\ud83d\udccb Converted to array: ${allAttachments.length} attachments`);\n        const imageAttachments = allAttachments.filter(attachment =&gt; {\n            console.log(`\ud83d\udd0d Checking attachment: ${attachment.name} (${attachment.contentType})`);\n            const isSupported = imageRead.isSupportedImage(attachment);\n            console.log(`\ud83d\udccb Is supported: ${isSupported}`);\n            return isSupported;\n        });\n        console.log(`\ud83d\uddbc\ufe0f Image attachments found: ${imageAttachments.length}`);\n        let response;\n        if (imageAttachments.length &gt; 0) {\n            \/\/ Handle message with images\n            console.log(`\ud83d\udccb Processing ${imageAttachments.length} image attachments`);\n            console.log(`\ud83d\udccb First attachment:`, {\n                name: imageAttachments[0].name,\n                contentType: imageAttachments[0].contentType,\n                size: imageAttachments[0].size\n            });\n            response = await aiResponse.generateAIResponseWithImages(\n                message.content,\n                model,\n                systemPrompt,\n                message.author.id,\n                imageAttachments\n            );\n        } else {\n            \/\/ Handle text-only message\n            response = await aiResponse.generateAIResponse(\n                message.content,\n                model,\n                systemPrompt,\n                message.author.id\n            );\n        }\n        \/\/ Send response\n        await message.reply(response);\n        console.log(`\u2705 Responded to ${message.author.username}`);\n    } catch (error) {\n        console.error('\u274c Error:', error);\n        await message.reply('Sorry, I had an error processing your message.');\n    }\n});\n\/\/ Login to Discord\nclient.login(process.env.DISCORD_BOT_TOKEN);\" style=\"color:#D4D4D4\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ Import packages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #4FC1FF\">Client<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4FC1FF\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\"> } = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;discord.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #4FC1FF\">GoogleGenerativeAI<\/span><span style=\"color: #D4D4D4\"> } = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;@google\/generative-ai&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">dotenv<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;dotenv&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">fs<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;fs&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Import utilities<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">aiResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/utils\/aiResponse.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">imageRead<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/utils\/imageRead.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Load environment variables<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">dotenv<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">config<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Load configuration<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">config<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #4FC1FF\">JSON<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">parse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">fs<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">readFileSync<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/config.json&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;utf8&#039;<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Initialize Gemini AI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">genAI<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">GoogleGenerativeAI<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">process<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">env<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4FC1FF\">GEMINI_API_KEY<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">model<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">genAI<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getGenerativeModel<\/span><span style=\"color: #D4D4D4\">({ <\/span><span style=\"color: #9CDCFE\">model:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;gemini-2.0-flash&quot;<\/span><span style=\"color: #D4D4D4\"> });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Build system prompt from config<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">systemPrompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">aiResponse<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">buildSystemPrompt<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Create Discord client<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">client<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Client<\/span><span style=\"color: #D4D4D4\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">intents:<\/span><span style=\"color: #D4D4D4\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Guilds<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">GuildMessages<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">MessageContent<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    ],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Bot ready event<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">once<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;ready&#039;<\/span><span style=\"color: #D4D4D4\">, () <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;CybranceBot is online!&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`System prompt loaded: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">substring<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #D4D4D4\">)<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">...`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Track processed messages to prevent duplicates<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">processedMessages<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Set<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Message event handler<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">on<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;messageCreate&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">async<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Ignore bot messages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">bot<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Only respond when mentioned<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">mentions<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">has<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">user<\/span><span style=\"color: #D4D4D4\">)) <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Prevent duplicate processing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">has<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">)) <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">add<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Clean up old message IDs (keep only last 100)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">size<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">oldIds<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">from<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">slice<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">size<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">oldIds<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">forEach<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">delete<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`Processing message from <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">username<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">: &quot;<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">&quot;`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Check for image attachments<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udcce Total attachments: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">attachments<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">size<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Convert Discord Collection to Array first<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">allAttachments<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">from<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">attachments<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">values<\/span><span style=\"color: #D4D4D4\">());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udccb Converted to array: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">allAttachments<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\"> attachments`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">imageAttachments<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">allAttachments<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">filter<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udd0d Checking attachment: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">name<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\"> (<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">contentType<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">)`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">isSupported<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">imageRead<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">isSupportedImage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udccb Is supported: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">isSupported<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">isSupported<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\uddbc\ufe0f Image attachments found: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #6A9955\">\/\/ Handle message with images<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udccb Processing <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\"> image attachments`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udccb First attachment:`<\/span><span style=\"color: #D4D4D4\">, {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">name:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">].<\/span><span style=\"color: #9CDCFE\">name<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">contentType:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">].<\/span><span style=\"color: #9CDCFE\">contentType<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">size:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">].<\/span><span style=\"color: #9CDCFE\">size<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">aiResponse<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">generateAIResponseWithImages<\/span><span style=\"color: #D4D4D4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            );<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        } <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #6A9955\">\/\/ Handle text-only message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">aiResponse<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">generateAIResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">id<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            );<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Send response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">reply<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u2705 Responded to <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">username<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;\u274c Error:&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">reply<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;Sorry, I had an error processing your message.&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Login to Discord<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">login<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">process<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">env<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4FC1FF\">DISCORD_BOT_TOKEN<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>You can now start and test your bot by uploading an image and telling it to describe that image.<\/p>\n\n\n\n<p><strong>An Example:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"418\" src=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im7-1024x418.png\" alt=\"Screenshot of A Discord Chatbot Can Read Images\" class=\"wp-image-3206\" srcset=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im7-1024x418.png 1024w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im7-300x123.png 300w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im7-768x314.png 768w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im7-512x209.png 512w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im7-920x376.png 920w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im7.png 1239w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">8. <strong>Adding The Ability For Your Discord Bot to Generate Images<\/strong><\/h2>\n\n\n\n<p>In this part, you will be adding the ability for your AI bot to generate an image. You might be saying, \u201cThat\u2019s impossible\u201d, but with <a href=\"https:\/\/pollinations.ai\/\">Pollinations AI<\/a>, you will make it possible.&nbsp;<\/p>\n\n\n\n<p>Pollinations AI provides complete, free text-to-image generation, with no limits. Also, you don\u2019t need any API key for it, so don\u2019t worry.<\/p>\n\n\n\n<p>You will use <strong>\u201cutils\/imageGenerate.js\u201d<\/strong> for the image generation function, and you are also going to update <strong>\u201cutils\/aiResponse.js\u201d<\/strong> to handle Image generation requests and add it to the context. You will also update <strong>\u201cindex.js\u201d<\/strong> to handle the user requests correctly.<\/p>\n\n\n\n<p>The <strong>\u201cimageGenerate.js\u201d<\/strong> should look like this:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2\"><span style=\"align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JavaScript<\/span><span role=\"button\" data-code=\"\/\/ Image Generation Utility\n\/\/ Handles AI image generation from text prompts\n\/**\n * Image generation using Pollinations API (free, no API key required)\n *\/\nconst IMAGE_SERVICE = 'Pollinations AI';\n\/**\n * Detect if the user message is requesting image generation\n * @param {string} message - User's message\n * @returns {boolean} - Whether image generation is requested\n *\/\nfunction detectImageGenerationIntent(message) {\n  if (!message || typeof message !== 'string') {\n    return false;\n  }\n  const generationKeywords = [\n    \/\/ Direct generation requests\n    'generate image', 'create image', 'make image', 'draw image',\n    'generate picture', 'create picture', 'make picture', 'draw picture',\n    \/\/ Art requests\n    'generate art', 'create art', 'make art', 'draw art',\n    'paint', 'sketch', 'illustrate',\n    \/\/ Specific commands\n    'image of', 'picture of', 'drawing of', 'artwork of',\n    'show me', 'visualize', 'render',\n    \/\/ Creative requests\n    'design', 'concept art', 'digital art'\n  ];\n  const lowerMessage = message.toLowerCase();\n  \/\/ Check for generation keywords\n  const hasGenerationKeywords = generationKeywords.some(keyword =&gt;\n    lowerMessage.includes(keyword)\n  );\n  \/\/ Check for command patterns\n  const commandPatterns = [\n    \/(?:generate|create|make|draw|paint|sketch)\\s+(?:an?|some)?\\s*(?:image|picture|art|drawing)\/i,\n    \/(?:image|picture|art|drawing)\\s+of\\s+\/i,\n    \/show\\s+me\\s+(?:an?|some)?\\s*(?:image|picture)\/i\n  ];\n  const hasCommandPattern = commandPatterns.some(pattern =&gt;\n    pattern.test(message)\n  );\n  return hasGenerationKeywords || hasCommandPattern;\n}\n\/**\n * Extract prompt from user message\n * @param {string} message - User's message\n * @returns {string} - Cleaned prompt for image generation\n *\/\nfunction extractPrompt(message) {\n  if (!message || typeof message !== 'string') {\n    return 'a beautiful landscape';\n  }\n  let prompt = message.toLowerCase();\n  \/\/ Remove common prefixes\n  const prefixesToRemove = [\n    'generate an image of',\n    'generate image of',\n    'create an image of',\n    'create image of',\n    'make an image of',\n    'make image of',\n    'draw an image of',\n    'draw image of',\n    'generate a picture of',\n    'generate picture of',\n    'create a picture of',\n    'create picture of',\n    'make a picture of',\n    'make picture of',\n    'draw a picture of',\n    'draw a picture of',\n    'generate art of',\n    'create art of',\n    'make art of',\n    'draw art of',\n    'an image of',\n    'a picture of',\n    'image of',\n    'picture of',\n    'drawing of',\n    'artwork of',\n    'show me',\n    'visualize',\n    'render',\n    'paint',\n    'sketch',\n    'illustrate',\n    'design'\n  ];\n  \/\/ Remove prefixes\n  for (const prefix of prefixesToRemove) {\n    if (prompt.startsWith(prefix)) {\n      prompt = prompt.substring(prefix.length).trim();\n      break;\n    }\n  }\n  \/\/ Remove articles at the beginning\n  prompt = prompt.replace(\/^(a|an|the)\\s+\/i, '');\n  \/\/ Clean up\n  prompt = prompt.trim();\n  \/\/ Fallback if prompt is empty\n  if (!prompt || prompt.length &lt; 3) {\n    return 'a beautiful landscape';\n  }\n  return prompt;\n}\n\/**\n * Generate image using Pollinations API (free, no API key required)\n * @param {string} prompt - Text prompt for image generation\n * @returns {Promise&lt;Object&gt;} - Generated image data\n *\/\nasync function generateImage(prompt) {\n  try {\n    console.log(`\ud83d\uddbc\ufe0f Generating image with prompt: &quot;${prompt}&quot;`);\n    console.log(`\ud83c\udf38 Using Pollinations API (free, no API key required)`);\n    \/\/ Pollinations API - completely free, no API key needed\n    const encodedPrompt = encodeURIComponent(prompt);\n    const imageUrl = `https:\/\/image.pollinations.ai\/prompt\/${encodedPrompt}?width=512&amp;height=512&amp;nologo=true`;\n    console.log(`\ud83d\udd17 Fetching from: ${imageUrl}`);\n    const response = await fetch(imageUrl);\n    if (!response.ok) {\n      throw new Error(`Pollinations API error: ${response.status} ${response.statusText}`);\n    }\n    const imageBuffer = await response.arrayBuffer();\n    if (!imageBuffer || imageBuffer.byteLength === 0) {\n      throw new Error('Received empty image data from Pollinations');\n    }\n    console.log(`\u2705 Image generated successfully (${imageBuffer.byteLength} bytes)`);\n    return {\n      success: true,\n      imageBuffer: Buffer.from(imageBuffer),\n      prompt: prompt,\n      model: 'Pollinations AI',\n      size: imageBuffer.byteLength\n    };\n  } catch (error) {\n    console.error('\u274c Image generation error:', error);\n    return {\n      success: false,\n      error: error.message,\n      prompt: prompt\n    };\n  }\n}\n\/**\n * Generate image and format for Discord\n * @param {string} userMessage - User's message\n * @returns {Promise&lt;Object&gt;} - Formatted image result\n *\/\nasync function generateAndFormat(userMessage) {\n  try {\n    \/\/ Extract prompt from user message\n    const prompt = extractPrompt(userMessage);\n    console.log(`\ud83d\udd0d Extracted prompt: &quot;${prompt}&quot;`);\n    \/\/ Generate image\n    const result = await generateImage(prompt);\n    if (result.success) {\n      return {\n        success: true,\n        prompt: prompt,\n        imageBuffer: result.imageBuffer,\n        filename: `generated_${Date.now()}.png`,\n        size: result.size\n      };\n    } else {\n      return {\n        success: false,\n        prompt: prompt,\n        error: result.error\n      };\n    }\n  } catch (error) {\n    console.error('\u274c Image generation and formatting error:', error);\n    return {\n      success: false,\n      error: error.message\n    };\n  }\n}\nmodule.exports = {\n  detectImageGenerationIntent,\n  extractPrompt,\n  generateImage,\n  generateAndFormat,\n};\" style=\"color:#D4D4D4\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ Image Generation Utility<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Handles AI image generation from text prompts<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Image generation using Pollinations API (free, no API key required)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">IMAGE_SERVICE<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&#039;Pollinations AI&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Detect if the user message is requesting image generation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #6A9955\"> - User&#039;s message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{boolean}<\/span><span style=\"color: #6A9955\"> - Whether image generation is requested<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">detectImageGenerationIntent<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #569CD6\">typeof<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\"> !== <\/span><span style=\"color: #CE9178\">&#039;string&#039;<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">generationKeywords<\/span><span style=\"color: #D4D4D4\"> = [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Direct generation requests<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;generate image&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;create image&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;make image&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;draw image&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;generate picture&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;create picture&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;make picture&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;draw picture&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Art requests<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;generate art&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;create art&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;make art&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;draw art&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;paint&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;sketch&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;illustrate&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Specific commands<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;image of&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;picture of&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;drawing of&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;artwork of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;show me&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;visualize&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;render&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Creative requests<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;design&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;concept art&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;digital art&#039;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  ];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">lowerMessage<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">toLowerCase<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Check for generation keywords<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">hasGenerationKeywords<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">generationKeywords<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">some<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">keyword<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">=&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">lowerMessage<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">includes<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">keyword<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  );<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Check for command patterns<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">commandPatterns<\/span><span style=\"color: #D4D4D4\"> = [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #CE9178\">(?:<\/span><span style=\"color: #D16969\">generate<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">create<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">make<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">draw<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">paint<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">sketch<\/span><span style=\"color: #CE9178\">)<\/span><span style=\"color: #D16969\">\\s<\/span><span style=\"color: #D7BA7D\">+<\/span><span style=\"color: #CE9178\">(?:<\/span><span style=\"color: #D16969\">an<\/span><span style=\"color: #D7BA7D\">?<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">some<\/span><span style=\"color: #CE9178\">)<\/span><span style=\"color: #D7BA7D\">?<\/span><span style=\"color: #D16969\">\\s<\/span><span style=\"color: #D7BA7D\">*<\/span><span style=\"color: #CE9178\">(?:<\/span><span style=\"color: #D16969\">image<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">picture<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">art<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">drawing<\/span><span style=\"color: #CE9178\">)<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #569CD6\">i<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #CE9178\">(?:<\/span><span style=\"color: #D16969\">image<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">picture<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">art<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">drawing<\/span><span style=\"color: #CE9178\">)<\/span><span style=\"color: #D16969\">\\s<\/span><span style=\"color: #D7BA7D\">+<\/span><span style=\"color: #D16969\">of\\s<\/span><span style=\"color: #D7BA7D\">+<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #569CD6\">i<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #D16969\">\/show\\s<\/span><span style=\"color: #D7BA7D\">+<\/span><span style=\"color: #D16969\">me\\s<\/span><span style=\"color: #D7BA7D\">+<\/span><span style=\"color: #CE9178\">(?:<\/span><span style=\"color: #D16969\">an<\/span><span style=\"color: #D7BA7D\">?<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">some<\/span><span style=\"color: #CE9178\">)<\/span><span style=\"color: #D7BA7D\">?<\/span><span style=\"color: #D16969\">\\s<\/span><span style=\"color: #D7BA7D\">*<\/span><span style=\"color: #CE9178\">(?:<\/span><span style=\"color: #D16969\">image<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">picture<\/span><span style=\"color: #CE9178\">)<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #569CD6\">i<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  ];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">hasCommandPattern<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">commandPatterns<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">some<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">pattern<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">=&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">pattern<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">test<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  );<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">hasGenerationKeywords<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #9CDCFE\">hasCommandPattern<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Extract prompt from user message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #6A9955\"> - User&#039;s message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> - Cleaned prompt for image generation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">extractPrompt<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #569CD6\">typeof<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\"> !== <\/span><span style=\"color: #CE9178\">&#039;string&#039;<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;a beautiful landscape&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">toLowerCase<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Remove common prefixes<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">prefixesToRemove<\/span><span style=\"color: #D4D4D4\"> = [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;generate an image of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;generate image of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;create an image of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;create image of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;make an image of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;make image of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;draw an image of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;draw image of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;generate a picture of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;generate picture of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;create a picture of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;create picture of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;make a picture of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;make picture of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;draw a picture of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;draw a picture of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;generate art of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;create art of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;make art of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;draw art of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;an image of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;a picture of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;image of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;picture of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;drawing of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;artwork of&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;show me&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;visualize&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;render&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;paint&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;sketch&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;illustrate&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#039;design&#039;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  ];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Remove prefixes<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">prefix<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">of<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">prefixesToRemove<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">startsWith<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">prefix<\/span><span style=\"color: #D4D4D4\">)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">substring<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">prefix<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">trim<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">break<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Remove articles at the beginning<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">replace<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #DCDCAA\">^<\/span><span style=\"color: #CE9178\">(<\/span><span style=\"color: #D16969\">a<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">an<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D16969\">the<\/span><span style=\"color: #CE9178\">)<\/span><span style=\"color: #D16969\">\\s<\/span><span style=\"color: #D7BA7D\">+<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #569CD6\">i<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Clean up<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">trim<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Fallback if prompt is empty<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;a beautiful landscape&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Generate image using Pollinations API (free, no API key required)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #6A9955\"> - Text prompt for image generation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Promise&lt;Object&gt;}<\/span><span style=\"color: #6A9955\"> - Generated image data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">async<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">generateImage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\uddbc\ufe0f Generating image with prompt: &quot;<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">&quot;`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83c\udf38 Using Pollinations API (free, no API key required)`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Pollinations API - completely free, no API key needed<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">encodedPrompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">encodeURIComponent<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">imageUrl<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">`https:\/\/image.pollinations.ai\/prompt\/<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">encodedPrompt<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">?width=512&amp;height=512&amp;nologo=true`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udd17 Fetching from: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">imageUrl<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">response<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">fetch<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">imageUrl<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">ok<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">throw<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`Pollinations API error: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">status<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\"> <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">statusText<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">imageBuffer<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">arrayBuffer<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">imageBuffer<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #9CDCFE\">imageBuffer<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">byteLength<\/span><span style=\"color: #D4D4D4\"> === <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">throw<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;Received empty image data from Pollinations&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u2705 Image generated successfully (<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">imageBuffer<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">byteLength<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\"> bytes)`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">success:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">imageBuffer:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Buffer<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">from<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">imageBuffer<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">prompt:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">model:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;Pollinations AI&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">size:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageBuffer<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">byteLength<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    };<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;\u274c Image generation error:&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">success:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">error:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">prompt:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">prompt<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    };<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Generate image and format for Discord<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #6A9955\"> - User&#039;s message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Promise&lt;Object&gt;}<\/span><span style=\"color: #6A9955\"> - Formatted image result<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">async<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">generateAndFormat<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Extract prompt from user message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">prompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">extractPrompt<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udd0d Extracted prompt: &quot;<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">&quot;`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Generate image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">result<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">generateImage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">success<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">success:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">prompt:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">imageBuffer:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">imageBuffer<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">filename:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">`generated_<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">Date<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">now<\/span><span style=\"color: #D4D4D4\">()<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">.png`<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">size:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">size<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      };<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    } <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">success:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">prompt:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">error:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">error<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      };<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;\u274c Image generation and formatting error:&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">success:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">error:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    };<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">module<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4EC9B0\">exports<\/span><span style=\"color: #D4D4D4\"> = {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">detectImageGenerationIntent<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">extractPrompt<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">generateImage<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">generateAndFormat<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><strong>\u201caiResponse\u201d<\/strong> updated:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2\"><span style=\"align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JavaScript<\/span><span role=\"button\" data-code=\"const memory = require('.\/memory.js');\nconst search = require('.\/search.js');\nconst imageRead = require('.\/imageRead.js');\nconst imageGenerate = require('.\/imageGenerate.js');\n\/**\n * Generate an AI response with image analysis\n * @param {string} userMessage - The user's message\n * @param {Object} model - The Gemini AI model instance\n * @param {string} systemPrompt - The system prompt with rules\n * @param {string} userId - Discord user ID for memory context\n * @param {Array} imageAttachments - Array of Discord image attachments\n * @returns {Promise&lt;string&gt;} - The AI response\n *\/\nasync function generateAIResponseWithImages(userMessage, model, systemPrompt, userId, imageAttachments) {\n  try {\n    \/\/ Clean user message (remove mentions)\n    const cleanedUserMessage = cleanUserMessage(userMessage);\n    \/\/ Get memory context for this user\n    const memoryContext = memory.formatMemoryForAI(userId);\n    \/\/ Process images if any\n    let imageContext = '';\n    const imageParts = [];\n    if (imageAttachments &amp;&amp; imageAttachments.length &gt; 0) {\n      console.log(`\ud83d\uddbc\ufe0f Processing ${imageAttachments.length} image(s)`);\n      for (const attachment of imageAttachments) {\n        \/\/ Validate image\n        const validation = imageRead.validateImage(attachment);\n        if (!validation.valid) {\n          console.log(`\u274c Invalid image: ${validation.errors.join(', ')}`);\n          continue;\n        }\n        try {\n          \/\/ Download and convert the image\n          const imageData = await imageRead.downloadImageAsBase64(attachment.url);\n          const imageInfo = imageRead.getImageInfo(attachment);\n          \/\/ Add image to Gemini parts\n          imageParts.push({\n            inlineData: {\n              data: imageData.base64,\n              mimeType: imageData.mimeType\n            }\n          });\n          \/\/ Add image context for AI\n          imageContext += `\\nImage attached: ${imageInfo.name} (${imageInfo.extension}, ${(imageInfo.size \/ 1024).toFixed(1)}KB)`;\n        } catch (error) {\n          console.error(`\u274c Error processing image ${attachment.name}:`, error);\n          imageContext += `\\nNote: Could not process image ${attachment.name || 'unknown'}`;\n        }\n      }\n    }\n    \/\/ Check if search is needed and perform search\n    let searchContext = '';\n    const needsSearch = search.detectSearchIntent(cleanedUserMessage);\n    if (needsSearch) {\n      console.log(`\ud83d\udd0d Search detected for: &quot;${cleanedUserMessage}&quot;`);\n      const searchResults = await search.searchAndFormat(cleanedUserMessage);\n      if (searchResults.success) {\n        searchContext = searchResults.context;\n        console.log(`\u2705 Search completed successfully`);\n      } else {\n        console.log(`\u274c Search failed: ${searchResults.error}`);\n      }\n    }\n    \/\/ Create the full prompt with all contexts\n    const textPrompt = `${systemPrompt}${memoryContext}${searchContext}${imageContext}\\n\\nCurrent user message: ${cleanedUserMessage}`;\n    \/\/ Prepare content for Gemini\n    const content = [{ text: textPrompt }, ...imageParts];\n    \/\/ Generate response from AI\n    const result = await model.generateContent(content);\n    const aiResponse = result.response.text();\n    \/\/ Clean and validate response\n    const cleanedResponse = cleanResponse(aiResponse);\n    \/\/ Store this conversation in memory\n    memory.addToMemory(userId, cleanedUserMessage, cleanedResponse);\n    return cleanedResponse;\n  } catch (error) {\n    console.error('AI Response Error:', error);\n    throw new Error('Failed to generate AI response');\n  }\n}\n\/**\n * Generate AI response using Gemini model with memory context (text only)\n * @param {string} userMessage - The user's message\n * @param {Object} model - The Gemini AI model instance\n * @param {string} systemPrompt - The system prompt with rules\n * @param {string} userId - Discord user ID for memory context\n * @returns {Promise&lt;string&gt;} - The AI response\n *\/\nasync function generateAIResponse(userMessage, model, systemPrompt, userId) {\n  try {\n    \/\/ Clean user message (remove mentions)\n    const cleanedUserMessage = cleanUserMessage(userMessage);\n    \/\/ Get memory context for this user\n    const memoryContext = memory.formatMemoryForAI(userId);\n    \/\/ Check if search is needed and perform search\n    let searchContext = '';\n    const needsSearch = search.detectSearchIntent(cleanedUserMessage);\n    if (needsSearch) {\n      console.log(`\ud83d\udd0d Search detected for: &quot;${cleanedUserMessage}&quot;`);\n      const searchResults = await search.searchAndFormat(cleanedUserMessage);\n      if (searchResults.success) {\n        searchContext = searchResults.context;\n        console.log(`\u2705 Search completed successfully`);\n      } else {\n        console.log(`\u274c Search failed: ${searchResults.error}`);\n      }\n    }\n    \/\/ Create the full prompt with system prompt, memory context, search context, and current message\n    const fullPrompt = `${systemPrompt}${memoryContext}${searchContext}\\n\\nCurrent user message: ${cleanedUserMessage}`;\n    \/\/ Generate response from AI\n    const result = await model.generateContent(fullPrompt);\n    const aiResponse = result.response.text();\n    \/\/ Clean and validate response\n    const cleanedResponse = cleanResponse(aiResponse);\n    \/\/ Store this conversation in memory\n    memory.addToMemory(userId, cleanedUserMessage, cleanedResponse);\n    return cleanedResponse;\n  } catch (error) {\n    console.error('AI Response Error:', error);\n    throw new Error('Failed to generate AI response');\n  }\n}\n\/**\n * Clean user message (remove mentions and extra whitespace)\n * @param {string} message - Raw user message\n * @returns {string} - Cleaned message\n *\/\nfunction cleanUserMessage(message) {\n  if (!message || typeof message !== 'string') {\n    return '';\n  }\n  \/\/ Remove mentions (like &lt;@123456789&gt;)\n  let cleaned = message.replace(\/&lt;@!?\\d+&gt;\/g, '').trim();\n  \/\/ Remove extra whitespace\n  cleaned = cleaned.replace(\/\\s+\/g, ' ').trim();\n  return cleaned || 'hi';\n}\n\/**\n * Clean and validate AI response\n * @param {string} response - Raw AI response\n * @returns {string} - Cleaned response\n *\/\nfunction cleanResponse(response) {\n  if (!response || typeof response !== 'string') {\n    return 'Sorry, I couldn\\'t generate a proper response.';\n  }\n  \/\/ Trim whitespace\n  let cleaned = response.trim();\n  \/\/ Ensure response is not too long for Discord (2000 char limit)\n  if (cleaned.length &gt; 1900) {\n    cleaned = cleaned.substring(0, 1900) + '...';\n  }\n  \/\/ Remove any potential harmful content markers\n  cleaned = cleaned.replace(\/\\[HARMFUL\\]|\\[NSFW\\]|\\[INAPPROPRIATE\\]\/gi, '');\n  return cleaned || 'Sorry, I couldn\\'t generate a response.';\n}\n\/**\n * Build system prompt from config\n * @param {Object} config - Configuration object with prompt and rules\n * @returns {string} - Complete system prompt\n *\/\nfunction buildSystemPrompt(config) {\n  let systemPrompt = config.prompt || 'You are a helpful AI assistant.';\n  if (config.rules &amp;&amp; Array.isArray(config.rules)) {\n    systemPrompt += '\\n\\nRules you must follow:\\n';\n    config.rules.forEach((rule, index) =&gt; {\n      systemPrompt += `${index + 1}. ${rule}\\n`;\n    });\n  }\n  return systemPrompt;\n}\n\/**\n * Check if the user wants image generation and handle accordingly\n * @param {string} userMessage - The user's message\n * @param {Object} model - The Gemini AI model instance\n * @param {string} systemPrompt - The system prompt with rules\n * @param {string} userId - Discord user ID for memory context\n * @returns {Promise&lt;Object&gt;} - Response object with type and content\n *\/\nasync function handleUserRequest(userMessage, model, systemPrompt, userId) {\n  try {\n    \/\/ Clean user message (remove mentions)\n    const cleanedUserMessage = cleanUserMessage(userMessage);\n    \/\/ Check if user wants image generation\n    const wantsImageGeneration = imageGenerate.detectImageGenerationIntent(cleanedUserMessage);\n    if (wantsImageGeneration) {\n      console.log(`\ud83c\udfa8 Image generation request detected: &quot;${cleanedUserMessage}&quot;`);\n      \/\/ Generate image\n      const imageResult = await imageGenerate.generateAndFormat(cleanedUserMessage);\n      if (imageResult.success) {\n        \/\/ Store in memory\n        memory.addToMemory(userId, cleanedUserMessage, `Generated image: ${imageResult.prompt}`);\n        return {\n          type: 'image',\n          success: true,\n          imageBuffer: imageResult.imageBuffer,\n          filename: imageResult.filename,\n          prompt: imageResult.prompt,\n          textResponse: `\ud83c\udfa8 Here's your generated image: **${imageResult.prompt}**`\n        };\n      } else {\n        \/\/ Fallback to text response if image generation fails\n        const textResponse = `Sorry, I couldn't generate an image for &quot;${imageResult.prompt}&quot;. Error: ${imageResult.error}`;\n        memory.addToMemory(userId, cleanedUserMessage, textResponse);\n        return {\n          type: 'text',\n          success: false,\n          textResponse: textResponse\n        };\n      }\n    } else {\n      \/\/ Handle as regular text conversation\n      const response = await generateAIResponse(userMessage, model, systemPrompt, userId);\n      return {\n        type: 'text',\n        success: true,\n        textResponse: response\n      };\n    }\n  } catch (error) {\n    console.error('\u274c Error handling user request:', error);\n    return {\n      type: 'text',\n      success: false,\n      textResponse: 'Sorry, I encountered an error processing your request.'\n    };\n  }\n}\nmodule.exports = {\n  generateAIResponse,\n  generateAIResponseWithImages,\n  handleUserRequest,\n  cleanResponse,\n  cleanUserMessage,\n  buildSystemPrompt\n};\" style=\"color:#D4D4D4\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\"><code><span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">memory<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/memory.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">search<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/search.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">imageRead<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/imageRead.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">imageGenerate<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/imageGenerate.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Generate an AI response with image analysis<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #6A9955\"> - The user&#039;s message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Object}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #6A9955\"> - The Gemini AI model instance<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #6A9955\"> - The system prompt with rules<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #6A9955\"> - Discord user ID for memory context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Array}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #6A9955\"> - Array of Discord image attachments<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Promise&lt;string&gt;}<\/span><span style=\"color: #6A9955\"> - The AI response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">async<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">generateAIResponseWithImages<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Clean user message (remove mentions)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">cleanUserMessage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Get memory context for this user<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">memoryContext<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">memory<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">formatMemoryForAI<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Process images if any<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageContext<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">imageParts<\/span><span style=\"color: #D4D4D4\"> = [];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\"> &amp;&amp; <\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\uddbc\ufe0f Processing <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\"> image(s)`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">attachment<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">of<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Validate image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">validation<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">imageRead<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">validateImage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">validation<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">valid<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u274c Invalid image: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">validation<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">errors<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">join<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;, &#039;<\/span><span style=\"color: #D4D4D4\">)<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #C586C0\">continue<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #6A9955\">\/\/ Download and convert the image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">imageData<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageRead<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">downloadImageAsBase64<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">url<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">imageInfo<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">imageRead<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getImageInfo<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #6A9955\">\/\/ Add image to Gemini parts<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">imageParts<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">push<\/span><span style=\"color: #D4D4D4\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">inlineData:<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">              <\/span><span style=\"color: #9CDCFE\">data:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageData<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">base64<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">              <\/span><span style=\"color: #9CDCFE\">mimeType:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageData<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">mimeType<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #6A9955\">\/\/ Add image context for AI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">imageContext<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">Image attached: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">imageInfo<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">name<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\"> (<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">imageInfo<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">extension<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">, <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">imageInfo<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">size<\/span><span style=\"color: #D4D4D4\"> \/ <\/span><span style=\"color: #B5CEA8\">1024<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">toFixed<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">)<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">KB)`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u274c Error processing image <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">name<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">:`<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">imageContext<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">Note: Could not process image <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">name<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&#039;unknown&#039;<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Check if search is needed and perform search<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">searchContext<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">needsSearch<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">search<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">detectSearchIntent<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">needsSearch<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udd0d Search detected for: &quot;<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">&quot;`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">searchResults<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">search<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">searchAndFormat<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">searchResults<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">success<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">searchContext<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">searchResults<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u2705 Search completed successfully`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      } <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u274c Search failed: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">searchResults<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Create the full prompt with all contexts<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">textPrompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #569CD6\">}${<\/span><span style=\"color: #9CDCFE\">memoryContext<\/span><span style=\"color: #569CD6\">}${<\/span><span style=\"color: #9CDCFE\">searchContext<\/span><span style=\"color: #569CD6\">}${<\/span><span style=\"color: #9CDCFE\">imageContext<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n\\n<\/span><span style=\"color: #CE9178\">Current user message: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Prepare content for Gemini<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">content<\/span><span style=\"color: #D4D4D4\"> = [{ <\/span><span style=\"color: #9CDCFE\">text:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">textPrompt<\/span><span style=\"color: #D4D4D4\"> }, ...<\/span><span style=\"color: #9CDCFE\">imageParts<\/span><span style=\"color: #D4D4D4\">];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Generate response from AI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">result<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">generateContent<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">aiResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">text<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Clean and validate response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">cleanedResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">cleanResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">aiResponse<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Store this conversation in memory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">memory<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">addToMemory<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">cleanedResponse<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleanedResponse<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;AI Response Error:&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">throw<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;Failed to generate AI response&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Generate AI response using Gemini model with memory context (text only)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #6A9955\"> - The user&#039;s message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Object}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #6A9955\"> - The Gemini AI model instance<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #6A9955\"> - The system prompt with rules<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #6A9955\"> - Discord user ID for memory context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Promise&lt;string&gt;}<\/span><span style=\"color: #6A9955\"> - The AI response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">async<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">generateAIResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Clean user message (remove mentions)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">cleanUserMessage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Get memory context for this user<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">memoryContext<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">memory<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">formatMemoryForAI<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Check if search is needed and perform search<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">searchContext<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">needsSearch<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">search<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">detectSearchIntent<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">needsSearch<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udd0d Search detected for: &quot;<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">&quot;`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">searchResults<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">search<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">searchAndFormat<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">searchResults<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">success<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">searchContext<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">searchResults<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u2705 Search completed successfully`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      } <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u274c Search failed: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">searchResults<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Create the full prompt with system prompt, memory context, search context, and current message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">fullPrompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #569CD6\">}${<\/span><span style=\"color: #9CDCFE\">memoryContext<\/span><span style=\"color: #569CD6\">}${<\/span><span style=\"color: #9CDCFE\">searchContext<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n\\n<\/span><span style=\"color: #CE9178\">Current user message: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Generate response from AI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">result<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">generateContent<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">fullPrompt<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">aiResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">text<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Clean and validate response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">cleanedResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">cleanResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">aiResponse<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Store this conversation in memory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">memory<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">addToMemory<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">cleanedResponse<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleanedResponse<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;AI Response Error:&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">throw<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;Failed to generate AI response&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Clean user message (remove mentions and extra whitespace)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #6A9955\"> - Raw user message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> - Cleaned message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">cleanUserMessage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #569CD6\">typeof<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\"> !== <\/span><span style=\"color: #CE9178\">&#039;string&#039;<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Remove mentions (like &lt;@123456789&gt;)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">replace<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #D16969\">\/&lt;@!<\/span><span style=\"color: #D7BA7D\">?<\/span><span style=\"color: #D16969\">\\d<\/span><span style=\"color: #D7BA7D\">+<\/span><span style=\"color: #D16969\">&gt;\/<\/span><span style=\"color: #569CD6\">g<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">trim<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Remove extra whitespace<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">replace<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #D16969\">\/\\s<\/span><span style=\"color: #D7BA7D\">+<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #569CD6\">g<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039; &#039;<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">trim<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&#039;hi&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Clean and validate AI response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #6A9955\"> - Raw AI response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> - Cleaned response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">cleanResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #569CD6\">typeof<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\"> !== <\/span><span style=\"color: #CE9178\">&#039;string&#039;<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;Sorry, I couldn<\/span><span style=\"color: #D7BA7D\">\\&#039;<\/span><span style=\"color: #CE9178\">t generate a proper response.&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Trim whitespace<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">trim<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Ensure response is not too long for Discord (2000 char limit)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #B5CEA8\">1900<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">substring<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1900<\/span><span style=\"color: #D4D4D4\">) + <\/span><span style=\"color: #CE9178\">&#039;...&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Remove any potential harmful content markers<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">replace<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #D7BA7D\">\\[<\/span><span style=\"color: #D16969\">HARMFUL<\/span><span style=\"color: #D7BA7D\">\\]<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D7BA7D\">\\[<\/span><span style=\"color: #D16969\">NSFW<\/span><span style=\"color: #D7BA7D\">\\]<\/span><span style=\"color: #DCDCAA\">|<\/span><span style=\"color: #D7BA7D\">\\[<\/span><span style=\"color: #D16969\">INAPPROPRIATE<\/span><span style=\"color: #D7BA7D\">\\]<\/span><span style=\"color: #D16969\">\/<\/span><span style=\"color: #569CD6\">gi<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">cleaned<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&#039;Sorry, I couldn<\/span><span style=\"color: #D7BA7D\">\\&#039;<\/span><span style=\"color: #CE9178\">t generate a response.&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Build system prompt from config<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Object}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #6A9955\"> - Configuration object with prompt and rules<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> - Complete system prompt<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">buildSystemPrompt<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&#039;You are a helpful AI assistant.&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">rules<\/span><span style=\"color: #D4D4D4\"> &amp;&amp; <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">isArray<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">rules<\/span><span style=\"color: #D4D4D4\">)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D7BA7D\">\\n\\n<\/span><span style=\"color: #CE9178\">Rules you must follow:<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&#039;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">rules<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">forEach<\/span><span style=\"color: #D4D4D4\">((<\/span><span style=\"color: #9CDCFE\">rule<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">index<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">index<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">. <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">rule<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Check if the user wants image generation and handle accordingly<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #6A9955\"> - The user&#039;s message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Object}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #6A9955\"> - The Gemini AI model instance<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #6A9955\"> - The system prompt with rules<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@param<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{string}<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #6A9955\"> - Discord user ID for memory context<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@returns<\/span><span style=\"color: #6A9955\"> <\/span><span style=\"color: #4EC9B0\">{Promise&lt;Object&gt;}<\/span><span style=\"color: #6A9955\"> - Response object with type and content<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">async<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">handleUserRequest<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Clean user message (remove mentions)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">cleanUserMessage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Check if user wants image generation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">wantsImageGeneration<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">imageGenerate<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">detectImageGenerationIntent<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">wantsImageGeneration<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83c\udfa8 Image generation request detected: &quot;<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">&quot;`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">\/\/ Generate image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">imageResult<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageGenerate<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">generateAndFormat<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">imageResult<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">success<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Store in memory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">memory<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">addToMemory<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">`Generated image: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">imageResult<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">type:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;image&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">success:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">imageBuffer:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageResult<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">imageBuffer<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">filename:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageResult<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">filename<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">prompt:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageResult<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">textResponse:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">`\ud83c\udfa8 Here&#039;s your generated image: **<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">imageResult<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">**`<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        };<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      } <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Fallback to text response if image generation fails<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">textResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">`Sorry, I couldn&#039;t generate an image for &quot;<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">imageResult<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">&quot;. Error: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">imageResult<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">memory<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">addToMemory<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">cleanedUserMessage<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">textResponse<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">type:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;text&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">success:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">textResponse:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">textResponse<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        };<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    } <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">\/\/ Handle as regular text conversation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">response<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">generateAIResponse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userMessage<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">userId<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">type:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;text&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">success:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">textResponse:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      };<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;\u274c Error handling user request:&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">type:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;text&#039;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">success:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">textResponse:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#039;Sorry, I encountered an error processing your request.&#039;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    };<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">module<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4EC9B0\">exports<\/span><span style=\"color: #D4D4D4\"> = {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">generateAIResponse<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">generateAIResponseWithImages<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">handleUserRequest<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleanResponse<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">cleanUserMessage<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">buildSystemPrompt<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Finally, updated <strong>\u201cindex.js\u201d<\/strong><br><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2\"><span style=\"align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">JavaScript<\/span><span role=\"button\" data-code=\"\/\/ Import packages\nconst { Client, GatewayIntentBits, AttachmentBuilder } = require('discord.js'); \/\/ Added AttachmentBuilder here\nconst { GoogleGenerativeAI } = require('@google\/generative-ai');\nconst dotenv = require('dotenv');\nconst fs = require('fs');\n\/\/ Import utilities\nconst aiResponse = require('.\/utils\/aiResponse.js');\nconst imageRead = require('.\/utils\/imageRead.js');\nconst imageGenerate = require('.\/utils\/imageGenerate.js');\n\/\/ Load environment variables\ndotenv.config();\n\/\/ Load configuration\nconst config = JSON.parse(fs.readFileSync('.\/config.json', 'utf8'));\n\/\/ Initialize Gemini AI\nconst genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);\nconst model = genAI.getGenerativeModel({ model: &quot;gemini-2.0-flash&quot; });\n\/\/ Build system prompt from config\nconst systemPrompt = aiResponse.buildSystemPrompt(config);\n\/\/ Create Discord client\nconst client = new Client({\n  intents: [\n    GatewayIntentBits.Guilds,\n    GatewayIntentBits.GuildMessages,\n    GatewayIntentBits.MessageContent,\n  ],\n});\n\/\/ Bot ready event\nclient.once('ready', async () =&gt; {\n  console.log('CybranceBot is online!');\n  console.log(`System prompt loaded: ${systemPrompt.substring(0, 100)}...`);\n});\n\/\/ Track processed messages to prevent duplicates\nconst processedMessages = new Set();\n\/\/ Message event handler\nclient.on('messageCreate', async (message) =&gt; {\n  \/\/ Ignore bot messages\n  if (message.author.bot) return;\n  \/\/ Only respond when mentioned\n  if (!message.mentions.has(client.user)) return;\n  \/\/ Prevent duplicate processing\n  if (processedMessages.has(message.id)) return;\n  processedMessages.add(message.id);\n  \/\/ Clean up old message IDs (keep only last 100)\n  if (processedMessages.size &gt; 100) {\n    const oldIds = Array.from(processedMessages).slice(0, processedMessages.size - 100);\n    oldIds.forEach(id =&gt; processedMessages.delete(id));\n  }\n  try {\n    console.log(`Processing message from ${message.author.username}: &quot;${message.content}&quot;`);\n    \/\/ Check for image attachments\n    console.log(`\ud83d\udcce Total attachments: ${message.attachments.size}`);\n    \/\/ Convert Discord Collection to Array first\n    const allAttachments = Array.from(message.attachments.values());\n    console.log(`\ud83d\udccb Converted to array: ${allAttachments.length} attachments`);\n    const imageAttachments = allAttachments.filter(attachment =&gt; {\n      console.log(`\ud83d\udd0d Checking attachment: ${attachment.name} (${attachment.contentType})`);\n      const isSupported = imageRead.isSupportedImage(attachment);\n      console.log(`\ud83d\udccb Is supported: ${isSupported}`);\n      return isSupported;\n    });\n    console.log(`\ud83d\uddbc\ufe0f Image attachments found: ${imageAttachments.length}`);\n    let result;\n    if (imageAttachments.length &gt; 0) {\n      \/\/ Handle message with images\n      console.log(`\ud83d\udccb Processing ${imageAttachments.length} image attachments`);\n      console.log(`\ud83d\udccb First attachment:`, {\n        name: imageAttachments[0].name,\n        contentType: imageAttachments[0].contentType,\n        size: imageAttachments[0].size\n      });\n      const response = await aiResponse.generateAIResponseWithImages(\n        message.content,\n        model,\n        systemPrompt,\n        message.author.id,\n        imageAttachments\n      );\n      \/\/ Send text response\n      await message.reply(response);\n      console.log(`\u2705 Responded to ${message.author.username} with image analysis`);\n    } else {\n      \/\/ Handle text-only message (could be image generation or regular chat)\n      result = await aiResponse.handleUserRequest(\n        message.content,\n        model,\n        systemPrompt,\n        message.author.id\n      );\n      if (result.type === 'image' &amp;&amp; result.success) {\n        \/\/ Send generated image\n        const attachment = new AttachmentBuilder(result.imageBuffer, {\n          name: result.filename\n        });\n        await message.reply({\n          content: result.textResponse,\n          files: [attachment]\n        });\n        console.log(`\u2705 Responded to ${message.author.username} with generated image: &quot;${result.prompt}&quot;`);\n      } else {\n        \/\/ Send text response\n        await message.reply(result.textResponse);\n        console.log(`\u2705 Responded to ${message.author.username} with text`);\n      }\n    }\n  } catch (error) {\n    console.error('\u274c Error:', error);\n    await message.reply('Sorry, I had an error processing your message.');\n  }\n});\n\/\/ Login to Discord\nclient.login(process.env.DISCORD_BOT_TOKEN);\" style=\"color:#D4D4D4\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ Import packages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #4FC1FF\">Client<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4FC1FF\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4FC1FF\">AttachmentBuilder<\/span><span style=\"color: #D4D4D4\"> } = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;discord.js&#039;<\/span><span style=\"color: #D4D4D4\">); <\/span><span style=\"color: #6A9955\">\/\/ Added AttachmentBuilder here<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #4FC1FF\">GoogleGenerativeAI<\/span><span style=\"color: #D4D4D4\"> } = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;@google\/generative-ai&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">dotenv<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;dotenv&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">fs<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;fs&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Import utilities<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">aiResponse<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/utils\/aiResponse.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">imageRead<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/utils\/imageRead.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">imageGenerate<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/utils\/imageGenerate.js&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Load environment variables<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">dotenv<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">config<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Load configuration<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">config<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #4FC1FF\">JSON<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">parse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">fs<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">readFileSync<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;.\/config.json&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#039;utf8&#039;<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Initialize Gemini AI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">genAI<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">GoogleGenerativeAI<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">process<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">env<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4FC1FF\">GEMINI_API_KEY<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">model<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">genAI<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getGenerativeModel<\/span><span style=\"color: #D4D4D4\">({ <\/span><span style=\"color: #9CDCFE\">model:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;gemini-2.0-flash&quot;<\/span><span style=\"color: #D4D4D4\"> });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Build system prompt from config<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">systemPrompt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">aiResponse<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">buildSystemPrompt<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">config<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Create Discord client<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">client<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Client<\/span><span style=\"color: #D4D4D4\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">intents:<\/span><span style=\"color: #D4D4D4\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Guilds<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">GuildMessages<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">GatewayIntentBits<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">MessageContent<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  ],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Bot ready event<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">once<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;ready&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">async<\/span><span style=\"color: #D4D4D4\"> () <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;CybranceBot is online!&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`System prompt loaded: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">substring<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #D4D4D4\">)<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">...`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Track processed messages to prevent duplicates<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">processedMessages<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Set<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Message event handler<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">on<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;messageCreate&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">async<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Ignore bot messages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">bot<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Only respond when mentioned<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">mentions<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">has<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">user<\/span><span style=\"color: #D4D4D4\">)) <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Prevent duplicate processing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">has<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">)) <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">add<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Clean up old message IDs (keep only last 100)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">size<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">oldIds<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">from<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">slice<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">size<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #B5CEA8\">100<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">oldIds<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">forEach<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">processedMessages<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">delete<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`Processing message from <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">username<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">: &quot;<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">&quot;`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Check for image attachments<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udcce Total attachments: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">attachments<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">size<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ Convert Discord Collection to Array first<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">allAttachments<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">from<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">attachments<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">values<\/span><span style=\"color: #D4D4D4\">());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udccb Converted to array: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">allAttachments<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\"> attachments`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">imageAttachments<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">allAttachments<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">filter<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udd0d Checking attachment: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">name<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\"> (<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">contentType<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">)`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">isSupported<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">imageRead<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">isSupportedImage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udccb Is supported: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">isSupported<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">isSupported<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\uddbc\ufe0f Image attachments found: <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">\/\/ Handle message with images<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udccb Processing <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\"> image attachments`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\ud83d\udccb First attachment:`<\/span><span style=\"color: #D4D4D4\">, {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">name:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">].<\/span><span style=\"color: #9CDCFE\">name<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">contentType:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">].<\/span><span style=\"color: #9CDCFE\">contentType<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">size:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">].<\/span><span style=\"color: #9CDCFE\">size<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">response<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">aiResponse<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">generateAIResponseWithImages<\/span><span style=\"color: #D4D4D4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">imageAttachments<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      );<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">\/\/ Send text response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">reply<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">response<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u2705 Responded to <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">username<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\"> with image analysis`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    } <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">\/\/ Handle text-only message (could be image generation or regular chat)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">aiResponse<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">handleUserRequest<\/span><span style=\"color: #D4D4D4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">model<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">systemPrompt<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">id<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      );<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">type<\/span><span style=\"color: #D4D4D4\"> === <\/span><span style=\"color: #CE9178\">&#039;image&#039;<\/span><span style=\"color: #D4D4D4\"> &amp;&amp; <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">success<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Send generated image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">attachment<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">AttachmentBuilder<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">imageBuffer<\/span><span style=\"color: #D4D4D4\">, {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">name:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">filename<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">reply<\/span><span style=\"color: #D4D4D4\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">content:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">textResponse<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">files:<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #9CDCFE\">attachment<\/span><span style=\"color: #D4D4D4\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u2705 Responded to <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">username<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\"> with generated image: &quot;<\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">prompt<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">&quot;`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      } <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ Send text response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">reply<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">textResponse<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">log<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">`\u2705 Responded to <\/span><span style=\"color: #569CD6\">${<\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">author<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">username<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\"> with text`<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  } <\/span><span style=\"color: #C586C0\">catch<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">console<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">error<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;\u274c Error:&#039;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">error<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">message<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">reply<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#039;Sorry, I had an error processing your message.&#039;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Login to Discord<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">login<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">process<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">env<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4FC1FF\">DISCORD_BOT_TOKEN<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><strong>Example of Generating Image:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"711\" height=\"432\" src=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im8.png\" alt=\"Screenshot of A Discord Chatbot Can Generate Images\" class=\"wp-image-3207\" srcset=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im8.png 711w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im8-300x182.png 300w, https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/im8-512x311.png 512w\" sizes=\"auto, (max-width: 711px) 100vw, 711px\" \/><\/figure>\n\n\n\n<p>\u2014&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<\/p>\n\n\n\n<p>Wow!! You have made it!&nbsp;<\/p>\n\n\n\n<p>You have succeeded in making an Advanced AI Discord Bot that uses multiple features, like better context, remembering, reading images, and generating images.<\/p>\n\n\n\n<p>Have fun using your new AI Assistant Discord Bot and enhancing it. This creation opens a world of amazing features that can be added in the future.<\/p>\n","protected":false},"excerpt":{"rendered":"Discord bots are a powerful tool for managing your server with commands. But what if your bot could&hellip;","protected":false},"author":6,"featured_media":4219,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_display_header_overlay":false,"csco_singular_sidebar":"","csco_page_header_type":"","footnotes":""},"categories":[5],"tags":[],"class_list":{"0":"post-3199","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-discord-bot-hosting","8":"cs-entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Integrating AI Into a Discord Bot: Ultimate Guide<\/title>\n<meta name=\"description\" content=\"In this blog, you will learn how to integrate AI into a discord bot, the ultimate guide will show you step-by-step setting up AI and its features inside your discord bot.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Integrating AI Into a Discord Bot: Ultimate Guide\" \/>\n<meta property=\"og:description\" content=\"In this blog, you will learn how to integrate AI into a discord bot, the ultimate guide will show you step-by-step setting up AI and its features inside your discord bot.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/\" \/>\n<meta property=\"og:site_name\" content=\"Cybrancee Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/cybrancee\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-06-28T18:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-29T10:37:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/discordLogoInABlock.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1600\" \/>\n\t<meta property=\"og:image:height\" content=\"560\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Iyed R\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@cybrancee\" \/>\n<meta name=\"twitter:site\" content=\"@cybrancee\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Iyed R\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"31 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/\"},\"author\":{\"name\":\"Iyed R\",\"@id\":\"https:\/\/cybrancee.com\/blog\/#\/schema\/person\/91e2ae4a0ead7b894d5259cb92426837\"},\"headline\":\"Integrating AI Into a Discord Bot: Ultimate Guide\",\"datePublished\":\"2025-06-28T18:00:00+00:00\",\"dateModified\":\"2025-06-29T10:37:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/\"},\"wordCount\":1399,\"publisher\":{\"@id\":\"https:\/\/cybrancee.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/discordLogoInABlock.jpg\",\"articleSection\":[\"Discord Bot Hosting\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/\",\"url\":\"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/\",\"name\":\"Integrating AI Into a Discord Bot: Ultimate Guide\",\"isPartOf\":{\"@id\":\"https:\/\/cybrancee.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/discordLogoInABlock.jpg\",\"datePublished\":\"2025-06-28T18:00:00+00:00\",\"dateModified\":\"2025-06-29T10:37:07+00:00\",\"description\":\"In this blog, you will learn how to integrate AI into a discord bot, the ultimate guide will show you step-by-step setting up AI and its features inside your discord bot.\",\"breadcrumb\":{\"@id\":\"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/#primaryimage\",\"url\":\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/discordLogoInABlock.jpg\",\"contentUrl\":\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/discordLogoInABlock.jpg\",\"width\":1600,\"height\":560,\"caption\":\"Discord logo in a block\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cybrancee.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Integrating AI Into a Discord Bot: Ultimate Guide\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cybrancee.com\/blog\/#website\",\"url\":\"https:\/\/cybrancee.com\/blog\/\",\"name\":\"Cybrancee Blog\",\"description\":\"Gaming News\",\"publisher\":{\"@id\":\"https:\/\/cybrancee.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cybrancee.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cybrancee.com\/blog\/#organization\",\"name\":\"Cybrancee\",\"url\":\"https:\/\/cybrancee.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cybrancee.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2024\/08\/logo.png\",\"contentUrl\":\"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2024\/08\/logo.png\",\"width\":466,\"height\":100,\"caption\":\"Cybrancee\"},\"image\":{\"@id\":\"https:\/\/cybrancee.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/cybrancee\/\",\"https:\/\/x.com\/cybrancee\",\"https:\/\/www.instagram.com\/cybrancee\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/cybrancee.com\/blog\/#\/schema\/person\/91e2ae4a0ead7b894d5259cb92426837\",\"name\":\"Iyed R\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/5d5e4a788a890e384df2e7dc623bf8800c8fe5d56d3ab74ad7e828280d69a32c?s=96&d=retro&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5d5e4a788a890e384df2e7dc623bf8800c8fe5d56d3ab74ad7e828280d69a32c?s=96&d=retro&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5d5e4a788a890e384df2e7dc623bf8800c8fe5d56d3ab74ad7e828280d69a32c?s=96&d=retro&r=g\",\"caption\":\"Iyed R\"},\"url\":\"https:\/\/cybrancee.com\/blog\/author\/iyed-r\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Integrating AI Into a Discord Bot: Ultimate Guide","description":"In this blog, you will learn how to integrate AI into a discord bot, the ultimate guide will show you step-by-step setting up AI and its features inside your discord bot.","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:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/","og_locale":"en_US","og_type":"article","og_title":"Integrating AI Into a Discord Bot: Ultimate Guide","og_description":"In this blog, you will learn how to integrate AI into a discord bot, the ultimate guide will show you step-by-step setting up AI and its features inside your discord bot.","og_url":"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/","og_site_name":"Cybrancee Blog","article_publisher":"https:\/\/www.facebook.com\/cybrancee\/","article_published_time":"2025-06-28T18:00:00+00:00","article_modified_time":"2025-06-29T10:37:07+00:00","og_image":[{"width":1600,"height":560,"url":"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/discordLogoInABlock.jpg","type":"image\/jpeg"}],"author":"Iyed R","twitter_card":"summary_large_image","twitter_creator":"@cybrancee","twitter_site":"@cybrancee","twitter_misc":{"Written by":"Iyed R","Est. reading time":"31 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/#article","isPartOf":{"@id":"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/"},"author":{"name":"Iyed R","@id":"https:\/\/cybrancee.com\/blog\/#\/schema\/person\/91e2ae4a0ead7b894d5259cb92426837"},"headline":"Integrating AI Into a Discord Bot: Ultimate Guide","datePublished":"2025-06-28T18:00:00+00:00","dateModified":"2025-06-29T10:37:07+00:00","mainEntityOfPage":{"@id":"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/"},"wordCount":1399,"publisher":{"@id":"https:\/\/cybrancee.com\/blog\/#organization"},"image":{"@id":"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/discordLogoInABlock.jpg","articleSection":["Discord Bot Hosting"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/","url":"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/","name":"Integrating AI Into a Discord Bot: Ultimate Guide","isPartOf":{"@id":"https:\/\/cybrancee.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/#primaryimage"},"image":{"@id":"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/discordLogoInABlock.jpg","datePublished":"2025-06-28T18:00:00+00:00","dateModified":"2025-06-29T10:37:07+00:00","description":"In this blog, you will learn how to integrate AI into a discord bot, the ultimate guide will show you step-by-step setting up AI and its features inside your discord bot.","breadcrumb":{"@id":"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/#primaryimage","url":"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/discordLogoInABlock.jpg","contentUrl":"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2025\/06\/discordLogoInABlock.jpg","width":1600,"height":560,"caption":"Discord logo in a block"},{"@type":"BreadcrumbList","@id":"https:\/\/cybrancee.com\/blog\/integrating-ai-into-a-discord-bot-ultimate-guide\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cybrancee.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Integrating AI Into a Discord Bot: Ultimate Guide"}]},{"@type":"WebSite","@id":"https:\/\/cybrancee.com\/blog\/#website","url":"https:\/\/cybrancee.com\/blog\/","name":"Cybrancee Blog","description":"Gaming News","publisher":{"@id":"https:\/\/cybrancee.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cybrancee.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cybrancee.com\/blog\/#organization","name":"Cybrancee","url":"https:\/\/cybrancee.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cybrancee.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2024\/08\/logo.png","contentUrl":"https:\/\/cybrancee.com\/blog\/wp-content\/uploads\/2024\/08\/logo.png","width":466,"height":100,"caption":"Cybrancee"},"image":{"@id":"https:\/\/cybrancee.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/cybrancee\/","https:\/\/x.com\/cybrancee","https:\/\/www.instagram.com\/cybrancee\/"]},{"@type":"Person","@id":"https:\/\/cybrancee.com\/blog\/#\/schema\/person\/91e2ae4a0ead7b894d5259cb92426837","name":"Iyed R","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5d5e4a788a890e384df2e7dc623bf8800c8fe5d56d3ab74ad7e828280d69a32c?s=96&d=retro&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5d5e4a788a890e384df2e7dc623bf8800c8fe5d56d3ab74ad7e828280d69a32c?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5d5e4a788a890e384df2e7dc623bf8800c8fe5d56d3ab74ad7e828280d69a32c?s=96&d=retro&r=g","caption":"Iyed R"},"url":"https:\/\/cybrancee.com\/blog\/author\/iyed-r\/"}]}},"_links":{"self":[{"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/posts\/3199","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/comments?post=3199"}],"version-history":[{"count":6,"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/posts\/3199\/revisions"}],"predecessor-version":[{"id":3257,"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/posts\/3199\/revisions\/3257"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/media\/4219"}],"wp:attachment":[{"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/media?parent=3199"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/categories?post=3199"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cybrancee.com\/blog\/wp-json\/wp\/v2\/tags?post=3199"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}