<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: K Om Senapati </title>
    <description>The latest articles on DEV Community by K Om Senapati  (@k0msenapati).</description>
    <link>https://dev.to/k0msenapati</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1154019%2Ff9358671-7005-48a2-a167-a2df45553c0f.png</url>
      <title>DEV Community: K Om Senapati </title>
      <link>https://dev.to/k0msenapati</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/k0msenapati"/>
    <language>en</language>
    <item>
      <title>Building Janus: An AI-Powered Helpdesk That Makes Customer Support Smarter</title>
      <dc:creator>K Om Senapati </dc:creator>
      <pubDate>Tue, 28 Oct 2025 05:34:49 +0000</pubDate>
      <link>https://dev.to/k0msenapati/building-janus-an-ai-powered-helpdesk-that-makes-customer-support-smarter-h6c</link>
      <guid>https://dev.to/k0msenapati/building-janus-an-ai-powered-helpdesk-that-makes-customer-support-smarter-h6c</guid>
      <description>&lt;p&gt;Enterprise helpdesks spend hours triaging repetitive requests, categorizing tickets, and responding to the same issues repeatedly.&lt;br&gt;&lt;br&gt;
This leads to delayed responses, inconsistent resolutions, and wasted agent hours.&lt;/p&gt;

&lt;p&gt;Janus solves this problem through automation, intelligent classification, and generative AI.&lt;br&gt;&lt;br&gt;
It’s an AI-powered helpdesk system that allows users to raise tickets, receive instant AI replies, and enables admins to manage everything from a unified dashboard.&lt;br&gt;&lt;br&gt;
Powered by MindsDB AI Agents and a Knowledge Base, Janus automates classification, conversation, and analytics to deliver faster, more consistent support.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Use Case
&lt;/h2&gt;

&lt;p&gt;The goal was to automate the helpdesk lifecycle.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users submit tickets and chat with an AI support agent in real time
&lt;/li&gt;
&lt;li&gt;The system automatically classifies each ticket by intent, priority, and category
&lt;/li&gt;
&lt;li&gt;Admins get a single dashboard to track trends, promote solved tickets into the Knowledge Base, and search historical data
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The outcome is faster response cycles, consistent answers, and actionable insights.&lt;/p&gt;


&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. AI-Driven Ticket Classification&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
   Each ticket is processed by a dedicated MindsDB AI Agent that predicts its type, category, tags, and priority.&lt;br&gt;&lt;br&gt;
   The model learns from past tickets to improve accuracy over time.&lt;br&gt;&lt;br&gt;
   Ticket metadata schema:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"str"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"str"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"priority"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"str"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"tag_1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"str"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"tag_2"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"str"&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;2. AI Chat Support&lt;/strong&gt;&lt;br&gt;
   A second agent handles real-time conversations, providing instant solutions by leveraging the existing Knowledge Base for context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Admin Dashboard&lt;/strong&gt;&lt;br&gt;
   Admins can view analytics, approve solved cases into the Knowledge Base, and filter data by type, priority, or category.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Knowledge Base Management&lt;/strong&gt;&lt;br&gt;
   The Knowledge Base (KB) is managed by MindsDB. It stores both content and metadata for retrieval and reasoning.&lt;br&gt;
   KB schema:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;   &lt;span class="n"&gt;content_columns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subject&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;answer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
   &lt;span class="n"&gt;metadata_columns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;priority&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;category&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tag_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tag_2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;5. Search and Insights&lt;/strong&gt;&lt;br&gt;
   Admins can visualize ticket trends, most common tags, and distribution of categories directly within the dashboard.&lt;/p&gt;


&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;Below is the high-level workflow of Janus.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm5x5b6ftplq474aqtoph.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm5x5b6ftplq474aqtoph.png" alt="user flow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Architecture diagram:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F995eqhli7cip4qv0g517.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F995eqhli7cip4qv0g517.png" alt="architecture diag"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Ticket Classifier Agent predicts structured metadata in JSON format which can be parsed directly in python using &lt;code&gt;json.loads()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The Support Agent handles ongoing chat with context from the Knowledge Base&lt;/li&gt;
&lt;li&gt;Both AI Agents are powered by MindsDB which manages the AI and KB layers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more information about the architecture of Janus, visit &lt;a href="https://deepwiki.com/k0msenapati/janus/3-architecture" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/xSJRbmtMBGI"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UI:&lt;/strong&gt; Streamlit
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI &amp;amp; KB Layer:&lt;/strong&gt; MindsDB
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vector Database:&lt;/strong&gt; ChromaDB
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM Provider:&lt;/strong&gt; Nebius
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Programming Language:&lt;/strong&gt; Python&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The connection between Streamlit and MindsDB is handled via the MindsDB Python SDK.&lt;/p&gt;
&lt;h3&gt;
  
  
  AI Setup
&lt;/h3&gt;

&lt;p&gt;MindsDB integrates with external AI providers (having OpenAI  compatible APIs) for model inference.&lt;br&gt;&lt;br&gt;
For this project, &lt;a href="https://nebius.com/" rel="noopener noreferrer"&gt;Nebius&lt;/a&gt; was used as the provider endpoint.&lt;br&gt;
The LLM used is &lt;strong&gt;Qwen/Qwen3-235B-A22B-Thinking-2507&lt;/strong&gt;, and the embedding model is &lt;strong&gt;Qwen/Qwen3-Embedding-8B&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Two MindsDB AI Agents power the workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ticket Classifier&lt;/strong&gt; – Predicts metadata such as type, category, and priority.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support Agent&lt;/strong&gt; – Generates AI responses using the Knowledge Base for context.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Knowledge Base combines a vector database (ChromaDB) with embedding model for contextual retrieval.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“If you’d like to see my rough work including KB creation, AI agent logic, querying, and some files database operations check out the notebook &lt;a href="https://github.com/k0msenapati/janus/blob/main/notebook.ipynb" rel="noopener noreferrer"&gt;here&lt;/a&gt;.”&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Development Insights
&lt;/h2&gt;

&lt;p&gt;The most challenging part was preparing the prompt for the Ticket Classifier so that it outputs a valid JSON structure directly parsable with &lt;code&gt;json.loads()&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
This allowed seamless integration with Streamlit components and minimized post-processing.&lt;/p&gt;

&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Login Issue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Authentication"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"priority"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tag_1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tag_2"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"reset"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;MindsDB integration was straightforward, with its Python SDK providing simple APIs for agent calls and KB management.&lt;br&gt;&lt;br&gt;
Streamlit pages (for user and admin) are modular and can be accessed through the sidebar.&lt;/p&gt;


&lt;h2&gt;
  
  
  Impact
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Reduced response time as users get immediate AI replies
&lt;/li&gt;
&lt;li&gt;Consistent ticket classification ensuring better routing and tracking
&lt;/li&gt;
&lt;li&gt;Visual insights on ticket categories, priorities, and tag trends
&lt;/li&gt;
&lt;li&gt;Easier management of historical tickets through the Knowledge Base&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI acts as the first responder, handling repetitive issues and freeing human agents for complex cases.&lt;/p&gt;


&lt;h2&gt;
  
  
  Future Enhancements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web Search Integration:&lt;/strong&gt; Adding real-time data retrieval would make the AI agent more dynamic
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend Upgrade:&lt;/strong&gt; Creating a FastAPI backend for production scalability
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Third-Party Integrations:&lt;/strong&gt; Utilizing MindsDB data integrations such as Jira, Slack, or Gmail for enterprise integration&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Janus demonstrates how combining Streamlit’s simplicity with MindsDB’s AI and Knowledge Base capabilities can automate customer support end-to-end.&lt;br&gt;&lt;br&gt;
It showcases a modular architecture that can evolve into a production-ready multi-channel support system.&lt;/p&gt;



&lt;p&gt;Support by starring the repo.&lt;br&gt;


&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/k0msenapati" rel="noopener noreferrer"&gt;
        k0msenapati
      &lt;/a&gt; / &lt;a href="https://github.com/k0msenapati/janus" rel="noopener noreferrer"&gt;
        janus
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      AI-powered helpdesk system
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Janus&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Janus&lt;/strong&gt; is an AI-powered helpdesk system that makes customer support faster and smarter. It helps users raise support tickets, get instant AI replies, and lets admins manage everything from one simple dashboard.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Use Case&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Enterprise helpdesks spend hours triaging and responding to repetitive support requests
Janus automates the lifecycle:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Users submit tickets and chat with an AI support agent in real time.&lt;/li&gt;
&lt;li&gt;The system classifies intent, priority, and category automatically.&lt;/li&gt;
&lt;li&gt;Admins can visualize ticket trends, approve high-value cases into the Knowledge Base, and run searches across historical data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Reduced response time, consistent resolutions, and actionable insights.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;🎟️ User Portal&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Submit new support tickets.&lt;/li&gt;
&lt;li&gt;Get an instant AI-generated first response.&lt;/li&gt;
&lt;li&gt;Chat with the AI about your issue.&lt;/li&gt;
&lt;li&gt;View all your previous tickets in one place.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;🧠 Admin Portal&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;View visual dashboards showing ticket trends.&lt;/li&gt;
&lt;li&gt;Review and manage tickets — approve useful ones for the Knowledge Base or delete…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/k0msenapati/janus" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;If you found this article useful, share it with your peers and community to spread the word about this.&lt;/p&gt;

&lt;p&gt;Follow me for more content like this!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.com/k0msenapati" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://github.com/k0msenapati" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://www.youtube.com/@k0msenapati" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frf0livnq0mgsenhinrvw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frf0livnq0mgsenhinrvw.gif" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mindsdb</category>
      <category>python</category>
      <category>nebius</category>
      <category>ai</category>
    </item>
    <item>
      <title>Real-Time Voice Meets RAG: Building a Domain-Specific AI Chatbot</title>
      <dc:creator>K Om Senapati </dc:creator>
      <pubDate>Wed, 23 Jul 2025 15:37:42 +0000</pubDate>
      <link>https://dev.to/k0msenapati/real-time-voice-meets-rag-building-a-domain-specific-ai-chatbot-5heh</link>
      <guid>https://dev.to/k0msenapati/real-time-voice-meets-rag-building-a-domain-specific-ai-chatbot-5heh</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/assemblyai-2025-07-16"&gt;AssemblyAI Voice Agents Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Built a small side project recently: a voice-based chatbot that answers sociology questions using a domain-trained RAG agent. It’s called Sociopal.&lt;/p&gt;

&lt;p&gt;It’s powered by LangGraph, does corrective RAG, and can also search the web when it doesn’t have the answer. AssemblyAI handles speech-to-text, and ElevenLabs takes care of the speech output.&lt;/p&gt;

&lt;p&gt;You ask a sociology-related question using your voice. The app transcribes your voice to text, queries a backend agent trained on sociology docs, and gives a response. If the answer isn’t found in the vector DB, it falls back to web search and tries again.&lt;/p&gt;

&lt;p&gt;The final response is both displayed and spoken aloud using ElevenLabs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Not deployed yet, but here’s a short demo video:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/6pmtMsWisp4"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub Repository
&lt;/h2&gt;

&lt;p&gt;⭐ Github 👇&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/k0msenapati" rel="noopener noreferrer"&gt;
        k0msenapati
      &lt;/a&gt; / &lt;a href="https://github.com/k0msenapati/sociopal" rel="noopener noreferrer"&gt;
        sociopal
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Sociopal&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;A domain expert AI voice agent for sociology.&lt;/p&gt;

Learn more about Sociopal
&lt;p&gt;Sociopal is a Corrective RAG (CRAG) agent powered by a vectorDB containing curated sociology information and web search. It is designed to answer questions and provide detailed explanations related to sociology.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Technology Stack&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Frontend:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;AssemblyAI (speech-to-text)&lt;/li&gt;
&lt;li&gt;ElevenLabs (text-to-speech)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Backend:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FastAPI&lt;/li&gt;
&lt;li&gt;LangGraph&lt;/li&gt;
&lt;li&gt;Groq&lt;/li&gt;
&lt;li&gt;ChromaDB&lt;/li&gt;
&lt;li&gt;DuckDuckGo (web search)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Getting Started&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;1. Clone the Repository&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/k0msenapati/sociopal.git&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;2. Navigate to the Project Directory&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c1"&gt;cd&lt;/span&gt; sociopal&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Frontend Setup&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c1"&gt;cd&lt;/span&gt; ui
bun i
cp .env.example .env.local&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Fill in your ElevenLabs and AssemblyAI API keys in &lt;code&gt;.env.local&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Start the development server:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;bun dev&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Backend Setup&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c1"&gt;cd&lt;/span&gt; ../agent-py
uv sync
&lt;span class="pl-c1"&gt;source&lt;/span&gt; .venv/bin/activate
cp .env.example .env&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Fill in your Groq API key in &lt;code&gt;.env&lt;/code&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Index the Data&lt;/h4&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;uv run --active -m sociology_agent.index&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Run the Server&lt;/h4&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;uv run --active uvicorn sociology_agent.server:app --reload&lt;/pre&gt;

&lt;/div&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/k0msenapati/sociopal" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;Installation steps are included in the README.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Implementation
&lt;/h2&gt;

&lt;h4&gt;
  
  
  AssemblyAI Integration
&lt;/h4&gt;

&lt;p&gt;I’m using AssemblyAI’s &lt;strong&gt;Universal-Streaming API&lt;/strong&gt; to handle real-time voice input. Here’s the rough flow:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Getting a Temporary Token
&lt;/h3&gt;

&lt;p&gt;There's an API route (/api/token) that fetches a temporary token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://streaming.assemblyai.com/v3/token?expires_in_seconds=60`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Connecting via WebSocket
&lt;/h3&gt;

&lt;p&gt;Once the token is ready, a WebSocket connection is opened to stream audio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;wss&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//streaming.assemblyai.com/v3/ws?sample_rate=16000&amp;amp;formatted_finals=true&amp;amp;token=${token}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the frontend, I use &lt;code&gt;getUserMedia()&lt;/code&gt; to access the mic, then convert the audio to 16-bit PCM and send it over the socket. AssemblyAI returns transcripts in real time, which I display as the user speaks.&lt;/p&gt;

&lt;p&gt;It works smoothly with low latency, and transcripts are surprisingly accurate even with casual speech.&lt;/p&gt;

&lt;h4&gt;
  
  
  Backend Agent
&lt;/h4&gt;

&lt;p&gt;The backend runs a FastAPI app with a &lt;code&gt;/query&lt;/code&gt; route. It accepts user queries, passes them to the LangGraph agent, and returns the response.&lt;/p&gt;

&lt;p&gt;The agent uses corrective RAG, so if the first answer is incomplete or irrelevant, it will retry with a refined query. It’s also hooked up to a web search tool in case the answer isn’t in the vectorDB.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Building this was a fun way to explore how voice can enhance AI agents. Using real-time transcription with &lt;strong&gt;AssemblyAI&lt;/strong&gt; and natural-sounding speech with &lt;strong&gt;ElevenLabs&lt;/strong&gt; made the voice interface smooth to implement.&lt;/p&gt;

&lt;p&gt;While this one is trained on sociology data, the setup is actually domain-agnostic. You can swap out the vector database with any other domain-specific content, and the agent will still work just as well.&lt;/p&gt;

&lt;p&gt;Definitely worth trying if you're into voice UIs or building smarter assistants.&lt;/p&gt;




&lt;p&gt;Thanks for reading, and I look forward to connecting with you again soon!&lt;/p&gt;

&lt;p&gt;Follow me for more content like this!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.com/k0msenapati" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://github.com/k0msenapati" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://www.youtube.com/@k0msenapati" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0g7uo9qwn3wiri2f8po4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0g7uo9qwn3wiri2f8po4.gif" alt="Bye"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>assemblyaichallenge</category>
      <category>ai</category>
      <category>api</category>
    </item>
    <item>
      <title>Building a Dashboard People Actually Want to Use</title>
      <dc:creator>K Om Senapati </dc:creator>
      <pubDate>Sat, 19 Jul 2025 12:43:38 +0000</pubDate>
      <link>https://dev.to/k0msenapati/building-a-dashboard-people-actually-want-to-use-5al2</link>
      <guid>https://dev.to/k0msenapati/building-a-dashboard-people-actually-want-to-use-5al2</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend/axero"&gt;Frontend Challenge: Office Edition sponsored by Axero, Holistic Webdev: Office Space&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built this responsive intranet dashboard for the fictional "Acme" company. My main idea was that a dashboard should be &lt;strong&gt;dynamic&lt;/strong&gt;; it shouldn't be a boring static page where you &lt;em&gt;already know&lt;/em&gt; what's there.&lt;/p&gt;

&lt;p&gt;To make it feel fresh, I added a big &lt;strong&gt;welcome **screen with a cool office photo, the current weather, and the time. Below that, I created different news sections to keep things lively: internal updates from the **Company&lt;/strong&gt; and &lt;strong&gt;Executives&lt;/strong&gt;, &lt;strong&gt;Learning announcements&lt;/strong&gt;, and even the latest &lt;strong&gt;Industry News&lt;/strong&gt; from outside sources.&lt;/p&gt;

&lt;p&gt;And since knowing your schedule is super important, I made sure to include sections for &lt;strong&gt;My Calendar&lt;/strong&gt; and &lt;strong&gt;My Tasks&lt;/strong&gt; right on the dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;You can visit to this GitHub Pages deployment for a full screen experience:&lt;br&gt;
&lt;a href="https://k0msenapati.github.io/company-intranet/" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Live Site&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;⭐ GitHub Repo 👇&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/k0msenapati" rel="noopener noreferrer"&gt;
        k0msenapati
      &lt;/a&gt; / &lt;a href="https://github.com/k0msenapati/company-intranet" rel="noopener noreferrer"&gt;
        company-intranet
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A company intranet dashboard UI created with HTML and CSS (+ Bootstrap).
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Company Intranet Dashboard&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;A company intranet dashboard UI created with HTML and CSS (+ Bootstrap).&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Built with&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/f93eb0110e81caad9bf887bc3a1665d72e11e9b18999c017607909162bf3bd9d/68747470733a2f2f736b696c6c69636f6e732e6465762f69636f6e733f693d68746d6c2c6373732c626f6f747374726170"&gt;&lt;img src="https://camo.githubusercontent.com/f93eb0110e81caad9bf887bc3a1665d72e11e9b18999c017607909162bf3bd9d/68747470733a2f2f736b696c6c69636f6e732e6465762f69636f6e733f693d68746d6c2c6373732c626f6f747374726170" alt="Tech Stack"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/k0msenapati/company-intranet" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;I started with the sidebar and the top navbar first. The trickiest part was making it responsive. I’m happy with how I moved the user's profile icon out of the navbar and into the sidebar for the desktop view, it just felt cleaner.&lt;/p&gt;

&lt;p&gt;For the main dashboard, I got ideas from different templates (from dribble, axero, etc) and decided on this cards layout. I built it layer by layer, starting with finding that cool office photo for the background.&lt;/p&gt;

&lt;p&gt;Creating the info cards was the fun part. Using Bootstrap made it so much easier.&lt;/p&gt;




&lt;p&gt;Thanks for reading, and I look forward to connecting with you again soon!&lt;/p&gt;

&lt;p&gt;Follow me for more content like this!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.com/k0msenapati" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://github.com/k0msenapati" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://www.youtube.com/@k0msenapati" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdmjwqezilgnqjwk55cx8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdmjwqezilgnqjwk55cx8.gif" alt="Bye gif"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>frontendchallenge</category>
      <category>css</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Office Desk - CSS Art Edition</title>
      <dc:creator>K Om Senapati </dc:creator>
      <pubDate>Thu, 17 Jul 2025 06:55:12 +0000</pubDate>
      <link>https://dev.to/k0msenapati/office-desk-css-art-edition-4k5p</link>
      <guid>https://dev.to/k0msenapati/office-desk-css-art-edition-4k5p</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend/axero"&gt;Frontend Challenge: Office Edition sponsored by Axero, CSS Art: Office Culture&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspiration
&lt;/h2&gt;

&lt;p&gt;I wanted to make a small, neat digital workspace. Something that looks calm, clean, and a bit personal. I enjoy plants and simple art, so I added those. I kept everything light and minimal so it's easy on the eyes and feels good to look at.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/kom_senapati/embed/GRzZmzW?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;You can visit to this GitHub Pages deployment for a full screen experience:&lt;br&gt;
&lt;a href="https://k0msenapati.github.io/office-art/" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Live Site&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;⭐ GitHub Repo 👇&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/k0msenapati" rel="noopener noreferrer"&gt;
        k0msenapati
      &lt;/a&gt; / &lt;a href="https://github.com/k0msenapati/office-art" rel="noopener noreferrer"&gt;
        office-art
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A simple office desk created with HTML and CSS.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;CSS Office Art&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;A simple office desk created with HTML and CSS.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Built with&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/007af1a8712b7918f12c9fe2103fcf81e8bbda7e9a17726ee7ea3cc8d959fc8f/68747470733a2f2f736b696c6c69636f6e732e6465762f69636f6e733f693d68746d6c2c637373"&gt;&lt;img src="https://camo.githubusercontent.com/007af1a8712b7918f12c9fe2103fcf81e8bbda7e9a17726ee7ea3cc8d959fc8f/68747470733a2f2f736b696c6c69636f6e732e6465762f69636f6e733f693d68746d6c2c637373" alt="Tech Stack"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Credits&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lamp:&lt;/strong&gt; &lt;a href="https://codepen.io/hungry_ameteur/pen/PrdNqR" rel="nofollow noopener noreferrer"&gt;CodePen by hungry_ameteur&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plant Pot:&lt;/strong&gt; &lt;a href="https://codepen.io/Iam_DeepaliP/pen/porXvvL" rel="nofollow noopener noreferrer"&gt;CodePen by Iam_DeepaliP&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Font:&lt;/strong&gt; &lt;a href="https://fonts.google.com/specimen/Englebert" rel="nofollow noopener noreferrer"&gt;Englebert on Google Fonts&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Badge:&lt;/strong&gt; &lt;a href="https://github.com/ArnavK-09/add-github-badge" rel="noopener noreferrer"&gt;add-github-badge by ArnavK-09&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Images:&lt;/strong&gt; &lt;a href="https://pexels.com" rel="nofollow noopener noreferrer"&gt;Pexels&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/k0msenapati/office-art" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;I started with a basic desk and added each item one by one:&lt;/p&gt;

&lt;p&gt;First, I added the computer, keyboard, and mouse.&lt;br&gt;
Then I placed a water bottle and a small stack of papers with a pen.&lt;br&gt;
I added a lamp to use during late-night work.&lt;br&gt;
Finally, I put a plant in a pot. I really like plants, so I had to include one.&lt;br&gt;
After that, I made a simple animated background. I added two posters from Pexels, one with leaves and one with clouds. The font I used for the title is called Englebert. I found it on Google Fonts and liked how it looked.&lt;/p&gt;

&lt;p&gt;I also checked CodePen for ideas and used parts from two pens to help with the lamp and plant. There are many other things I could add like a chair, bookshelf, or headphones, but I wanted to keep it simple.&lt;/p&gt;

&lt;p&gt;Each thing has a reason. The papers are for quick notes, the bottle is to stay hydrated, the lamp is for focus, and the plant is just something I enjoy having around.&lt;/p&gt;

&lt;p&gt;
  Credits
  &lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lamp:&lt;/strong&gt; &lt;a href="https://codepen.io/hungry_ameteur/pen/PrdNqR" rel="noopener noreferrer"&gt;CodePen by hungry_ameteur&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plant Pot:&lt;/strong&gt; &lt;a href="https://codepen.io/Iam_DeepaliP/pen/porXvvL" rel="noopener noreferrer"&gt;CodePen by Iam_DeepaliP&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Font:&lt;/strong&gt; &lt;a href="https://fonts.google.com/specimen/Englebert" rel="noopener noreferrer"&gt;Englebert on Google Fonts&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Badge:&lt;/strong&gt; &lt;a href="https://github.com/ArnavK-09/add-github-badge" rel="noopener noreferrer"&gt;add-github-badge by ArnavK-09&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Images:&lt;/strong&gt; &lt;a href="https://pexels.com" rel="noopener noreferrer"&gt;Pexels&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;/p&gt;
&lt;p&gt;Thanks for reading, and I look forward to connecting with you again soon!&lt;/p&gt;

&lt;p&gt;Follow me for more content like this!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.com/k0msenapati" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://github.com/k0msenapati" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://www.youtube.com/@k0msenapati" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fouiydv1l0kdw2sqjpcsg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fouiydv1l0kdw2sqjpcsg.gif" alt="Bye"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>frontendchallenge</category>
      <category>devchallenge</category>
      <category>css</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Building a Smart Knowledge Platform with MindsDB</title>
      <dc:creator>K Om Senapati </dc:creator>
      <pubDate>Sun, 22 Jun 2025 13:58:29 +0000</pubDate>
      <link>https://dev.to/k0msenapati/building-a-smart-knowledge-platform-with-mindsdb-5anb</link>
      <guid>https://dev.to/k0msenapati/building-a-smart-knowledge-platform-with-mindsdb-5anb</guid>
      <description>&lt;p&gt;Working with structured data like CSVs or JSON often means writing queries, managing schemas, and building pipelines just to answer simple questions. If you want to make that data interactive like asking natural language questions or building an AI agent on top of it, things get complicated fast. You usually need to write code, understand vector stores, manage embeddings, and stitch tools together.&lt;/p&gt;

&lt;p&gt;That’s the problem I faced.&lt;/p&gt;

&lt;p&gt;I wanted a simple way to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload structured data&lt;/li&gt;
&lt;li&gt;Turn it into something queryable with natural language&lt;/li&gt;
&lt;li&gt;Build an AI agent that could talk about that data&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Solution: MindsDB
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fusiglzv9er20d7wjyv47.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fusiglzv9er20d7wjyv47.png" alt="Mindsdb Logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s where MindsDB came in.&lt;/p&gt;

&lt;p&gt;MindsDB recently added support for Knowledge Bases (KBs). You can now ingest structured data into a KB, use an embedding model (cloud or local), and build multi-step workflows or AI agents on top of it without writing code.&lt;/p&gt;

&lt;p&gt;This release immediately clicked with me. I had already used MindsDB’s AI Table feature to build a quiz app. It lets you interact LLMs so I was familiar with the platform and trusted its approach.&lt;/p&gt;

&lt;p&gt;With this KBs + Agents integration, I no longer needed to code the whole pipeline. I just wrote a couple of SQL queries in the MindsDB GUI, and voilà — I had an AI agent ready to go.&lt;/p&gt;

&lt;h3&gt;
  
  
  MindsDB Philosophy
&lt;/h3&gt;

&lt;p&gt;What I especially liked is how MindsDB thinks about data and intelligence. Their philosophy is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Connect&lt;/strong&gt;: Connect data from hundreds of data sources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unify&lt;/strong&gt;: Unify data from multiple (structured and unstructured) data sources within MindsDB, enabling federated queries as if all data resides in a single database&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respond&lt;/strong&gt;: Use agents to give intelligent, context-aware responses from that unified data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dive into MindsDB 👉 &lt;a href="https://docs.mindsdb.com/mindsdb" rel="noopener noreferrer"&gt;MindsDB Docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a Python, and SQL guy, this felt like the right mix of practicality and power.&lt;/p&gt;




&lt;h2&gt;
  
  
  About Agent Hub
&lt;/h2&gt;

&lt;p&gt;Agent Hub works with structured data: CSV and JSON, Knowledge Bases, and AI Agents.&lt;/p&gt;

&lt;h3&gt;
  
  
  Features:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;User can upload structured data.&lt;/li&gt;
&lt;li&gt;User can create a KB and ingest the data into it using any OpenAI-compatible API embedding model (cloud/local) or Ollama models.&lt;/li&gt;
&lt;li&gt;User can query/summarize the KB and also evaluate it from test_data.&lt;/li&gt;
&lt;li&gt;User can add JOBS to ingest data from a data source into the KB.&lt;/li&gt;
&lt;li&gt;User can create AI Agents and chat with them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For structured data, I needed a database. I found out that MindsDB has a &lt;code&gt;files&lt;/code&gt; database, which is perfect for storing user-uploaded data files.&lt;/p&gt;

&lt;p&gt;Then I created a mini &lt;a href="https://github.com/k0msenapati/agent-hub/tree/master/mindsdb" rel="noopener noreferrer"&gt;MindsDB package&lt;/a&gt; to encompass all the MindsDB logic using the MindsDB Python SDK and SQL queries to do all the operations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a project for each user&lt;/li&gt;
&lt;li&gt;Prefix files with the username&lt;/li&gt;
&lt;li&gt;Create KBs&lt;/li&gt;
&lt;li&gt;Ingest data into KBs&lt;/li&gt;
&lt;li&gt;Delete KBs&lt;/li&gt;
&lt;li&gt;Query and summarize the KB using AI Table&lt;/li&gt;
&lt;li&gt;Evalauate KBs&lt;/li&gt;
&lt;li&gt;Setup JOB for data ingestion&lt;/li&gt;
&lt;li&gt;Create and use AI Agents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then I created a simple Flask app which used a SQLite database and SQLAlchemy as the ORM. I used HTML Jinja2 templates. Yeah, no frontend framework.&lt;br&gt;
Python is 💖.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/k0msenapati" rel="noopener noreferrer"&gt;
        k0msenapati
      &lt;/a&gt; / &lt;a href="https://github.com/k0msenapati/agent-hub" rel="noopener noreferrer"&gt;
        agent-hub
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Agent Hub is an AI collaboration platform designed to transform your data into intelligent AI agents.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🤖 Agent Hub&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-alert markdown-alert-note"&gt;
&lt;p class="markdown-alert-title"&gt;Note&lt;/p&gt;
&lt;p&gt;Agent Hub is an AI collaboration platform designed to transform your data into intelligent AI agents. With Agent Hub, you can unlock powerful insights and automate tasks effortlessly by creating tailored AI agents, building comprehensive knowledge bases, and managing your data files seamlessly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎬 Project Showcase&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Demo Video&lt;/th&gt;
&lt;th&gt;Blog Post&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=QJCWjR2hZ20" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/930160b0eb819f26dccee174d756794c5b4e35bed1651f4f51f4f90d040af379/687474703a2f2f692e7974696d672e636f6d2f76692f514a43576a5232685a32302f687164656661756c742e6a7067" alt="YouTube"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.to/k0msenapati/building-a-smart-knowledge-platform-with-mindsdb-5anb" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/28327308455cdf704f1d216efdee8bea35341ff0c2415a646ab56398190462fa/68747470733a2f2f6d65646961322e6465762e746f2f64796e616d69632f696d6167652f77696474683d313030302c6865696768743d3432302c6669743d636f7665722c677261766974793d6175746f2c666f726d61743d6175746f2f68747470732533412532462532466465762d746f2d75706c6f6164732e73332e616d617a6f6e6177732e636f6d25324675706c6f61647325324661727469636c65732532463561696b66336d306773356a666d736e683567762e706e67" alt="Blog"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🌟 Features&lt;/h2&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Agent Hub&lt;/strong&gt; features intro:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Agents&lt;/strong&gt; – Create and manage AI agents tailored to your specific needs for intelligent responses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge Bases&lt;/strong&gt; – Build comprehensive knowledge bases from your data for efficient querying and insights.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File Management&lt;/strong&gt; – Upload and organize your files to integrate seamlessly with AI processes.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;💻 Installation&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Follow these steps to set up and run Agent Hub:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Setup MindsDB and Ollama with Docker&lt;/strong&gt; (docker-compose.yml is provided):&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;docker-compose up -d&lt;/pre&gt;

&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install nomic-embed-text in Ollama container&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;docker &lt;span class="pl-c1"&gt;exec&lt;/span&gt; ollama ollama pull nomic-embed-text&lt;/pre&gt;

&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create KB Summarizer Model and Connect Pgvector in MindsDB&lt;/strong&gt;…&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/k0msenapati/agent-hub" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  Challenges
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;I ran into an issue with MindsDB when performing operations on a KB using an embedding model from Ollama. It would throw an &lt;strong&gt;"Event Loop Closed"&lt;/strong&gt; error on the first attempt. Strangely, repeating the same operation a second time worked just fine. So, I handled that in the app using a simple &lt;code&gt;try-catch&lt;/code&gt; with a retry.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For the frontend, I kind of vibe-coded the Jinja2 templates. But hey, the idea is mine 😜&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Building this was fairly easy as all the heavy lifting is done by MindsDB.&lt;br&gt;
I just had to trigger the right queries from the Flask backend.&lt;/p&gt;




&lt;h2&gt;
  
  
  Use Cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Upload structured data like logs, reports, or exports&lt;/li&gt;
&lt;li&gt;Query or summarize data with natural language&lt;/li&gt;
&lt;li&gt;Create intelligent agents trained on your data&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This is just an MVP, but it opens up a lot of possibilities.&lt;/p&gt;

&lt;p&gt;Right now, it works with structured data like CSV and JSON but it can easily be extended to handle other formats like web pages, PDFs, or Word docs. MindsDB’s Connect layer also makes it easy to bring in data from external databases and APIs, so the potential to scale and integrate is built-in.&lt;/p&gt;

&lt;p&gt;What I’ve built is a starting point: a way to turn raw, structured data into something intelligent. It’s simple, but powerful. And with MindsDB handling the heavy lifting, it’s also surprisingly easy to build.&lt;/p&gt;

&lt;p&gt;If you found this article useful, share it with your peers and community to spread the word about this.&lt;/p&gt;

&lt;p&gt;Follow me for more content like this!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.com/k0msenapati" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://github.com/k0msenapati" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://www.youtube.com/@k0msenapati" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd2asgwusmhdfi8aru3e2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd2asgwusmhdfi8aru3e2.gif" alt="bye bye gif"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>mindsdb</category>
      <category>programming</category>
    </item>
    <item>
      <title>Building Dissi with Agno and MCP</title>
      <dc:creator>K Om Senapati </dc:creator>
      <pubDate>Sat, 19 Apr 2025 06:22:51 +0000</pubDate>
      <link>https://dev.to/k0msenapati/building-dissi-with-agno-and-mcp-4044</link>
      <guid>https://dev.to/k0msenapati/building-dissi-with-agno-and-mcp-4044</guid>
      <description>&lt;h2&gt;
  
  
  Why AI agents are hot right now ?
&lt;/h2&gt;

&lt;p&gt;I'm sure you've heard about AI agents at least once in 2025. They're gaining popularity due to their ability to make decisions, automate tasks, and collaborate with humans or other agents—leading to higher productivity.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Dissi&lt;/strong&gt;, an AI agent that can manage your Discord server. It can also perform web searches and post the findings to specific channels or forum posts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are AI Agents?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo2rgyg92m75aocmm38t6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo2rgyg92m75aocmm38t6.png" alt=" "&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Credits go to Abhishek Reddy (Medium)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;An Ai agent is a software system that autonomously performs tasks on behalf of a user. It uses a &lt;strong&gt;Large Language Model (LLM)&lt;/strong&gt; at its core for understanding, decision-making, and interacting with external environments.&lt;/p&gt;

&lt;p&gt;Ai agents are capable of reasoning, acting, and learning in real time.&lt;/p&gt;

&lt;p&gt;There are several key components in an Ai agent like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tools&lt;/strong&gt; - functions that an Agent can run like searching the web, running SQL, sending an email or calling APIs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Storage&lt;/strong&gt; - help us save Agent sessions and state to a database or file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Knowledge&lt;/strong&gt; - domain-specific information that the Agent can search at runtime to make better decisions and provide accurate responses.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  What is MCP?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhf4h8fz3agsyo1h2tql6.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhf4h8fz3agsyo1h2tql6.gif" alt="MCP server sdks"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Credits go to Avi Chawla (dailydoseofds)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;MCP stands for &lt;strong&gt;Model Context Protocol&lt;/strong&gt;. It is a &lt;em&gt;standardized framework&lt;/em&gt; designed to enhance the capabilities of AI agents by enabling them to securely and efficiently access a wide range of external tools such as applications, databases, APIs, and processes.&lt;/p&gt;

&lt;p&gt;MCP bridges agents and tools via:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MCP Clients&lt;/strong&gt;: Interface embedded in AI applications (e.g., IDEs, chatbots) to connect with servers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MCP Servers&lt;/strong&gt;: Backend programs that provide tools, data, and context to agents. For example, a Discord MCP server enables server management and sending messages to a discord server.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Tools vs MCP Servers
&lt;/h3&gt;

&lt;p&gt;Developers typically create tools manually to give agents access to external services. This process is tedious and language-dependent.&lt;/p&gt;

&lt;p&gt;MCP servers, on the other hand, are easier to build and work with all MCP-compatible agents.&lt;/p&gt;

&lt;p&gt;Here’s a quick comparison:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Individual Tools&lt;/th&gt;
&lt;th&gt;MCP Servers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scope&lt;/td&gt;
&lt;td&gt;Single functionality (e.g., search)&lt;/td&gt;
&lt;td&gt;Centralized hub for multiple tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integration&lt;/td&gt;
&lt;td&gt;Manual coding per tool&lt;/td&gt;
&lt;td&gt;Standardized protocol for all tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalability&lt;/td&gt;
&lt;td&gt;Complex to add new tools&lt;/td&gt;
&lt;td&gt;Add tools via configuration files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Execution Model&lt;/td&gt;
&lt;td&gt;Agent directly invokes tools&lt;/td&gt;
&lt;td&gt;Server handles tool chaining/autonomy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Currently MCP servers can be built using Python, Typescript, C#, Java and Kotlin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F14lq8ls1b0r0x3e5x6ed.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F14lq8ls1b0r0x3e5x6ed.png" alt="MCP server sdks"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are already many MCP servers built by community - &lt;a href="https://github.com/modelcontextprotocol/servers" rel="noopener noreferrer"&gt;List of MCP servers&lt;/a&gt;. Maybe check this list before creating your own MCP server!&lt;/p&gt;


&lt;h2&gt;
  
  
  How to Build Your Own AI Agent?
&lt;/h2&gt;

&lt;p&gt;You might be thinking: "&lt;em&gt;This sounds hard! How do I build my own AI agent as a dev?&lt;/em&gt;"&lt;br&gt;
That’s where &lt;strong&gt;AI agent frameworks&lt;/strong&gt; come in.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An AI agent framework is a development toolkit that simplifies the process of building LLM-powered systems.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Meet Agno&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbebqn2ktsnypj4awkuie.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbebqn2ktsnypj4awkuie.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agno is a lightweight library for building Agents with memory, knowledge, tools and reasoning. &lt;br&gt;
Agno provides feature for implementing all the aspects of ai agents. You can add your favorite LLM, storage, knowledge base, tools and even attach MCP servers to ai agents.&lt;/p&gt;

&lt;p&gt;It has amazing documentation for building AI agents. Check it out now: &lt;a href="https://docs.agno.com/introduction" rel="noopener noreferrer"&gt;Agno Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They also have an amazing community in discord. Make sure to join: &lt;a href="https://discord.gg/J8saRyVWqn" rel="noopener noreferrer"&gt;Agno Discord&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of my favorite things about Agno is the &lt;a href="https://docs.agno.com/agent-ui/introduction" rel="noopener noreferrer"&gt;Agent UI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It provides a beautiful interface for interacting with your AI agents. You can simply create your AI agent and start using it through Agent UI!&lt;/p&gt;


&lt;h2&gt;
  
  
  Dissi
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Let me introduce Dissi again&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dissi is an AI agent that interacts with your discord servers. It has ability of sending or deleting messages, forum posts, reactions and much more. And it also has access to web search and news tools provided by duckduckgo.&lt;/p&gt;

&lt;p&gt;You might be wondering how I got access to so many Discord tools.&lt;br&gt;
Well, here is the &lt;a href="https://github.com/barryyip0625/mcp-discord" rel="noopener noreferrer"&gt;secret&lt;/a&gt; MCP server I used for Dissi. It provided me a vast array of discord tools.&lt;/p&gt;

&lt;p&gt;Of course I used Agent UI to interact with Dissi.&lt;/p&gt;

&lt;p&gt;Here’s a simple flowchart to give you a better idea:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3bfa4fgp1dg29mlbeeqo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3bfa4fgp1dg29mlbeeqo.png" alt="Dissi flowchart"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can check out the GitHub repository here:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/k0msenapati" rel="noopener noreferrer"&gt;
        k0msenapati
      &lt;/a&gt; / &lt;a href="https://github.com/k0msenapati/dissi" rel="noopener noreferrer"&gt;
        dissi
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Dissi is a high-performance, real-time communication agent powered by Groq and built with Agno, designed to interact with Discord servers using natural language.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;💬 Dissi – Real-Time Discord Agent with Web Search&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Dissi&lt;/strong&gt; is a high-performance, real-time communication agent powered by &lt;strong&gt;Groq&lt;/strong&gt; and built with &lt;strong&gt;Agno&lt;/strong&gt;, designed to interact with Discord servers using natural language. Equipped with Discord tools and DuckDuckGo search, it allows you to control server actions like reading/sending messages, managing threads, reactions, and more — all from a simple chat UI.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Demo Video&lt;/th&gt;
&lt;th&gt;Blog Post&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://youtu.be/pjPW77G3DI0" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/15c00eb393a1001f1222c7679d68cbce1fb8f40408996b04f8a7d28e359901e7/687474703a2f2f692e7974696d672e636f6d2f76692f706a5057373747334449302f687164656661756c742e6a7067" alt="YouTube"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.to/k0msenapati/building-dissi-with-agno-and-mcp-4044" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/9b311699e09164b81fd8fda58abc6bffe89e7320664ae78bf1dfaaa322dcc53e/68747470733a2f2f6d65646961322e6465762e746f2f64796e616d69632f696d6167652f77696474683d313030302c6865696768743d3432302c6669743d636f7665722c677261766974793d6175746f2c666f726d61743d6175746f2f68747470732533412532462532466465762d746f2d75706c6f6164732e73332e616d617a6f6e6177732e636f6d25324675706c6f61647325324661727469636c6573253246786b667567666f6967306369663532696d7273672e706e67" alt="Blog"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚀 Installation &amp;amp; Running&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;1. Setup Environment Variables&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;Create a &lt;code&gt;.env&lt;/code&gt; file based on &lt;code&gt;.env.example&lt;/code&gt; and fill in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GROQ_API_KEY&lt;/code&gt; – Your Groq API key&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DISCORD_BOT_TOKEN&lt;/code&gt; – Your Discord bot token&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;2. Clone MCP Discord Server Integration&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/barryyip0625/mcp-discord.git
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; mcp-discord

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Install dependencies&lt;/span&gt;
npm install

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Compile TypeScript&lt;/span&gt;
npm run build&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;3. Prepare Python Environment&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;uv venv
uv sync&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;4. Clone &amp;amp; Run the Agent UI&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npx create-agent-ui@latest
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Enter 'y' when prompted to create a new project&lt;/span&gt;
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Follow the CLI to&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/k0msenapati/dissi" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Make sure to ⭐ it.&lt;/p&gt;

&lt;p&gt;📺 Demo&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/pjPW77G3DI0"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Also you can vote for this project in Quira.&lt;br&gt;
&lt;a href="https://quira.sh/repo/kom-senapati-dissi-968131405?utm_source=copy&amp;amp;utm_share_context=quests_repos" rel="noopener noreferrer"&gt;Voting link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This link may not work properly. So you can first login at &lt;a href="https://quira.sh/" rel="noopener noreferrer"&gt;quira.sh&lt;/a&gt; then click the voting link!&lt;/p&gt;




&lt;p&gt;Building Dissi was a fun way to explore what AI agents can really do. With tools like Groq, Agno, and MCP, creating helpful, real-time assistants is more possible than ever.&lt;/p&gt;

&lt;p&gt;There’s still a lot to improve, but this is just the beginning. I hope Dissi shows how AI can make everyday tools like Discord more powerful and fun to use.&lt;/p&gt;

&lt;p&gt;Let me know if you have any other ideas or if you have built any agents before.&lt;/p&gt;

&lt;p&gt;Thanks for reading, and I look forward to connecting with you again soon!&lt;/p&gt;

&lt;p&gt;Join the Quira discord community. &lt;a href="http://discord.gg/quira" rel="noopener noreferrer"&gt;Quira Discord&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Participate in Quira &lt;a href="https://quira.sh/quests/creator/submissions?questId=25" rel="noopener noreferrer"&gt;Quest 25&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff43lnsyqmxmg8ppl5rgz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff43lnsyqmxmg8ppl5rgz.png" alt="Quest 25"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me for more content like this!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.com/kom_senapati" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://github.com/kom-senapati" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://www.youtube.com/@kom_senapati" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>discord</category>
      <category>agno</category>
    </item>
    <item>
      <title>Building Talk-to-Page: Chat or Talk with Any Website</title>
      <dc:creator>K Om Senapati </dc:creator>
      <pubDate>Mon, 06 Jan 2025 04:32:16 +0000</pubDate>
      <link>https://dev.to/k0msenapati/building-talk-to-page-chat-or-talk-with-any-website-g0h</link>
      <guid>https://dev.to/k0msenapati/building-talk-to-page-chat-or-talk-with-any-website-g0h</guid>
      <description>&lt;p&gt;Ever thought of chatting with a webpage or literally talking to it? Well, I built an app that does just that! It’s called &lt;strong&gt;Talk-to-Page&lt;/strong&gt;. You simply input a URL, and you can start a conversation with the page.  &lt;/p&gt;

&lt;p&gt;Here’s a quick demo of how it works:  &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/O0Y2WEqkros"&gt;
&lt;/iframe&gt;
  &lt;/p&gt;


&lt;h3&gt;
  
  
  Why Did I Build This?
&lt;/h3&gt;

&lt;p&gt;Chatbots are cool, but they’re not perfect. Most don’t understand the specific details of a web page. If you build a chatbot with Retrieval Augmented Generation (RAG), it often feels limited. You set it up for one page, and it’s stuck with that static content.  &lt;/p&gt;

&lt;p&gt;So, I thought: &lt;strong&gt;Why not make it dynamic?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
What if you could give the chatbot any URL and let it adapt on the go?  &lt;/p&gt;

&lt;p&gt;That’s how &lt;strong&gt;Talk-to-Page&lt;/strong&gt; was born!  &lt;/p&gt;


&lt;h3&gt;
  
  
  How It Came Together
&lt;/h3&gt;

&lt;p&gt;I used my &lt;strong&gt;coagents-starter&lt;/strong&gt; kit as the foundation. It’s a setup I built for creating full-stack apps with AI agents using LangGraph and CopilotKit.  &lt;/p&gt;

&lt;p&gt;Here’s the starter kit, in case you want to check it out:&lt;br&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/k0msenapati" rel="noopener noreferrer"&gt;
        k0msenapati
      &lt;/a&gt; / &lt;a href="https://github.com/k0msenapati/coagents-starter" rel="noopener noreferrer"&gt;
        coagents-starter
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🤖 Starter kit for building agentic full-stack apps
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;CoAgents Starter&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;This example contains a simple starter project.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;These instructions assume you are in the &lt;code&gt;coagents-starter/&lt;/code&gt; directory&lt;/strong&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Running the Agent&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;First, install the dependencies:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c1"&gt;cd&lt;/span&gt; agent
poetry install&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Then, create a &lt;code&gt;.env&lt;/code&gt; file inside &lt;code&gt;./agent&lt;/code&gt; with the following:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;GROQ_API_KEY=...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, run the demo:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;poetry run demo&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Running the UI&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;First, install the dependencies:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c1"&gt;cd&lt;/span&gt; ./ui
pnpm i&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Then, create a &lt;code&gt;.env&lt;/code&gt; file inside &lt;code&gt;./ui&lt;/code&gt; with the following:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;GROQ_API_KEY=...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, run the Next.js project:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;pnpm run dev&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Navigate to &lt;a href="http://localhost:3000" rel="nofollow noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LangGraph Studio&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;Run LangGraph studio, then load the &lt;code&gt;./agent&lt;/code&gt; folder into it.&lt;/p&gt;
&lt;p&gt;Make sure to create teh &lt;code&gt;.env&lt;/code&gt; mentioned above first!&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Troubleshooting&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;A few things to try if you are running into trouble:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Make sure there is no other local application server running on the 8000 port.&lt;/li&gt;
&lt;li&gt;Under &lt;code&gt;/agent/my_agent/demo.py&lt;/code&gt;, change &lt;code&gt;0.0.0.0&lt;/code&gt; to &lt;code&gt;127.0.0.1&lt;/code&gt; or to &lt;code&gt;localhost&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/k0msenapati/coagents-starter" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
  

&lt;p&gt;The backend uses &lt;strong&gt;FastAPI&lt;/strong&gt; for deploying the LangGraph agent, while the frontend is built with &lt;strong&gt;Next.js&lt;/strong&gt;.  &lt;/p&gt;




&lt;h4&gt;
  
  
  Building the Agent
&lt;/h4&gt;

&lt;p&gt;The first step was to create the agent. I followed a modular approach, breaking it into smaller parts like state, nodes, and edges. You can see the folder structure here:&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/kom-senapati/talk-to-page/tree/main/agent" rel="noopener noreferrer"&gt;Agent Code&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;I renamed &lt;code&gt;my_agent&lt;/code&gt; to &lt;code&gt;rag_agent&lt;/code&gt;. This meant updating the name everywhere—folders, files (like &lt;code&gt;demo.py&lt;/code&gt;), and config (like &lt;code&gt;langgraph.json&lt;/code&gt; and &lt;code&gt;pyproject.toml&lt;/code&gt;).  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Url Updating stuff:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node:&lt;/strong&gt; I added a new node called &lt;code&gt;update_url&lt;/code&gt; that updates the agent’s retriever whenever the URL changes.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge:&lt;/strong&gt; Created an edge called &lt;code&gt;new_url&lt;/code&gt; that listens for a "URL UPDATED" message and triggers the &lt;code&gt;update_url&lt;/code&gt; node to update the retriever.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Except that it's a self-RAG agent. You can check out its tutorial and code &lt;a href="https://langchain-ai.github.io/langgraph/tutorials/rag/langgraph_self_rag/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here’s what the final agent graph looks like:  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbnis5wr6c28m6zhqccz3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbnis5wr6c28m6zhqccz3.png" alt="graph-img" width="800" height="856"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h4&gt;
  
  
  Building the UI
&lt;/h4&gt;

&lt;p&gt;The UI was fairly straightforward, but I wanted to make it interesting. Instead of using CopilotKit’s built-in copilot, I built a &lt;strong&gt;custom chat-bot interface&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;You can find the code here:&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/kom-senapati/talk-to-page/blob/main/ui/components/chat-interface.tsx" rel="noopener noreferrer"&gt;Custom Chat Interface&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;For backgrounds, I added a &lt;strong&gt;retro grid background&lt;/strong&gt; using &lt;a href="https://magicui.design/docs/components/retro-grid" rel="noopener noreferrer"&gt;Magic UI’s Retro Grid&lt;/a&gt;. I also implemented a &lt;strong&gt;Matrix Rain background&lt;/strong&gt; using &lt;a href="https://v0.dev" rel="noopener noreferrer"&gt;v0.dev&lt;/a&gt; which remained active for 5s when the URL was updated.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Voice Interaction:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
For a better experience than that of a normal chatbot, I added the following:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Speech-to-text&lt;/strong&gt; for user input.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text-to-speech&lt;/strong&gt; for AI responses.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So now, you can literally &lt;em&gt;talk&lt;/em&gt; to a webpage. Cool, right? 😉  &lt;/p&gt;


&lt;h4&gt;
  
  
  Getting It All Working
&lt;/h4&gt;

&lt;p&gt;The starter kit comes pre-configured with Tailwind CSS, Shadcn, and CopilotKit. For the agent to work, I just updated the agent name in &lt;code&gt;ui/app/layout.tsx&lt;/code&gt;.  &lt;/p&gt;


&lt;h3&gt;
  
  
  My Experience
&lt;/h3&gt;

&lt;p&gt;Building this app was a fun and rewarding experience. Learning &lt;strong&gt;LangGraph&lt;/strong&gt; and &lt;strong&gt;LangChain&lt;/strong&gt; took some time, but the CopilotKit integration was surprisingly smooth.  &lt;/p&gt;

&lt;p&gt;Big thanks to the &lt;a href="https://docs.copilotkit.ai/coagents" rel="noopener noreferrer"&gt;CopilotKit documentation&lt;/a&gt; for making things easy to follow!  &lt;/p&gt;



&lt;p&gt;That’s how I built &lt;strong&gt;Talk-to-Page&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;What do you think about this project? Would you build something similar? Let me know!&lt;/p&gt;

&lt;p&gt;Have a great day! Till next time!&lt;/p&gt;

&lt;p&gt;If you loved this, please star CopilotKit and talk-to-page :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/CopilotKit/CopilotKit" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Star CopilotKit ⭐&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/kom-senapati/talk-to-page" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Star talk-to-page 🤝&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Follow me for more content like this!&lt;/p&gt;

</description>
      <category>coagents</category>
      <category>copilotkit</category>
      <category>nextjs</category>
      <category>langchain</category>
    </item>
    <item>
      <title>Integrate Daytona in your NextJS app</title>
      <dc:creator>K Om Senapati </dc:creator>
      <pubDate>Thu, 05 Dec 2024 15:03:26 +0000</pubDate>
      <link>https://dev.to/komsenapati/integrate-dayotana-in-your-nextjs-app-36ei</link>
      <guid>https://dev.to/komsenapati/integrate-dayotana-in-your-nextjs-app-36ei</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Daytona is a secure and &lt;strong&gt;open-source&lt;/strong&gt; development environment manager that simplifies your workflow. Imagine starting development on a &lt;strong&gt;Next.js&lt;/strong&gt; app without the usual setup hassle. On average, developers lose &lt;strong&gt;56% of their time&lt;/strong&gt; setting up environments. Daytona eliminates that wasted time and lets you focus directly on coding.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.daytona.io/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fframerusercontent.com%2Fimages%2Fdbk8NXJZTDaQmlzEzM3pI1y98.png" height="402" class="m-0" width="800"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.daytona.io/" rel="noopener noreferrer" class="c-link"&gt;
          Daytona - Secure Infrastructure for Running AI-Generated Code
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Deploy AI code with confidence using Daytona's lightning-fast infrastructure. 200ms environment creation, stateful operations, and enterprise-grade security. Try now with $100 credit.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fframerusercontent.com%2Fimages%2F6WPclDLAHHQgPFeA2DRTW1OXVSU.png" width="192" height="192"&gt;
        daytona.io
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  Why Use Daytona?
&lt;/h2&gt;

&lt;p&gt;Daytona works with:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Any Git platform: GitHub, GitLab, Bitbucket
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Dgithub%2Cgitlab%2Cbitbucket" alt="My Skills" width="160" height="48"&gt;
&lt;/li&gt;
&lt;li&gt;Any IDE: Vim, VS Code, JetBrains IDEs
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Dvim%2Cvscode%2Cpycharm" alt="My Skills" width="160" height="48"&gt;
&lt;/li&gt;
&lt;li&gt;Anywhere: Localhost, AWS, Azure, GCP, Digital Ocean
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Daws%2Cazure%2Cgcp" alt="My Skills" width="160" height="48"&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The biggest advantage?
&lt;/h3&gt;

&lt;p&gt;You get a &lt;strong&gt;pre-configured environment&lt;/strong&gt; ready in seconds. Just run this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;daytona create &amp;lt;REPO_URL&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's it! Your environment is ready. Now you can focus on building features 📈 and fixing bugs 🐛.&lt;/p&gt;


&lt;h2&gt;
  
  
  Using Daytona for Recipe Genie
&lt;/h2&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;Install Daytona&lt;/strong&gt; using this &lt;a href="https://www.daytona.io/docs/installation/installation/" rel="noopener noreferrer"&gt;guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;2️⃣ &lt;strong&gt;Configure Daytona&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Connect Daytona to Your Git Repositories&lt;/strong&gt;&lt;br&gt;
To manage your code with version control, link Daytona to your Git provider like Github. Run this command in your terminal:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;daytona git-providers add
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 2: Install a Cloud Provider&lt;/strong&gt;&lt;br&gt;
If you need to create or manage cloud environments (like AWS, Azure, or GCP), install a provider using this command:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;daytona provider &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 3: Set a Target&lt;/strong&gt;&lt;br&gt;
A "Target" is where your development environment will run, like Docker (local or remote), AWS, GCP, or others. To choose one, use this command:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;daytona target &lt;span class="nb"&gt;set&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 4: Choose Your IDE&lt;/strong&gt;&lt;br&gt;
Daytona can connect to many IDEs like VS Code, IntelliJ, and more. To set your default IDE, run:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;daytona ide
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;3️⃣ &lt;strong&gt;Add &lt;code&gt;devcontainer.json&lt;/code&gt;&lt;/strong&gt; to the repository.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;.devcontainer/devcontainer.json&lt;/code&gt; file.  &lt;/p&gt;

&lt;p&gt;You can generate one &lt;a href="https://devcontainer.ai/" rel="noopener noreferrer"&gt;with ai&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here's the &lt;code&gt;devcontainer.json&lt;/code&gt; I used for &lt;strong&gt;Recipe Genie&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Recipe Genie Dev Container"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcr.microsoft.com/devcontainers/javascript-node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"forwardPorts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customizations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vscode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"settings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"terminal.integrated.defaultProfile.linux"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"files.autoSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"onWindowChange"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"editor.formatOnSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"extensions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"ms-azuretools.vscode-docker"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"ms-vscode-remote.remote-containers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"dbaeumer.vscode-eslint"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"dsznajder.es7-react-js-snippets"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"formulahendry.auto-rename-tag"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"bradlc.vscode-tailwindcss"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"christian-kohler.path-intellisense"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"ms-vscode.vscode-typescript-next"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"postCreateCommand"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm i"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;4️⃣ &lt;strong&gt;Create your workspace and project&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;daytona create &amp;lt;REPO_URL&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's it! Your environment is ready.&lt;/p&gt;

&lt;p&gt;To start development, simply run the following:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Some highlights of &lt;code&gt;devcontainer.json&lt;/code&gt; file:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pre-configured environment&lt;/strong&gt;: Uses the &lt;code&gt;javascript-node&lt;/code&gt; devcontainer image from Microsoft.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post-setup commands&lt;/strong&gt;: Automatically runs &lt;code&gt;npm i&lt;/code&gt; to install dependencies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VS Code settings&lt;/strong&gt;: Includes useful VSC settings and extensions for productive development, like Prettier, ESLint, and React/Next.js tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PORT forwarding&lt;/strong&gt;: Automatically forwards port 3000 to access the development server from the host machine.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Daytona simplifies development by automating environment setup. Try Daytona today and experience the difference!&lt;/p&gt;

&lt;p&gt;If you like this blog, show some love for Recipe Genie and Daytona.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/daytonaio" rel="noopener noreferrer"&gt;
        daytonaio
      &lt;/a&gt; / &lt;a href="https://github.com/daytonaio/daytona" rel="noopener noreferrer"&gt;
        daytona
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The Open Source Dev Environment Manager.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href="https://www.daytona.io/docs" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a6875dce5b9bc7b5ca47dca1b068e5dcb068038a500da135966575bc338d75df/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f646179746f6e61696f2f646f63733f6c6162656c3d446f637326636f6c6f723d323363633731" alt="Documentation"&gt;&lt;/a&gt;
&lt;a href="https://github.com/daytonaio/daytona#license" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/01ecdea1854758fa9bf0f359fa2f4464324463279ccc4b6d586e90de272e3474/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4170616368652d2d322e302d626c7565" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://goreportcard.com/report/github.com/daytonaio/daytona" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/295bd4f82b11ba8bacd85262875f1c68c755cee403312c7cee959ab68c151023/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f646179746f6e61696f2f646179746f6e61" alt="Go Report Card"&gt;&lt;/a&gt;
&lt;a href="https://github.com/daytonaio/daytona/issues" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3db9bc12d79f4a0378f300c7c35a4f2f72d773c750fbaef0b722cdea8e8b3db3/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f646179746f6e61696f2f646179746f6e61" alt="Issues - daytona"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/baa6ce5587f122a2abc4c996fb5dd9ccc4b33eea6d914d227f3063754e01e758/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f646179746f6e61696f2f646179746f6e61"&gt;&lt;img src="https://camo.githubusercontent.com/baa6ce5587f122a2abc4c996fb5dd9ccc4b33eea6d914d227f3063754e01e758/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f646179746f6e61696f2f646179746f6e61" alt="GitHub Release"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div&gt;
  
    
    
    &lt;img alt="Daytona logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fdaytonaio%2Fdaytona%2Fraw%2Fmain%2Fassets%2Fimages%2FDaytona-logotype-black.png" width="50%"&gt;
  
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
  Set up a development environment on any infrastructure using a single command
&lt;/h3&gt;
&lt;/div&gt;

&lt;div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/daytonaio/daytona/assets/images/daytona_demo.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fdaytonaio%2Fdaytona%2Fassets%2Fimages%2Fdaytona_demo.gif" alt="Daytona Demo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;
    &lt;a href="https://www.daytona.io/docs" rel="nofollow noopener noreferrer"&gt; Documentation &lt;/a&gt;·
    &lt;a href="https://github.com/daytonaio/daytona/issues/new?assignees=&amp;amp;labels=bug&amp;amp;projects=&amp;amp;template=bug_report.md&amp;amp;title=%F0%9F%90%9B+Bug+Report%3A+" rel="noopener noreferrer"&gt; Report Bug &lt;/a&gt;·
    &lt;a href="https://github.com/daytonaio/daytona/issues/new?assignees=&amp;amp;labels=enhancement&amp;amp;projects=&amp;amp;template=feature_request.md&amp;amp;title=%F0%9F%9A%80+Feature%3A+" rel="noopener noreferrer"&gt; Request Feature &lt;/a&gt;·
    &lt;a href="https://go.daytona.io/slack" rel="nofollow noopener noreferrer"&gt; Join Our Slack &lt;/a&gt;·
    &lt;a href="https://x.com/daytonaio" rel="nofollow noopener noreferrer"&gt; Connect On X &lt;/a&gt;
&lt;/p&gt;

&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Open Source Development Environment Manager&lt;/h1&gt;
&lt;/div&gt;


&lt;/div&gt;

&lt;p&gt;For detailed/manual setup steps click &lt;a href="https://www.daytona.io/docs/installation/installation/#installation" rel="nofollow noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Mac / Linux&lt;/h3&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;curl -sfL get.daytona.io &lt;span class="pl-k"&gt;|&lt;/span&gt; sudo bash &lt;span class="pl-k"&gt;&amp;amp;&amp;amp;&lt;/span&gt; daytona server -y &lt;span class="pl-k"&gt;&amp;amp;&amp;amp;&lt;/span&gt; daytona&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Windows&lt;/h3&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-powershell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;powershell &lt;span class="pl-k"&gt;-&lt;/span&gt;Command &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;irm https://get.daytona.io/windows | iex; daytona serve&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Create your first dev environment by opening a new terminal, and running:&lt;/h3&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;daytona create&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Start coding.&lt;/strong&gt;&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quick Setup&lt;/strong&gt;: Activate a fully configured development environment with a single command - &lt;code&gt;daytona create&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runs everywhere&lt;/strong&gt;: Spin up your development environment on any machine; local, remote, cloud-based, physical server or a VM &amp;amp; on any architecture; x86 or ARM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Various Providers Support&lt;/strong&gt;: Choose popular providers like AWS, GCP, Azure, DigitalOcean &amp;amp; &lt;a href="https://github.com/orgs/daytonaio/repositories?q=daytona-provider" rel="noopener noreferrer"&gt;more&lt;/a&gt; or use Docker on bare metal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IDE Support&lt;/strong&gt; : Seamlessly supports…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/daytonaio/daytona" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kom-senapati" rel="noopener noreferrer"&gt;
        kom-senapati
      &lt;/a&gt; / &lt;a href="https://github.com/kom-senapati/Recipe-Genie-Daytona" rel="noopener noreferrer"&gt;
        Recipe-Genie-Daytona
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🧞‍♂️ Ultimate cooking companion powered by TheMealDB for discovering delightful recipes and categories
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Sample Recipe Genie&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Recipe Genie is your go-to app for exploring delicious recipes, powered by TheMealDB. Discover a variety of dishes, surprise yourself with random recipes, or browse through different categories. With Recipe Genie, enjoy a fun and easy cooking adventure! It's a simple Next.js app built using &lt;a href="https://www.themealdb.com/api.php" rel="nofollow noopener noreferrer"&gt;TheMealDB&lt;/a&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚀 Getting Started&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Open Using Daytona&lt;/h3&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install Daytona&lt;/strong&gt;: Follow the &lt;a href="https://www.daytona.io/docs/installation/installation/" rel="nofollow noopener noreferrer"&gt;Daytona installation guide&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create the Workspace&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;daytona create https://github.com/kom-senapati/Recipe-Genie-Daytona.git&lt;/pre&gt;

&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Start the Application&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm run dev&lt;/pre&gt;

&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🤔 &lt;strong&gt;Why Use DevContainer and Daytona?&lt;/strong&gt;
&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;strong&gt;DevContainer&lt;/strong&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Simplifies development environment setup in VS Code.&lt;/li&gt;
&lt;li&gt;Perfect for team collaboration in open-source projects.&lt;/li&gt;
&lt;li&gt;Eliminates the hassle of creating dev environments for contributors.&lt;/li&gt;
&lt;li&gt;Automatically configures extensions and settings for a consistent experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;strong&gt;Daytona&lt;/strong&gt;&lt;/h3&gt;

&lt;/div&gt;


&lt;ul&gt;

&lt;li&gt;Works with &lt;strong&gt;any Git platform&lt;/strong&gt;: GitHub, GitLab, Bitbucket.&lt;/li&gt;

&lt;li&gt;Compatible with &lt;strong&gt;any IDE&lt;/strong&gt;: Vim, VS Code, JetBrains IDEs.&lt;/li&gt;

&lt;li&gt;Runs &lt;strong&gt;anywhere&lt;/strong&gt;: Localhost, AWS, Azure, GCP, Digital Ocean.&lt;/li&gt;

&lt;li&gt;Flexible and efficient…&lt;/li&gt;

&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kom-senapati/Recipe-Genie-Daytona" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpfnj13mqbqqmuj5xmcb0.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpfnj13mqbqqmuj5xmcb0.gif" alt="bye bye" width="498" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>daytona</category>
      <category>nextjs</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Deploy a bento to GitHub Pages</title>
      <dc:creator>K Om Senapati </dc:creator>
      <pubDate>Sat, 09 Nov 2024 14:05:30 +0000</pubDate>
      <link>https://dev.to/k0msenapati/deploy-a-bento-to-github-pages-2b2d</link>
      <guid>https://dev.to/k0msenapati/deploy-a-bento-to-github-pages-2b2d</guid>
      <description>&lt;h2&gt;
  
  
  Hi fellas 👋
&lt;/h2&gt;

&lt;p&gt;In this article, we will create a stunning bento-like portfolio like this and deploy it to GitHub Pages so that you can share it with the world.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy8z4enx3rzobwpxuhwbj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy8z4enx3rzobwpxuhwbj.png" alt="bento" width="800" height="553"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, are you ready to create yours?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhwoo4h1iynxob0h27lmh.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhwoo4h1iynxob0h27lmh.gif" alt="coding" width="498" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1️⃣.. 2️⃣.. 3️⃣.. Let's go 🚀&lt;/p&gt;

&lt;p&gt;Grab your laptop, open up your IDE and start crafting 😉&lt;/p&gt;




&lt;p&gt;Here is my &lt;strong&gt;&lt;a href="https://kom-senapati.github.io/bento/" rel="noopener noreferrer"&gt;bento&lt;/a&gt;&lt;/strong&gt; 🙂&lt;/p&gt;

&lt;p&gt;It's built using React, Typescript, framer-motion and tailwind CSS.&lt;/p&gt;

&lt;p&gt;Here is the original reveal bento grid code by &lt;a href="https://x.com/TomIsLoading" rel="noopener noreferrer"&gt;@tomisloading&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="www.hover.dev/components/grids#reveal-bento" class="ltag_cta ltag_cta--branded"&gt;hover.dev Reveal Bento&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;I got inspiration from the component, customized it, and deployed it to GitHub Pages.&lt;/p&gt;




&lt;h2&gt;
  
  
  Create your bento 🪄
&lt;/h2&gt;

&lt;p&gt;Here's how you can create such bento in 4 easy steps:&lt;/p&gt;

&lt;p&gt;Step 1️⃣&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clone &lt;a href="https://github.com/kom-senapati/bento" rel="noopener noreferrer"&gt;this&lt;/a&gt; repository.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Step 2️⃣&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run &lt;code&gt;npm install&lt;/code&gt; to install all the required packages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Step 3️⃣&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Edit the &lt;code&gt;src/data/profile.json&lt;/code&gt; file to personalize the bento to your needs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Step 4️⃣&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run &lt;code&gt;npm start&lt;/code&gt; and see it in action.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Deploy it to Github Pages 🚀
&lt;/h2&gt;

&lt;p&gt;We can use the &lt;code&gt;gh-pages&lt;/code&gt; package to deploy the bento.&lt;br&gt;
Here is a step-by-step guide for deployment:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create Repository 🪽&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For a user page: Create a repository named &lt;code&gt;username.github.io&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For a project page: Create a repository named &lt;code&gt;username.github.io/project&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add React App Code ➕&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Follow the guide above to create your bento, then add the code to your repository.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Edit the &lt;code&gt;homepage&lt;/code&gt; Key in &lt;code&gt;package.json&lt;/code&gt; ✏️&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add the &lt;code&gt;homepage&lt;/code&gt; key:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"homepage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://username.github.io/"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"homepage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://username.github.io/bento"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Change Remote Repository 💻&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Link your local repository to the GitHub repository:
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt; git remote add origin https://github.com/username/repository-name.git
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Push React App ⬆️&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build and deploy the app:
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt; npm run build
 npm run deploy
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Configure GitHub Pages ⚙️&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to the repository settings on GitHub.&lt;/li&gt;
&lt;li&gt;Under the "GitHub Pages" section, set the source to the &lt;code&gt;gh-pages&lt;/code&gt; branch.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;This will deploy your Bento to GitHub Pages.&lt;/p&gt;




&lt;p&gt;That’s a wrap! You’ve now built and deployed a custom bento portfolio to GitHub Pages – great job! 🔥🔥&lt;/p&gt;

&lt;p&gt;Don't forget to share your &lt;strong&gt;bento&lt;/strong&gt; portfolio in the comments below and on social media – it’s a great way to get noticed! 😏&lt;/p&gt;

</description>
      <category>github</category>
      <category>javascript</category>
      <category>portfolio</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Hacktoberfest 2024: A Journey of Learning and Contribution</title>
      <dc:creator>K Om Senapati </dc:creator>
      <pubDate>Sat, 02 Nov 2024 17:00:30 +0000</pubDate>
      <link>https://dev.to/komsenapati/hacktoberfest-2024-a-journey-of-learning-and-contribution-1a64</link>
      <guid>https://dev.to/komsenapati/hacktoberfest-2024-a-journey-of-learning-and-contribution-1a64</guid>
      <description>&lt;h2&gt;
  
  
  Introduction 👋
&lt;/h2&gt;

&lt;p&gt;Hello, Dev Community!&lt;br&gt;
I am K Om Senapati, a fellow Python dev and open-source enthusiast! I have contributed to open source and participated in Hacktoberfest for 2 years (via GitHub).&lt;br&gt;
But this year it was special as I participated in &lt;a href="https://quira.sh/quests/creator/details?questId=21" rel="noopener noreferrer"&gt;Quira Hacktoberfest&lt;/a&gt; and &lt;a href="https://devfest.ai/" rel="noopener noreferrer"&gt;Devfest&lt;/a&gt; as well 😉. &lt;/p&gt;

&lt;p&gt;I also participated in some other events 🕺 like&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/arc53/DocsGPT/blob/main/HACKTOBERFEST.md" rel="noopener noreferrer"&gt;Docsgpt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mindsdb.com/hacktoberfest" rel="noopener noreferrer"&gt;Mindsdb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/CopilotKit/CopilotKit/tree/main/community/content" rel="noopener noreferrer"&gt;Copilotkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mattermost.com/hacktoberfest/" rel="noopener noreferrer"&gt;Mattermost&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Target 🎯
&lt;/h2&gt;

&lt;p&gt;This year I targeted for more meaningful contributions than last year. Previously I contributed to DSA and RESOURCES repos mostly but this time I tried to contribute to actual projects used in the real world. 📈&lt;/p&gt;

&lt;p&gt;I also had a target for getting into the AI domain through open source. 😉&lt;br&gt;
I think it was partially achieved as I learnt about cool projects like&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/llmware-ai/llmware" rel="noopener noreferrer"&gt;LLMware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/julep-ai/julep" rel="noopener noreferrer"&gt;Julep&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://mindsdb.com/minds" rel="noopener noreferrer"&gt;minds&lt;/a&gt; (by Mindsdb)&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  October Contributions Roundup
&lt;/h3&gt;

&lt;p&gt;🪁 Hacktoberfest Demos for CopilotKit&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetdu1tfp8x33s60meqt6.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetdu1tfp8x33s60meqt6.gif" alt="hacktoberfest_banner" width="760" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✨ &lt;a href="https://x.com/kom_senapati/status/1848999182230802776" rel="noopener noreferrer"&gt;Content Management Tool&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📚 &lt;a href="https://x.com/kom_senapati/status/1846416046015893934" rel="noopener noreferrer"&gt;Study Buddy&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🎬 &lt;a href="https://x.com/kom_senapati/status/1845357229635141645" rel="noopener noreferrer"&gt;Movie Suggestion Bot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://x.com/kom_senapati/status/1844997369915637995" rel="noopener noreferrer"&gt;Study Sphere&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🤖 Added GROQ API Support&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fencrypted-tbn0.gstatic.com%2Fimages%3Fq%3Dtbn%3AANd9GcTS_vsT8yqXPyP3tyhAgExcehplnUCggQ1afQ%26s" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fencrypted-tbn0.gstatic.com%2Fimages%3Fq%3Dtbn%3AANd9GcTS_vsT8yqXPyP3tyhAgExcehplnUCggQ1afQ%26s" alt="groq cool banner" width="311" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔧 Docsgpt: &lt;a href="https://github.com/arc53/DocsGPT/pull/1246" rel="noopener noreferrer"&gt;Pull Request #1246&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔧 json-translator: &lt;a href="https://github.com/mololab/json-translator/pull/74" rel="noopener noreferrer"&gt;Pull Request #74&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;✨ GROQ AI Integration Proposal: &lt;a href="https://github.com/mindsdb/mindsdb/pull/9807" rel="noopener noreferrer"&gt;Pull Request #9807&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🧠 MindsDB Contributions (Pending Merge)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhi4255xjpswymsa6eaa4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhi4255xjpswymsa6eaa4.jpg" alt="mindsdb banner" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📥 Three Additional PRs for mindsdb-js-sdk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjpe3lekjlocgnm0jw151.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjpe3lekjlocgnm0jw151.png" alt="pending prs of mindsdb" width="800" height="138"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Bot Verse Maintainer 🤖
&lt;/h2&gt;

&lt;p&gt;I was a project admin for GSSOC and opened my project &lt;a href="https://github.com/kom-senapati/bot-verse" rel="noopener noreferrer"&gt;Bot Verse&lt;/a&gt; for Hacktoberfest. Around 22 contributors worked on it, and here’s the commit graph:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frrrq9sllhaizqtqffe3z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frrrq9sllhaizqtqffe3z.png" alt="Bot Verse commits" width="800" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It was a great experience collaborating with the community to improve this project. 🤓&lt;/p&gt;


&lt;h2&gt;
  
  
  Learning 🧠
&lt;/h2&gt;

&lt;p&gt;Some of my major learnings this October:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding AI copilots and Generative UI to your web apps with Copilotkit&lt;/li&gt;
&lt;li&gt;Creating AI agents with memory via Julep&lt;/li&gt;
&lt;li&gt;Interacting with your databases via Chartdb and minds&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;October was an amazing month of growth for me. I’m excited to dive deeper into open source and give back even more.&lt;/p&gt;

&lt;p&gt;Fun is over but hustle begins now! 💪&lt;/p&gt;



&lt;p&gt;If you loved this, please follow me for more 💖&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://github.com/kom-senapati" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F92045934%3Fv%3D4%3Fs%3D400" height="460" class="m-0" width="460"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://github.com/kom-senapati" rel="noopener noreferrer" class="c-link"&gt;
          kom-senapati (K Om Senapati ) · GitHub
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Open Source Contributor | Python, JS/TS Developer | CSE '27  - kom-senapati
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.githubassets.com%2Ffavicons%2Ffavicon.svg" width="32" height="32"&gt;
        github.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://x.com/kom_senapati" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/kom-senapati/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu44wi64g5d2862zowt7u.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu44wi64g5d2862zowt7u.gif" alt="Image description" width="498" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hacktoberfestchallenge</category>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Create a Movie Suggestion Bot</title>
      <dc:creator>K Om Senapati </dc:creator>
      <pubDate>Sun, 13 Oct 2024 07:28:54 +0000</pubDate>
      <link>https://dev.to/k0msenapati/create-a-movie-suggestion-bot-f8b</link>
      <guid>https://dev.to/k0msenapati/create-a-movie-suggestion-bot-f8b</guid>
      <description>&lt;h2&gt;
  
  
  Movie Suggestion Bot Tutorial
&lt;/h2&gt;

&lt;p&gt;This tutorial will guide you through setting up a movie suggestion bot that uses natural language to detect your mood and genre preferences to suggest movies accordingly.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Set Up a Next.js Project
&lt;/h2&gt;

&lt;p&gt;You can set up a Next.js project and then add Shadcn on top of that, or you can use the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx shadcn@latest init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will initialize both the Next.js project and Shadcn. 😉&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Set Up CopilotKit
&lt;/h2&gt;

&lt;p&gt;Use the following commands to install the required packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @copilotkit/react-core @copilotkit/react-ui @copilotkit/runtime
npm &lt;span class="nb"&gt;install &lt;/span&gt;groq-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, add the &lt;code&gt;/api/copilotkit&lt;/code&gt; backend endpoint with the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;CopilotRuntime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;GroqAdapter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;copilotRuntimeNextJSAppRouterEndpoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@copilotkit/runtime&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextRequest&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;next/server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Groq&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;groq-sdk&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// eslint-disable-next-line @typescript-eslint/no-explicit-any&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;groq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Groq&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;GROQ_API_KEY&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;any&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;copilotKit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CopilotRuntime&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;serviceAdapter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GroqAdapter&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;groq&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;llama3-groq-8b-8192-tool-use-preview&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;handleRequest&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;copilotRuntimeNextJSAppRouterEndpoint&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;copilotKit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;serviceAdapter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/copilotkit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;handleRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Add a Server Action
&lt;/h2&gt;

&lt;p&gt;To complete the backend setup, we just need to add one server action. Create the following file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/actions/movies.ts&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchMovies&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OMDB_API_KEY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://www.omdbapi.com/?apikey=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;s=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;encodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;query&lt;/span&gt;
    &lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Search&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Search&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error fetching movies:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Build the Frontend
&lt;/h2&gt;

&lt;p&gt;With the backend ready, we now need to build the frontend for this app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add Shadcn Components
&lt;/h3&gt;

&lt;p&gt;Run the following command to add necessary components:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx shadcn@latest add card badge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, add the spinner &lt;a href="https://github.com/kom-senapati/movie-suggestion-bot/blob/main/src/components/ui-expansions/spinner.tsx" rel="noopener noreferrer"&gt;component&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Update the Page Component
&lt;/h3&gt;

&lt;p&gt;Now, in &lt;code&gt;src/app/page.tsx&lt;/code&gt;, import the necessary components and hooks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fetchMovies&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@/actions/movies&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Spinner&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@/components/ui-expansions/spinner&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Badge&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@/components/ui/badge&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Card&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;CardContent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;CardFooter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@/components/ui/card&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useCopilotAction&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@copilotkit/react-core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CopilotChat&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@copilotkit/react-ui&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@copilotkit/react-ui/styles.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Film&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lucide-react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;next/link&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Define the Movie Type
&lt;/h3&gt;

&lt;p&gt;Next, define the &lt;code&gt;Movie&lt;/code&gt; type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Movie&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;Title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;Year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;imdbID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;Poster&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Implement the Page Component
&lt;/h3&gt;

&lt;p&gt;Use the &lt;code&gt;useCopilotAction&lt;/code&gt; hook to enable AI to fetch movies and display them to the user. Return the following JSX:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;w-full h-screen&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;CopilotChat&lt;/span&gt;
        &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;w-full h-full&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;
          &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Movie Suggestion Bot&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;initial&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello! 👋 What type of movie are you in the mood for?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}}&lt;/span&gt;
        &lt;span class="nx"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;No need to provide movie names unless no results are found. If the API returns movies, only those will be shown.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hurray! 🎉 The Movie Suggestion Bot is complete. &lt;/p&gt;

&lt;p&gt;If you liked the project, show some support to the project by starring the repository.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/kom-senapati/movie-suggestion-bot" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⭐ Star movie-suggestion-bot&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Also you can follow Copilotkit on their X handle and star their repo as well.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/CopilotKit/CopilotKit" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⭐ Star Copilotkit&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.com/CopilotKit/" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;🤝 Follow Copilotkit&lt;/a&gt;
&lt;/p&gt;

</description>
      <category>copilotkit</category>
      <category>nextjs</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Recipe Genie: Powered by AI 🤖</title>
      <dc:creator>K Om Senapati </dc:creator>
      <pubDate>Sun, 15 Sep 2024 05:39:36 +0000</pubDate>
      <link>https://dev.to/k0msenapati/recipe-genie-supercharged-with-ai-121l</link>
      <guid>https://dev.to/k0msenapati/recipe-genie-supercharged-with-ai-121l</guid>
      <description>&lt;p&gt;In Quira Quest 16, I took my project Recipe Genie (earlier submitted to Quira Quest 12) and added more features including AI recipe generation and more to make it accessible to users.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's take a look at the new features:&lt;/p&gt;

&lt;h3&gt;
  
  
  1️⃣ Text to Speech
&lt;/h3&gt;

&lt;p&gt;I created a component text-to-speech that takes some text to be converted to speech and renders buttons like play/resume, pause, and stop to control the audio.&lt;/p&gt;

&lt;p&gt;You can take a look at this component here:&lt;/p&gt;

&lt;p&gt;
  Code
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TextToSpeech&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isPaused&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIsPaused&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;utterance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUtterance&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{...},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handlePlay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{...};&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handlePause&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{...};&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleStop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{...};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;flex flex-row-reverse gap-5 py-2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleStop&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;StopIcon&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handlePause&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PauseIcon&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handlePlay&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isPaused&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ResumeIcon&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PlayIcon&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;TextToSpeech&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;See the full &lt;a href="https://github.com/kom-senapati/Recipe-Genie-AI/blob/main/components/TextToSpeech.jsx" rel="noopener noreferrer"&gt;source code&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;br&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  2️⃣ AI-Generated Recipe
&lt;/h3&gt;

&lt;p&gt;For generating recipes with AI, I choose to use Vercel AI SDK as it's easy to use and also gives a lot of features like structured outputs from LLMs(I am using this feature to generate recipes for users) out of the box and GROQ API as it's free.&lt;/p&gt;

&lt;p&gt;I created a route &lt;code&gt;/api/generate-recipe&lt;/code&gt; which has a POST route which takes in inputs like userPrompt, dishType, and dietaryRestrictions and creates a prompt for passing into LLM.&lt;br&gt;&lt;br&gt;
Then using &lt;code&gt;generateObject()&lt;/code&gt; of Vercel AI SDK, it creates the recipe object and returns it as a response.&lt;/p&gt;

&lt;p&gt;See the full &lt;a href="https://github.com/kom-senapati/Recipe-Genie-AI/blob/main/app/api/generate-recipe/route.js" rel="noopener noreferrer"&gt;source code&lt;/a&gt; for this route.&lt;/p&gt;

&lt;p&gt;I integrated this into a form and attached the form, along with the recipe rendering component, to the &lt;code&gt;/ai&lt;/code&gt; route of the application. &lt;/p&gt;
&lt;h3&gt;
  
  
  3️⃣ Ai Recipe Image Generation
&lt;/h3&gt;

&lt;p&gt;I also added AI image generation for these recipes using the recipe name and user prompt. I used &lt;a href="https://pollinations.ai/'s" rel="noopener noreferrer"&gt;https://pollinations.ai/'s&lt;/a&gt; free API to do it.&lt;/p&gt;

&lt;p&gt;See the full &lt;a href="https://github.com/kom-senapati/Recipe-Genie-AI/blob/main/app/api/generate-recipe-image/route.js" rel="noopener noreferrer"&gt;source code&lt;/a&gt; for this route.&lt;/p&gt;
&lt;h3&gt;
  
  
  4️⃣ Speech to Text
&lt;/h3&gt;

&lt;p&gt;I implemented a speech-to-text feature for the input field of the above-discussed form, allowing users to speak their prompt, which is then captured automatically.&lt;/p&gt;

&lt;p&gt;See the full &lt;a href="https://github.com/kom-senapati/Recipe-Genie-AI/blob/main/components/FormComponents.jsx#L64" rel="noopener noreferrer"&gt;source code&lt;/a&gt; for this component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  🧑‍💻 Developer Experience/Findings
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk2s3ypfsvwi4n3tyozk1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk2s3ypfsvwi4n3tyozk1.gif" alt="Developer" width="498" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;First I started with zod schema without any description then it gave some error that it couldn't generate the recipe object. Then I added a description for the schema using &lt;code&gt;describe()&lt;/code&gt; method of zod and it worked. You can see the schema &lt;a href="https://github.com/kom-senapati/Recipe-Genie-AI/blob/main/lib/schemas.js" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I found out that the Meta Llama 3 8B model performs better than the Mixtral 8x7b model.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Also as I was using Vercel AI SDK, I didn't have to use any external tooling as I had access to &lt;code&gt;generateObject()&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Groq API is very fast and it works like a charm.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you enjoyed 💖 this project, I’d appreciate your support! You can vote 🗳️ for my submission in the quest and star ⭐ the repo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://quira.sh/repo/kom-senapati-Recipe-Genie-AI-842025464?utm_source=copy&amp;amp;utm_share_context=quests_repos" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Vote 🙏&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/kom-senapati/Recipe-Genie-AI" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Star  Recipe Genie AI ⭐&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;That’s all for today—thanks so much for reading! If you have any thoughts or questions, feel free to reach out.&lt;/p&gt;

&lt;p&gt;Feel free to connect with me on &lt;a href="https://x.com/kom_senapati" rel="noopener noreferrer"&gt;X&lt;/a&gt; as well!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxtlzb4hnmhorkbygigk2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxtlzb4hnmhorkbygigk2.gif" alt="Bye" width="498" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>genai</category>
      <category>recipe</category>
      <category>nextjs</category>
      <category>quira</category>
    </item>
  </channel>
</rss>
