<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Devan Sekar</title>
        <link>https://devan.webswandi.in</link>
        <description>Your blog description</description>
        <lastBuildDate>Sun, 07 Jun 2026 18:21:10 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Devan Sekar</title>
            <url>https://devan.webswandi.in/favicon.ico</url>
            <link>https://devan.webswandi.in</link>
        </image>
        <copyright>All rights reserved 2026</copyright>
        <item>
            <title><![CDATA[Building a Generative AI Agent with Next.js and Open AI]]></title>
            <link>https://devan.webswandi.in/articles/building-a-generative-ai-agent-with-next-js-and-open-ai</link>
            <guid>https://devan.webswandi.in/articles/building-a-generative-ai-agent-with-next-js-and-open-ai</guid>
            <pubDate>Fri, 11 Jul 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>At Interstellar Solutions, our goal was to create a generative AI agent capable of producing high-quality, context-aware content—such as blog drafts, product descriptions, or creative writing—directly within our web application. By combining Open AI’s powerful language models with Next.js’s robust routing and rendering capabilities, we built a scalable, user-friendly AI agent.</p>
<img alt="Generative AI Agent Interface Screenshot" loading="lazy" width="1024" height="1024" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2Fimages%2Farticles%2Fai-agent-interface.png&amp;w=1080&amp;q=75 1x, /_next/image?url=%2Fimages%2Farticles%2Fai-agent-interface.png&amp;w=2048&amp;q=75 2x" src="/_next/image?url=%2Fimages%2Farticles%2Fai-agent-interface.png&amp;w=2048&amp;q=75">
<p>To accomplish this, I set up a Next.js project, configured secure API routes for Open AI integration, and developed a client-side interface for users to interact with the AI agent. Below, I’ll walk you through the process of building a generative AI agent with Next.js and Open AI.</p>
<h2>Setting Up the Next.js Project</h2>
<p>Start by creating a new Next.js project and installing the Open AI client library:</p>
<pre class="language-bash"><code class="language-bash code-highlight"><span class="code-line">npx create-next-app@latest my-ai-agent-app
</span><span class="code-line"><span class="token builtin class-name">cd</span> my-ai-agent-app
</span><span class="code-line"><span class="token function">npm</span> <span class="token function">install</span> openai
</span></code></pre>
<p>You’ll need an Open AI API key from <a href="https://platform.openai.com/">Open AI’s platform</a>. Store it securely in a <code>.env.local</code> file:</p>
<pre class="language-text"><code class="language-text code-highlight"><span class="code-line">OPENAI_API_KEY=your-openai-api-key
</span></code></pre>
<h2>Server-Side API Route for Open AI</h2>
<p>To handle Open AI requests securely, we created a Next.js API route in <code>pages/api/generate.ts</code>. This route processes user prompts and sends them to Open AI’s API for content generation:</p>
<pre class="language-typescript"><code class="language-typescript code-highlight"><span class="code-line"><span class="token keyword">import</span> <span class="token keyword">type</span> <span class="token punctuation">{</span> NextApiRequest<span class="token punctuation">,</span> NextApiResponse <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'next'</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">import</span> OpenAI <span class="token keyword">from</span> <span class="token string">'openai'</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">const</span> openai <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">OpenAI</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
</span><span class="code-line">  apiKey<span class="token operator">:</span> process<span class="token punctuation">.</span>env<span class="token punctuation">.</span><span class="token constant">OPENAI_API_KEY</span><span class="token punctuation">,</span>
</span><span class="code-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token function">handler</span><span class="token punctuation">(</span>req<span class="token operator">:</span> NextApiRequest<span class="token punctuation">,</span> res<span class="token operator">:</span> NextApiResponse<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>req<span class="token punctuation">.</span>method <span class="token operator">!==</span> <span class="token string">'POST'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line">    <span class="token keyword">return</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">405</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> error<span class="token operator">:</span> <span class="token string">'Method not allowed'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">  <span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line">  <span class="token keyword">try</span> <span class="token punctuation">{</span>
</span><span class="code-line">    <span class="token keyword">const</span> <span class="token punctuation">{</span> prompt<span class="token punctuation">,</span> maxTokens <span class="token operator">=</span> <span class="token number">150</span> <span class="token punctuation">}</span> <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">;</span>
</span><span class="code-line">    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>prompt<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line">      <span class="token keyword">return</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">400</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> error<span class="token operator">:</span> <span class="token string">'Prompt is required'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">    <span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line">    <span class="token keyword">const</span> completion <span class="token operator">=</span> <span class="token keyword">await</span> openai<span class="token punctuation">.</span>chat<span class="token punctuation">.</span>completions<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
</span><span class="code-line">      model<span class="token operator">:</span> <span class="token string">'gpt-4o'</span><span class="token punctuation">,</span>
</span><span class="code-line">      messages<span class="token operator">:</span> <span class="token punctuation">[</span>
</span><span class="code-line">        <span class="token punctuation">{</span> role<span class="token operator">:</span> <span class="token string">'system'</span><span class="token punctuation">,</span> content<span class="token operator">:</span> <span class="token string">'You are a creative AI agent that generates high-quality, context-aware content.'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
</span><span class="code-line">        <span class="token punctuation">{</span> role<span class="token operator">:</span> <span class="token string">'user'</span><span class="token punctuation">,</span> content<span class="token operator">:</span> prompt <span class="token punctuation">}</span><span class="token punctuation">,</span>
</span><span class="code-line">      <span class="token punctuation">]</span><span class="token punctuation">,</span>
</span><span class="code-line">      max_tokens<span class="token operator">:</span> maxTokens<span class="token punctuation">,</span>
</span><span class="code-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line">    <span class="token keyword">const</span> response <span class="token operator">=</span> completion<span class="token punctuation">.</span>choices<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token operator">?.</span>message<span class="token operator">?.</span>content <span class="token operator">||</span> <span class="token string">'No response generated'</span><span class="token punctuation">;</span>
</span><span class="code-line">    res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> response <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">  <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line">    <span class="token builtin">console</span><span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string">'Open AI error:'</span><span class="token punctuation">,</span> error<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">    res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">500</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> error<span class="token operator">:</span> <span class="token string">'Internal server error'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">  <span class="token punctuation">}</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
<p>This API route accepts POST requests with a user prompt and an optional <code>maxTokens</code> parameter, sends them to Open AI’s <code>gpt-4o</code> model, and returns the generated content.</p>
<h2>Client-Side AI Agent Interface</h2>
<p>We built a client-side interface in <code>pages/index.tsx</code> using React state to manage user prompts and AI responses. The interface allows users to input a prompt and receive generated content:</p>
<pre class="language-typescript"><code class="language-typescript code-highlight"><span class="code-line"><span class="token keyword">import</span> <span class="token punctuation">{</span> useState <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'react'</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">AIAgent</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line">  <span class="token keyword">const</span> <span class="token punctuation">[</span>prompt<span class="token punctuation">,</span> setPrompt<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">useState</span><span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">  <span class="token keyword">const</span> <span class="token punctuation">[</span>response<span class="token punctuation">,</span> setResponse<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">useState</span><span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">  <span class="token keyword">const</span> <span class="token punctuation">[</span>isLoading<span class="token punctuation">,</span> setIsLoading<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">useState</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line">  <span class="token keyword">const</span> <span class="token function-variable function">handleGenerate</span> <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>
</span><span class="code-line">    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>prompt<span class="token punctuation">.</span><span class="token function">trim</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line">    <span class="token function">setIsLoading</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">    <span class="token function">setResponse</span><span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line">    <span class="token keyword">try</span> <span class="token punctuation">{</span>
</span><span class="code-line">      <span class="token keyword">const</span> res <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">fetch</span><span class="token punctuation">(</span><span class="token string">'/api/generate'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>
</span><span class="code-line">        method<span class="token operator">:</span> <span class="token string">'POST'</span><span class="token punctuation">,</span>
</span><span class="code-line">        headers<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token string-property property">'Content-Type'</span><span class="token operator">:</span> <span class="token string">'application/json'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
</span><span class="code-line">        body<span class="token operator">:</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span><span class="token punctuation">{</span> prompt<span class="token punctuation">,</span> maxTokens<span class="token operator">:</span> <span class="token number">200</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
</span><span class="code-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">      <span class="token keyword">const</span> data <span class="token operator">=</span> <span class="token keyword">await</span> res<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">      <span class="token keyword">if</span> <span class="token punctuation">(</span>data<span class="token punctuation">.</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line">        <span class="token function">setResponse</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">Error: </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>data<span class="token punctuation">.</span>error<span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">      <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
</span><span class="code-line">        <span class="token function">setResponse</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>response<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">      <span class="token punctuation">}</span>
</span><span class="code-line">    <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line">      <span class="token function">setResponse</span><span class="token punctuation">(</span><span class="token string">'Error: Failed to connect to the server'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">    <span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span>
</span><span class="code-line">      <span class="token function">setIsLoading</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">    <span class="token punctuation">}</span>
</span><span class="code-line">  <span class="token punctuation">}</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line">  <span class="token keyword">return</span> <span class="token punctuation">(</span>
</span><span class="code-line">    <span class="token operator">&lt;</span>div className<span class="token operator">=</span><span class="token string">"max-w-3xl mx-auto p-6"</span><span class="token operator">&gt;</span>
</span><span class="code-line">      <span class="token operator">&lt;</span>h1 className<span class="token operator">=</span><span class="token string">"text-3xl font-bold mb-6"</span><span class="token operator">&gt;</span>Generative <span class="token constant">AI</span> Agent<span class="token operator">&lt;</span><span class="token operator">/</span>h1<span class="token operator">&gt;</span>
</span><span class="code-line">      <span class="token operator">&lt;</span>div className<span class="token operator">=</span><span class="token string">"mb-4"</span><span class="token operator">&gt;</span>
</span><span class="code-line">        <span class="token operator">&lt;</span>textarea
</span><span class="code-line">          value<span class="token operator">=</span><span class="token punctuation">{</span>prompt<span class="token punctuation">}</span>
</span><span class="code-line">          onChange<span class="token operator">=</span><span class="token punctuation">{</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token function">setPrompt</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span>target<span class="token punctuation">.</span>value<span class="token punctuation">)</span><span class="token punctuation">}</span>
</span><span class="code-line">          className<span class="token operator">=</span><span class="token string">"w-full p-3 border rounded-lg"</span>
</span><span class="code-line">          placeholder<span class="token operator">=</span><span class="token string">"Enter your prompt (e.g., 'Write a product description for a futuristic gadget')"</span>
</span><span class="code-line">          rows<span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">4</span><span class="token punctuation">}</span>
</span><span class="code-line">        <span class="token operator">/</span><span class="token operator">&gt;</span>
</span><span class="code-line">      <span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">&gt;</span>
</span><span class="code-line">      <span class="token operator">&lt;</span>button
</span><span class="code-line">        onClick<span class="token operator">=</span><span class="token punctuation">{</span>handleGenerate<span class="token punctuation">}</span>
</span><span class="code-line">        disabled<span class="token operator">=</span><span class="token punctuation">{</span>isLoading<span class="token punctuation">}</span>
</span><span class="code-line">        className<span class="token operator">=</span><span class="token string">"p-3 bg-blue-500 text-white rounded-lg disabled:bg-gray-400"</span>
</span><span class="code-line">      <span class="token operator">&gt;</span>
</span><span class="code-line">        <span class="token punctuation">{</span>isLoading <span class="token operator">?</span> <span class="token string">'Generating...'</span> <span class="token operator">:</span> <span class="token string">'Generate Content'</span><span class="token punctuation">}</span>
</span><span class="code-line">      <span class="token operator">&lt;</span><span class="token operator">/</span>button<span class="token operator">&gt;</span>
</span><span class="code-line">      <span class="token punctuation">{</span>response <span class="token operator">&amp;&amp;</span> <span class="token punctuation">(</span>
</span><span class="code-line">        <span class="token operator">&lt;</span>div className<span class="token operator">=</span><span class="token string">"mt-6 p-4 bg-gray-100 rounded-lg"</span><span class="token operator">&gt;</span>
</span><span class="code-line">          <span class="token operator">&lt;</span>h2 className<span class="token operator">=</span><span class="token string">"text-xl font-semibold mb-2"</span><span class="token operator">&gt;</span>Generated Content<span class="token operator">&lt;</span><span class="token operator">/</span>h2<span class="token operator">&gt;</span>
</span><span class="code-line">          <span class="token operator">&lt;</span>p<span class="token operator">&gt;</span><span class="token punctuation">{</span>response<span class="token punctuation">}</span><span class="token operator">&lt;</span><span class="token operator">/</span>p<span class="token operator">&gt;</span>
</span><span class="code-line">        <span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">&gt;</span>
</span><span class="code-line">      <span class="token punctuation">)</span><span class="token punctuation">}</span>
</span><span class="code-line">    <span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">&gt;</span>
</span><span class="code-line">  <span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
<p>This component provides a textarea for users to input prompts, a button to trigger content generation, and a section to display the AI’s response. It communicates with the <code>/api/generate</code> endpoint.</p>
<h2>Next.js Routes</h2>
<p>The Next.js application uses the following routes:</p>
<ol>
<li><code>/</code> - Main AI agent interface (defined in <code>pages/index.tsx</code>)</li>
<li><code>/api/generate</code> - API route for handling Open AI content generation requests</li>
</ol>
<h2>Best Practices for Next.js and Open AI</h2>
<ol>
<li><strong>Secure API Key</strong>: Store the Open AI API key in environment variables to prevent client-side exposure.</li>
<li><strong>Input Validation</strong>: Validate user prompts on the server to ensure they meet length or content requirements.</li>
<li><strong>Rate Limiting</strong>: Implement rate limiting on the <code>/api/generate</code> route to prevent abuse and manage API costs.</li>
<li><strong>Styling</strong>: Use Tailwind CSS (as shown) for a clean, responsive interface.</li>
<li><strong>Context Management</strong>: For advanced use cases, maintain a history of prompts in the Open AI API calls to provide context-aware responses.</li>
</ol>]]></content:encoded>
            <author>raghavadeva1903@gmail.com (Devan Sekar)</author>
        </item>
        <item>
            <title><![CDATA[Building a Next.js App with tRPC Client]]></title>
            <link>https://devan.webswandi.in/articles/building-a-next-js-app-with-trpc-client</link>
            <guid>https://devan.webswandi.in/articles/building-a-next-js-app-with-trpc-client</guid>
            <pubDate>Sat, 07 Jun 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>When building a web application for a company as forward-thinking as Interstellar Solutions, type safety and performance are non-negotiable. We chose Next.js for its robust routing and server-side rendering capabilities, paired with tRPC to create a type-safe API layer that eliminates runtime errors in client-server communication.</p>
<p>To make this work, I set up a Next.js project, integrated tRPC, and configured the client to interact with our API routes. Below, I’ll walk you through implementing tRPC in a Next.js app, focusing on the client-side setup.</p>
<h2>Setting Up tRPC in Next.js</h2>
<p>tRPC allows us to define API procedures on the server and call them from the client with full TypeScript support. We started by setting up a tRPC router and integrating it with Next.js API routes.</p>
<h3>Server-Side tRPC Router</h3>
<p>First, we defined a tRPC router in <code>server/api/router.ts</code>:</p>
<pre class="language-typescript"><code class="language-typescript code-highlight"><span class="code-line"><span class="token keyword">import</span> <span class="token punctuation">{</span> initTRPC <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@trpc/server'</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">import</span> <span class="token punctuation">{</span> z <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'zod'</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">const</span> t <span class="token operator">=</span> initTRPC<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">export</span> <span class="token keyword">const</span> appRouter <span class="token operator">=</span> t<span class="token punctuation">.</span><span class="token function">router</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
</span><span class="code-line">  getUser<span class="token operator">:</span> t<span class="token punctuation">.</span>procedure
</span><span class="code-line">    <span class="token punctuation">.</span><span class="token function">input</span><span class="token punctuation">(</span>z<span class="token punctuation">.</span><span class="token function">object</span><span class="token punctuation">(</span><span class="token punctuation">{</span> id<span class="token operator">:</span> z<span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
</span><span class="code-line">    <span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">{</span> input <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>
</span><span class="code-line">      <span class="token keyword">return</span> <span class="token punctuation">{</span> id<span class="token operator">:</span> input<span class="token punctuation">.</span>id<span class="token punctuation">,</span> name<span class="token operator">:</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">User </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>input<span class="token punctuation">.</span>id<span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">,</span> email<span class="token operator">:</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">user</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>input<span class="token punctuation">.</span>id<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">@example.com</span><span class="token template-punctuation string">`</span></span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
</span><span class="code-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
</span><span class="code-line">  createUser<span class="token operator">:</span> t<span class="token punctuation">.</span>procedure
</span><span class="code-line">    <span class="token punctuation">.</span><span class="token function">input</span><span class="token punctuation">(</span>z<span class="token punctuation">.</span><span class="token function">object</span><span class="token punctuation">(</span><span class="token punctuation">{</span> name<span class="token operator">:</span> z<span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> email<span class="token operator">:</span> z<span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">email</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
</span><span class="code-line">    <span class="token punctuation">.</span><span class="token function">mutation</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">{</span> input <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>
</span><span class="code-line">      <span class="token keyword">return</span> <span class="token punctuation">{</span> id<span class="token operator">:</span> <span class="token string">'123'</span><span class="token punctuation">,</span> <span class="token operator">...</span>input <span class="token punctuation">}</span><span class="token punctuation">;</span>
</span><span class="code-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
</span><span class="code-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">export</span> <span class="token keyword">type</span> <span class="token class-name">AppRouter</span> <span class="token operator">=</span> <span class="token keyword">typeof</span> appRouter<span class="token punctuation">;</span>
</span></code></pre>
<p>This router defines two procedures: <code>getUser</code> (a query) and <code>createUser</code> (a mutation).</p>
<h3>Next.js API Route for tRPC</h3>
<p>We exposed the tRPC router via a Next.js API route in <code>pages/api/trpc/[trpc].ts</code>:</p>
<pre class="language-typescript"><code class="language-typescript code-highlight"><span class="code-line"><span class="token keyword">import</span> <span class="token punctuation">{</span> createNextApiHandler <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@trpc/server/adapters/next'</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">import</span> <span class="token punctuation">{</span> appRouter <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'../../../server/api/router'</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token function">createNextApiHandler</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
</span><span class="code-line">  router<span class="token operator">:</span> appRouter<span class="token punctuation">,</span>
</span><span class="code-line">  <span class="token function-variable function">createContext</span><span class="token operator">:</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
</span><span class="code-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
<p>This sets up the tRPC endpoint at <code>/api/trpc/*</code>.</p>
<h2>Client-Side tRPC Integration</h2>
<p>On the client, we used <code>@trpc/react-query</code> to integrate tRPC with React Query for data fetching. First, we configured the tRPC client in <code>lib/trpc.ts</code>:</p>
<pre class="language-typescript"><code class="language-typescript code-highlight"><span class="code-line"><span class="token keyword">import</span> <span class="token punctuation">{</span> createTRPCReact <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@trpc/react-query'</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">import</span> <span class="token keyword">type</span> <span class="token punctuation">{</span> AppRouter <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'../server/api/router'</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">export</span> <span class="token keyword">const</span> trpc <span class="token operator">=</span> <span class="token generic-function"><span class="token function">createTRPCReact</span><span class="token generic class-name"><span class="token operator">&lt;</span>AppRouter<span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
<p>Then, we wrapped our app with the tRPC provider in <code>pages/_app.tsx</code>:</p>
<pre class="language-typescript"><code class="language-typescript code-highlight"><span class="code-line"><span class="token keyword">import</span> <span class="token punctuation">{</span> trpc <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'../lib/trpc'</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">import</span> <span class="token punctuation">{</span> QueryClient<span class="token punctuation">,</span> QueryClientProvider <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@tanstack/react-query'</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">import</span> <span class="token punctuation">{</span> httpBatchLink <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@trpc/client'</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">import</span> <span class="token punctuation">{</span> useState <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'react'</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">import</span> <span class="token keyword">type</span> <span class="token punctuation">{</span> AppProps <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'next/app'</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">function</span> <span class="token function">MyApp</span><span class="token punctuation">(</span><span class="token punctuation">{</span> Component<span class="token punctuation">,</span> pageProps <span class="token punctuation">}</span><span class="token operator">:</span> AppProps<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line">  <span class="token keyword">const</span> <span class="token punctuation">[</span>queryClient<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">useState</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">new</span> <span class="token class-name">QueryClient</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">  <span class="token keyword">const</span> <span class="token punctuation">[</span>trpcClient<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">useState</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span>
</span><span class="code-line">    trpc<span class="token punctuation">.</span><span class="token function">createClient</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
</span><span class="code-line">      links<span class="token operator">:</span> <span class="token punctuation">[</span>
</span><span class="code-line">        <span class="token function">httpBatchLink</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
</span><span class="code-line">          url<span class="token operator">:</span> <span class="token string">'/api/trpc'</span><span class="token punctuation">,</span>
</span><span class="code-line">        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
</span><span class="code-line">      <span class="token punctuation">]</span><span class="token punctuation">,</span>
</span><span class="code-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span>
</span><span class="code-line">  <span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line">  <span class="token keyword">return</span> <span class="token punctuation">(</span>
</span><span class="code-line">    <span class="token operator">&lt;</span>trpc<span class="token punctuation">.</span>Provider client<span class="token operator">=</span><span class="token punctuation">{</span>trpcClient<span class="token punctuation">}</span> queryClient<span class="token operator">=</span><span class="token punctuation">{</span>queryClient<span class="token punctuation">}</span><span class="token operator">&gt;</span>
</span><span class="code-line">      <span class="token operator">&lt;</span>QueryClientProvider client<span class="token operator">=</span><span class="token punctuation">{</span>queryClient<span class="token punctuation">}</span><span class="token operator">&gt;</span>
</span><span class="code-line">        <span class="token operator">&lt;</span>Component <span class="token punctuation">{</span><span class="token operator">...</span>pageProps<span class="token punctuation">}</span> <span class="token operator">/</span><span class="token operator">&gt;</span>
</span><span class="code-line">      <span class="token operator">&lt;</span><span class="token operator">/</span>QueryClientProvider<span class="token operator">&gt;</span>
</span><span class="code-line">    <span class="token operator">&lt;</span><span class="token operator">/</span>trpc<span class="token punctuation">.</span>Provider<span class="token operator">&gt;</span>
</span><span class="code-line">  <span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">export</span> <span class="token keyword">default</span> MyApp<span class="token punctuation">;</span>
</span></code></pre>
<h2>Using tRPC in a Next.js Page</h2>
<p>We used tRPC in a Next.js page to fetch and display user data. Here’s an example in <code>pages/users/[id].tsx</code>:</p>
<pre class="language-typescript"><code class="language-typescript code-highlight"><span class="code-line"><span class="token keyword">import</span> <span class="token punctuation">{</span> trpc <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'../../lib/trpc'</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">import</span> <span class="token punctuation">{</span> useRouter <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'next/router'</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">UserProfile</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line">  <span class="token keyword">const</span> router <span class="token operator">=</span> <span class="token function">useRouter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">  <span class="token keyword">const</span> <span class="token punctuation">{</span> id <span class="token punctuation">}</span> <span class="token operator">=</span> router<span class="token punctuation">.</span>query<span class="token punctuation">;</span>
</span><span class="code-line">  
</span><span class="code-line">  <span class="token keyword">const</span> <span class="token punctuation">{</span> data<span class="token operator">:</span> user<span class="token punctuation">,</span> isLoading<span class="token punctuation">,</span> error <span class="token punctuation">}</span> <span class="token operator">=</span> trpc<span class="token punctuation">.</span>getUser<span class="token punctuation">.</span><span class="token function">useQuery</span><span class="token punctuation">(</span>
</span><span class="code-line">    <span class="token punctuation">{</span> id<span class="token operator">:</span> <span class="token keyword">typeof</span> id <span class="token operator">===</span> <span class="token string">'string'</span> <span class="token operator">?</span> id <span class="token operator">:</span> <span class="token string">''</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
</span><span class="code-line">    <span class="token punctuation">{</span> enabled<span class="token operator">:</span> <span class="token keyword">typeof</span> id <span class="token operator">===</span> <span class="token string">'string'</span> <span class="token punctuation">}</span>
</span><span class="code-line">  <span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>isLoading<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token operator">&lt;</span>div<span class="token operator">&gt;</span>Loading<span class="token operator">...</span><span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">&gt;</span><span class="token punctuation">;</span>
</span><span class="code-line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token operator">&lt;</span>div<span class="token operator">&gt;</span>Error<span class="token operator">:</span> <span class="token punctuation">{</span>error<span class="token punctuation">.</span>message<span class="token punctuation">}</span><span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">&gt;</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line">  <span class="token keyword">return</span> <span class="token punctuation">(</span>
</span><span class="code-line">    <span class="token operator">&lt;</span>div<span class="token operator">&gt;</span>
</span><span class="code-line">      <span class="token operator">&lt;</span>h1<span class="token operator">&gt;</span><span class="token punctuation">{</span>user<span class="token operator">?.</span>name<span class="token punctuation">}</span><span class="token operator">&lt;</span><span class="token operator">/</span>h1<span class="token operator">&gt;</span>
</span><span class="code-line">      <span class="token operator">&lt;</span>p<span class="token operator">&gt;</span><span class="token punctuation">{</span>user<span class="token operator">?.</span>email<span class="token punctuation">}</span><span class="token operator">&lt;</span><span class="token operator">/</span>p<span class="token operator">&gt;</span>
</span><span class="code-line">    <span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">&gt;</span>
</span><span class="code-line">  <span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
<p>This page uses the <code>getUser</code> query to fetch user data based on the dynamic route parameter <code>id</code>.</p>
<h2>Next.js Routes</h2>
<p>The Next.js application uses the following routes:</p>
<ol>
<li><code>/</code> - Home page (not shown in the example, but typically defined in <code>pages/index.tsx</code>)</li>
<li><code>/users/[id]</code> - Dynamic route for user profile (e.g., <code>/users/123</code>)</li>
<li><code>/api/trpc/[trpc]</code> - tRPC API endpoint for all tRPC procedures</li>
</ol>
<h2>tRPC Procedure Routes</h2>
<p>The tRPC router exposes the following procedure routes (accessible via the client):</p>
<ol>
<li><code>getUser</code> - Query to fetch a user by ID (e.g., <code>trpc.getUser.useQuery({ id: '123' })</code>)</li>
<li><code>createUser</code> - Mutation to create a new user (e.g., <code>trpc.createUser.useMutation()</code>)</li>
</ol>
<h2>Best Practices for Next.js and tRPC</h2>
<ol>
<li><strong>Type Safety</strong>: Leverage tRPC’s end-to-end type safety by sharing the <code>AppRouter</code> type between client and server.</li>
<li><strong>Dynamic Routes</strong>: Use Next.js dynamic routes (<code>[id].tsx</code>) to handle tRPC queries for specific resources.</li>
<li><strong>Error Handling</strong>: Implement robust error handling with React Query’s <code>error</code> state.</li>
<li><strong>Performance</strong>: Use React Query’s caching to minimize API calls and optimize client-side performance.</li>
</ol>
<p>By combining Next.js’s routing with tRPC’s type-safe API, we built an application that’s both developer-friendly and scalable, ready to power Interstellar Solutions’ ambitious goals.</p>]]></content:encoded>
            <author>raghavadeva1903@gmail.com (Devan Sekar)</author>
        </item>
        <item>
            <title><![CDATA[Building a Next.js Chatbot with Open AI]]></title>
            <link>https://devan.webswandi.in/articles/building-a-next-js-chatbot-with-open-ai</link>
            <guid>https://devan.webswandi.in/articles/building-a-next-js-chatbot-with-open-ai</guid>
            <pubDate>Sun, 08 Jun 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>At Interstellar Solutions, we set out to build an AI-powered chatbot that could provide intelligent, conversational responses to users. By leveraging Open AI’s API and the flexibility of Next.js, we created a seamless, scalable chatbot integrated into our web application.</p>
<p>To achieve this, I initialized a Next.js project, set up API routes for secure Open AI communication, and built a client-side interface for real-time chat. Below, I’ll guide you through the process of building a chatbot with Next.js and Open AI.</p>
<h2>Setting Up the Next.js Project</h2>
<p>Start by creating a new Next.js project and installing the Open AI client library:</p>
<pre class="language-bash"><code class="language-bash code-highlight"><span class="code-line">npx create-next-app@latest my-chatbot-app
</span><span class="code-line"><span class="token builtin class-name">cd</span> my-chatbot-app
</span><span class="code-line"><span class="token function">npm</span> <span class="token function">install</span> openai
</span></code></pre>
<p>You’ll also need an Open AI API key, which you can obtain from <a href="https://platform.openai.com/">Open AI’s platform</a>. Store the key in a <code>.env.local</code> file:</p>
<pre class="language-text"><code class="language-text code-highlight"><span class="code-line">OPENAI_API_KEY=your-openai-api-key
</span></code></pre>
<h2>Server-Side API Route for Open AI</h2>
<p>To securely handle Open AI requests, we created a Next.js API route in <code>pages/api/chat.ts</code>. This route processes user messages and sends them to Open AI’s API:</p>
<pre class="language-typescript"><code class="language-typescript code-highlight"><span class="code-line"><span class="token keyword">import</span> <span class="token keyword">type</span> <span class="token punctuation">{</span> NextApiRequest<span class="token punctuation">,</span> NextApiResponse <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'next'</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">import</span> OpenAI <span class="token keyword">from</span> <span class="token string">'openai'</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">const</span> openai <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">OpenAI</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
</span><span class="code-line">  apiKey<span class="token operator">:</span> process<span class="token punctuation">.</span>env<span class="token punctuation">.</span><span class="token constant">OPENAI_API_KEY</span><span class="token punctuation">,</span>
</span><span class="code-line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token function">handler</span><span class="token punctuation">(</span>req<span class="token operator">:</span> NextApiRequest<span class="token punctuation">,</span> res<span class="token operator">:</span> NextApiResponse<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>req<span class="token punctuation">.</span>method <span class="token operator">!==</span> <span class="token string">'POST'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line">    <span class="token keyword">return</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">405</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> error<span class="token operator">:</span> <span class="token string">'Method not allowed'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">  <span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line">  <span class="token keyword">try</span> <span class="token punctuation">{</span>
</span><span class="code-line">    <span class="token keyword">const</span> <span class="token punctuation">{</span> message <span class="token punctuation">}</span> <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">;</span>
</span><span class="code-line">    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>message<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line">      <span class="token keyword">return</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">400</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> error<span class="token operator">:</span> <span class="token string">'Message is required'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">    <span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line">    <span class="token keyword">const</span> completion <span class="token operator">=</span> <span class="token keyword">await</span> openai<span class="token punctuation">.</span>chat<span class="token punctuation">.</span>completions<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
</span><span class="code-line">      model<span class="token operator">:</span> <span class="token string">'gpt-4o-mini'</span><span class="token punctuation">,</span>
</span><span class="code-line">      messages<span class="token operator">:</span> <span class="token punctuation">[</span>
</span><span class="code-line">        <span class="token punctuation">{</span> role<span class="token operator">:</span> <span class="token string">'system'</span><span class="token punctuation">,</span> content<span class="token operator">:</span> <span class="token string">'You are a helpful assistant.'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
</span><span class="code-line">        <span class="token punctuation">{</span> role<span class="token operator">:</span> <span class="token string">'user'</span><span class="token punctuation">,</span> content<span class="token operator">:</span> message <span class="token punctuation">}</span><span class="token punctuation">,</span>
</span><span class="code-line">      <span class="token punctuation">]</span><span class="token punctuation">,</span>
</span><span class="code-line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line">    <span class="token keyword">const</span> response <span class="token operator">=</span> completion<span class="token punctuation">.</span>choices<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token operator">?.</span>message<span class="token operator">?.</span>content <span class="token operator">||</span> <span class="token string">'No response'</span><span class="token punctuation">;</span>
</span><span class="code-line">    res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> response <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">  <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line">    <span class="token builtin">console</span><span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string">'Open AI error:'</span><span class="token punctuation">,</span> error<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">    res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">500</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> error<span class="token operator">:</span> <span class="token string">'Internal server error'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">  <span class="token punctuation">}</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
<p>This API route accepts POST requests with a user message, sends it to Open AI’s <code>gpt-4o-mini</code> model, and returns the AI’s response.</p>
<h2>Client-Side Chat Interface</h2>
<p>We built a simple chat interface in <code>pages/index.tsx</code> using React state to manage the conversation. The interface sends user input to the <code>/api/chat</code> endpoint and displays the AI’s responses:</p>
<pre class="language-typescript"><code class="language-typescript code-highlight"><span class="code-line"><span class="token keyword">import</span> <span class="token punctuation">{</span> useState <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'react'</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">Chatbot</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line">  <span class="token keyword">const</span> <span class="token punctuation">[</span>messages<span class="token punctuation">,</span> setMessages<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token generic-function"><span class="token function">useState</span><span class="token generic class-name"><span class="token operator">&lt;</span><span class="token punctuation">{</span> role<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span> content<span class="token operator">:</span> <span class="token builtin">string</span> <span class="token punctuation">}</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">  <span class="token keyword">const</span> <span class="token punctuation">[</span>input<span class="token punctuation">,</span> setInput<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">useState</span><span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line">  <span class="token keyword">const</span> <span class="token function-variable function">handleSend</span> <span class="token operator">=</span> <span class="token keyword">async</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>
</span><span class="code-line">    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>input<span class="token punctuation">.</span><span class="token function">trim</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line">    <span class="token keyword">const</span> userMessage <span class="token operator">=</span> <span class="token punctuation">{</span> role<span class="token operator">:</span> <span class="token string">'user'</span><span class="token punctuation">,</span> content<span class="token operator">:</span> input <span class="token punctuation">}</span><span class="token punctuation">;</span>
</span><span class="code-line">    <span class="token function">setMessages</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token operator">...</span>messages<span class="token punctuation">,</span> userMessage<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">    <span class="token function">setInput</span><span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line">    <span class="token keyword">try</span> <span class="token punctuation">{</span>
</span><span class="code-line">      <span class="token keyword">const</span> res <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">fetch</span><span class="token punctuation">(</span><span class="token string">'/api/chat'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>
</span><span class="code-line">        method<span class="token operator">:</span> <span class="token string">'POST'</span><span class="token punctuation">,</span>
</span><span class="code-line">        headers<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token string-property property">'Content-Type'</span><span class="token operator">:</span> <span class="token string">'application/json'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
</span><span class="code-line">        body<span class="token operator">:</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span><span class="token punctuation">{</span> message<span class="token operator">:</span> input <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
</span><span class="code-line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">      <span class="token keyword">const</span> data <span class="token operator">=</span> <span class="token keyword">await</span> res<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">      <span class="token keyword">if</span> <span class="token punctuation">(</span>data<span class="token punctuation">.</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line">        <span class="token function">setMessages</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token operator">...</span>messages<span class="token punctuation">,</span> userMessage<span class="token punctuation">,</span> <span class="token punctuation">{</span> role<span class="token operator">:</span> <span class="token string">'assistant'</span><span class="token punctuation">,</span> content<span class="token operator">:</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">Error: </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>data<span class="token punctuation">.</span>error<span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">`</span></span> <span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">      <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
</span><span class="code-line">        <span class="token function">setMessages</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token operator">...</span>messages<span class="token punctuation">,</span> userMessage<span class="token punctuation">,</span> <span class="token punctuation">{</span> role<span class="token operator">:</span> <span class="token string">'assistant'</span><span class="token punctuation">,</span> content<span class="token operator">:</span> data<span class="token punctuation">.</span>response <span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">      <span class="token punctuation">}</span>
</span><span class="code-line">    <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line">      <span class="token function">setMessages</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token operator">...</span>messages<span class="token punctuation">,</span> userMessage<span class="token punctuation">,</span> <span class="token punctuation">{</span> role<span class="token operator">:</span> <span class="token string">'assistant'</span><span class="token punctuation">,</span> content<span class="token operator">:</span> <span class="token string">'Error: Failed to connect to the server'</span> <span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">    <span class="token punctuation">}</span>
</span><span class="code-line">  <span class="token punctuation">}</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line">  <span class="token keyword">return</span> <span class="token punctuation">(</span>
</span><span class="code-line">    <span class="token operator">&lt;</span>div className<span class="token operator">=</span><span class="token string">"max-w-2xl mx-auto p-4"</span><span class="token operator">&gt;</span>
</span><span class="code-line">      <span class="token operator">&lt;</span>h1 className<span class="token operator">=</span><span class="token string">"text-2xl font-bold mb-4"</span><span class="token operator">&gt;</span><span class="token constant">AI</span> Chatbot<span class="token operator">&lt;</span><span class="token operator">/</span>h1<span class="token operator">&gt;</span>
</span><span class="code-line">      <span class="token operator">&lt;</span>div className<span class="token operator">=</span><span class="token string">"border rounded-lg p-4 mb-4 h-96 overflow-y-auto"</span><span class="token operator">&gt;</span>
</span><span class="code-line">        <span class="token punctuation">{</span>messages<span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span><span class="token punctuation">(</span>msg<span class="token punctuation">,</span> index<span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">(</span>
</span><span class="code-line">          <span class="token operator">&lt;</span>div key<span class="token operator">=</span><span class="token punctuation">{</span>index<span class="token punctuation">}</span> className<span class="token operator">=</span><span class="token punctuation">{</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">mb-2 </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>msg<span class="token punctuation">.</span>role <span class="token operator">===</span> <span class="token string">'user'</span> <span class="token operator">?</span> <span class="token string">'text-right'</span> <span class="token operator">:</span> <span class="token string">'text-left'</span><span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">}</span><span class="token operator">&gt;</span>
</span><span class="code-line">            <span class="token operator">&lt;</span>span className<span class="token operator">=</span><span class="token punctuation">{</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">inline-block p-2 rounded </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>msg<span class="token punctuation">.</span>role <span class="token operator">===</span> <span class="token string">'user'</span> <span class="token operator">?</span> <span class="token string">'bg-blue-100'</span> <span class="token operator">:</span> <span class="token string">'bg-gray-100'</span><span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">}</span><span class="token operator">&gt;</span>
</span><span class="code-line">              <span class="token punctuation">{</span>msg<span class="token punctuation">.</span>content<span class="token punctuation">}</span>
</span><span class="code-line">            <span class="token operator">&lt;</span><span class="token operator">/</span>span<span class="token operator">&gt;</span>
</span><span class="code-line">          <span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">&gt;</span>
</span><span class="code-line">        <span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">}</span>
</span><span class="code-line">      <span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">&gt;</span>
</span><span class="code-line">      <span class="token operator">&lt;</span>div className<span class="token operator">=</span><span class="token string">"flex gap-2"</span><span class="token operator">&gt;</span>
</span><span class="code-line">        <span class="token operator">&lt;</span>input
</span><span class="code-line">          type<span class="token operator">=</span><span class="token string">"text"</span>
</span><span class="code-line">          value<span class="token operator">=</span><span class="token punctuation">{</span>input<span class="token punctuation">}</span>
</span><span class="code-line">          onChange<span class="token operator">=</span><span class="token punctuation">{</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token function">setInput</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span>target<span class="token punctuation">.</span>value<span class="token punctuation">)</span><span class="token punctuation">}</span>
</span><span class="code-line">          className<span class="token operator">=</span><span class="token string">"flex-1 p-2 border rounded"</span>
</span><span class="code-line">          placeholder<span class="token operator">=</span><span class="token string">"Type your message..."</span>
</span><span class="code-line">          onKeyPress<span class="token operator">=</span><span class="token punctuation">{</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token operator">=&gt;</span> e<span class="token punctuation">.</span>key <span class="token operator">===</span> <span class="token string">'Enter'</span> <span class="token operator">&amp;&amp;</span> <span class="token function">handleSend</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">}</span>
</span><span class="code-line">        <span class="token operator">/</span><span class="token operator">&gt;</span>
</span><span class="code-line">        <span class="token operator">&lt;</span>button onClick<span class="token operator">=</span><span class="token punctuation">{</span>handleSend<span class="token punctuation">}</span> className<span class="token operator">=</span><span class="token string">"p-2 bg-blue-500 text-white rounded"</span><span class="token operator">&gt;</span>
</span><span class="code-line">          Send
</span><span class="code-line">        <span class="token operator">&lt;</span><span class="token operator">/</span>button<span class="token operator">&gt;</span>
</span><span class="code-line">      <span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">&gt;</span>
</span><span class="code-line">    <span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">&gt;</span>
</span><span class="code-line">  <span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
<h2>Next.js Routes</h2>
<p>The Next.js application uses the following routes:</p>
<ol>
<li><code>/</code> - Main chat interface (defined in <code>pages/index.tsx</code>)</li>
<li><code>/api/chat</code> - API route for handling Open AI chat requests</li>
</ol>
<h2>Best Practices for Next.js and Open AI</h2>
<ol>
<li><strong>Secure API Key</strong>: Store the Open AI API key in environment variables and never expose it client-side.</li>
<li><strong>Error Handling</strong>: Implement robust error handling on both client and server to handle API failures gracefully.</li>
<li><strong>Rate Limiting</strong>: Consider adding rate limiting to the <code>/api/chat</code> route to prevent abuse.</li>
<li><strong>Styling</strong>: Use Tailwind CSS (as shown in the example) for a responsive, modern interface.</li>
<li><strong>Conversation Context</strong>: Enhance the chatbot by maintaining conversation history in the Open AI API calls for context-aware responses.</li>
</ol>]]></content:encoded>
            <author>raghavadeva1903@gmail.com (Devan Sekar)</author>
        </item>
        <item>
            <title><![CDATA[Building Real Voice AI Agents with Vapi]]></title>
            <link>https://devan.webswandi.in/articles/building-real-voice-ai-agents-with-vapi</link>
            <guid>https://devan.webswandi.in/articles/building-real-voice-ai-agents-with-vapi</guid>
            <pubDate>Fri, 07 Nov 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Voice AI is evolving fast — and Vapi is one of the most developer-friendly platforms making it real. If you've ever wanted to build an AI that can talk, transfer, and think, here's the complete breakdown you need.</p>
<img alt="Building Real Voice AI Agents with Vapi" loading="lazy" width="1024" height="1024" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2Fimages%2Fvapi.png&amp;w=1080&amp;q=75 1x, /_next/image?url=%2Fimages%2Fvapi.png&amp;w=2048&amp;q=75 2x" src="/_next/image?url=%2Fimages%2Fvapi.png&amp;w=2048&amp;q=75">
<p>The future of AI assistants isn't chat-based — it's voice-based. And platforms like Vapi are making that future easier to build than ever.</p>
<h2>1. What is an Assistant in Vapi?</h2>
<p>Think of it as your AI voice agent. An Assistant is an AI that listens, understands, and responds to users during a call naturally — handling users just like a real agent would.</p>
<p><strong>Key Features:</strong></p>
<ul>
<li>Listens to caller input in real-time</li>
<li>Understands natural language</li>
<li>Responds conversationally</li>
<li>Executes tasks during the call</li>
</ul>
<h2>2. System Prompt — The Assistant's Personality</h2>
<p>The System Prompt is the main instruction given to the AI model. It tells the assistant how to talk, what tone to use, and what it should do.</p>
<p><strong>Why it's used:</strong></p>
<ul>
<li>Controls the assistant's behavior</li>
<li>Makes responses consistent and professional</li>
<li>Ensures it follows specific rules (like asking for name, phone number, etc.)</li>
<li>Sets the tone, style, and logic</li>
</ul>
<p>The system prompt defines your assistant's personality — whether it's friendly, professional, or technical. It's the foundation of how your AI interacts with callers.</p>
<h2>3. Tools — Where AI Starts Doing Real Work</h2>
<p>Tools are small actions the assistant can perform automatically. They help the assistant do real tasks — not just talk.</p>
<p><strong>Common Tools:</strong></p>
<ol>
<li><strong>Query Tool</strong> - Searches information from knowledge bases</li>
<li><strong>Transfer Call Tool</strong> - Connects caller to a real human</li>
</ol>
<h3>3.1 How to Link Multiple Tools to the Assistant</h3>
<ol>
<li>Go to Assistant module</li>
<li>Click the Assistant and select the "Tools" tab</li>
<li>At the bottom, select the Tools you want to use for this assistant</li>
<li>Click Publish to save</li>
</ol>
<p>You can attach multiple tools per assistant to enhance its capabilities and handle different scenarios.</p>
<h2>4. Query Tool — The Knowledge Engine</h2>
<p><strong>Purpose:</strong> Lets assistant search information from uploaded Knowledge Base files.</p>
<p><strong>How it works:</strong></p>
<ol>
<li>Caller asks a question</li>
<li>Assistant searches knowledge base files</li>
<li>Returns relevant information</li>
<li>Assistant responds to caller with accurate data</li>
</ol>
<h3>4.1 What are Knowledge Base Files?</h3>
<p>Knowledge Base Files are reference documents (PDF, TXT) that help the assistant give correct answers about your business or process.</p>
<p><strong>Example:</strong>
A law firm can upload "Accepted Case Types.pdf". The assistant reads it and uses it to answer related questions correctly.</p>
<p><strong>Purpose:</strong></p>
<ul>
<li>Provide background information</li>
<li>Help the assistant give accurate, company-specific answers</li>
<li>Make your AI genuinely knowledge-aware, not just smart-sounding</li>
</ul>
<h3>4.2 How To Upload Knowledge Base Files in Vapi</h3>
<ol>
<li>Go to the Files Module</li>
<li>Upload the new Knowledge Base .txt file</li>
<li>If you need to edit existing files:<!-- -->
<ul>
<li>Download the existing file</li>
<li>Delete the existing Knowledge Base file</li>
<li>Reupload the corrected Knowledge Base file again</li>
</ul>
</li>
</ol>
<h3>4.3 Where to Link Knowledge Base Files</h3>
<ol>
<li>Go to the Query Tool</li>
<li>Under Knowledge Bases section, add multiple knowledge base files</li>
<li>Save and publish</li>
</ol>
<h2>5. Transfer Tool — When AI Meets Human</h2>
<p>In simple words, it's designed to make a smooth hand-off from AI to a real person. The Transfer Call Tool lets your AI assistant connect the caller to a real human agent.</p>
<p><strong>It is used when:</strong></p>
<ul>
<li>The caller needs help from a live person</li>
<li>The AI has finished collecting the needed details</li>
<li>The query is too complex for automated handling</li>
</ul>
<h3>5.1 How to Add Phone Numbers for Transfer Call Tool</h3>
<ol>
<li>Go to Tools in the Vapi dashboard</li>
<li>Click Create Tool and select Transfer Call Tool</li>
<li>Enter the name and description of the tool</li>
<li>Scroll to the Destination section</li>
<li>Click Add Phone Number to add your real phone numbers</li>
<li>Make sure each number is in the correct E.164 format (example: +15012488744)</li>
<li>Enable Enforce E164 format for each phone number</li>
<li>Add multiple phone numbers if needed</li>
<li>Click Save Tool to finish</li>
</ol>
<h2>6. Phone Number Integration</h2>
<p><strong>Purpose:</strong> The phone number in Vapi is used to make and receive real calls through the assistant. It connects the AI assistant to actual phone networks, allowing inbound calls from users and outbound or transfer calls to real people.</p>
<h3>6.1 Why We Need to Use Twilio Phone Numbers</h3>
<ul>
<li>Twilio phone numbers are reliable and ready for production use</li>
<li>Twilio numbers allow the assistant to make outbound or transfer calls to real people</li>
<li>If you use only Vapi phone numbers, transfer calls will not work, as they require Twilio integration for real call routing</li>
</ul>
<p>Without Twilio, call transfers won't work.</p>
<h3>6.2 How to Set Up and Link the Phone Number for the Assistant</h3>
<ol>
<li>Go to the Phone Numbers module in Vapi</li>
<li>Click Create a Phone Number</li>
<li>Select Import Twilio</li>
<li>Enter the Twilio phone number (created in your Twilio account)</li>
<li>Enter your Twilio Account SID and Auth Token</li>
<li>Give a label or name for the phone number for easy identification</li>
<li>Click Import from Twilio</li>
<li>Once imported, scroll to Inbound Settings</li>
<li>Select the Assistant you want to link with this phone number</li>
<li>Click Save</li>
</ol>
<p><strong>Test it:</strong> Make a test call to the Twilio phone number — the assistant should now answer and speak.</p>
<h2>7. Call Logs — Know What's Happening</h2>
<p>The purpose of the Call Log in Vapi is to record and track all calls made or received by your assistant.</p>
<p><strong>It shows details like:</strong></p>
<ul>
<li>Caller number</li>
<li>Call time</li>
<li>Duration</li>
<li>Transcript</li>
<li>Recording</li>
</ul>
<p><strong>Perfect for:</strong></p>
<ul>
<li>Debugging issues</li>
<li>Performance reviews</li>
<li>Training improvements</li>
<li>Monitoring assistant quality</li>
</ul>
<h2>Why This Matters</h2>
<p>Vapi isn't just another AI tool — it's an end-to-end voice automation framework. From voice recognition to real-time conversation to call transfers — all in one system.</p>
<p><strong>It helps startups and teams:</strong></p>
<ul>
<li>Automate support</li>
<li>Qualify leads</li>
<li>Handle repetitive voice workflows</li>
<li>Maintain human-level quality</li>
</ul>
<h2>Final Thoughts</h2>
<p>The future of AI assistants isn't chat-based — it's voice-based. And platforms like Vapi are making that future easier to build than ever.</p>
<p>Have you tried creating a voice AI yet? If not, maybe it's time to let your assistant pick up the next call.</p>
<p>Voice AI is no longer science fiction — it's a practical tool that can transform how businesses interact with customers, and Vapi makes it accessible to developers of all skill levels.</p>]]></content:encoded>
            <author>raghavadeva1903@gmail.com (Devan Sekar)</author>
        </item>
        <item>
            <title><![CDATA[Crafting a MERN Stack Application with Routes]]></title>
            <link>https://devan.webswandi.in/articles/crafting-a-mern-stack-application-with-routes</link>
            <guid>https://devan.webswandi.in/articles/crafting-a-mern-stack-application-with-routes</guid>
            <pubDate>Fri, 09 May 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Building scalable web applications with the MERN stack (MongoDB, Express.js, React, Node.js) requires a robust routing system to handle client and server-side navigation. At Interstellar Solutions, we aimed to create a MERN application that could scale across multiple platforms while maintaining clean, maintainable routes.</p>
<p>To achieve this, I set up a Node.js environment, initialized a MongoDB database, and dove into configuring routes for both the backend and frontend. Below, I’ll walk you through the process of setting up routes in a MERN stack application.</p>
<h2>Setting Up Server-Side Routes with Express.js</h2>
<p>On the backend, Express.js handles API routes to interact with the MongoDB database. We needed routes for user authentication, data retrieval, and CRUD operations. Here’s an example of how we structured the routes in Express.js:</p>
<pre class="language-javascript"><code class="language-javascript code-highlight"><span class="code-line"><span class="token keyword">const</span> express <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'express'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">const</span> router <span class="token operator">=</span> express<span class="token punctuation">.</span><span class="token method function property-access"><span class="token maybe-class-name">Router</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">const</span> userController <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'../controllers/userController'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token comment">// User Routes</span>
</span><span class="code-line">router<span class="token punctuation">.</span><span class="token method function property-access">get</span><span class="token punctuation">(</span><span class="token string">'/users'</span><span class="token punctuation">,</span> userController<span class="token punctuation">.</span><span class="token property-access">getAllUsers</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">router<span class="token punctuation">.</span><span class="token method function property-access">post</span><span class="token punctuation">(</span><span class="token string">'/users'</span><span class="token punctuation">,</span> userController<span class="token punctuation">.</span><span class="token property-access">createUser</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">router<span class="token punctuation">.</span><span class="token method function property-access">get</span><span class="token punctuation">(</span><span class="token string">'/users/:id'</span><span class="token punctuation">,</span> userController<span class="token punctuation">.</span><span class="token property-access">getUserById</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">router<span class="token punctuation">.</span><span class="token method function property-access">put</span><span class="token punctuation">(</span><span class="token string">'/users/:id'</span><span class="token punctuation">,</span> userController<span class="token punctuation">.</span><span class="token property-access">updateUser</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">router<span class="token punctuation">.</span><span class="token method function property-access">delete</span><span class="token punctuation">(</span><span class="token string">'/users/:id'</span><span class="token punctuation">,</span> userController<span class="token punctuation">.</span><span class="token property-access">deleteUser</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line">module<span class="token punctuation">.</span><span class="token property-access">exports</span> <span class="token operator">=</span> router<span class="token punctuation">;</span>
</span></code></pre>
<p>This code defines a router for user-related endpoints, which is then mounted in the main Express app. The <code>userController</code> handles the business logic for each route.</p>
<h2>Client-Side Routing with React Router</h2>
<p>On the frontend, React Router enables seamless navigation without full page reloads. We used <code>react-router-dom</code> to define routes for different components, ensuring a smooth user experience. Here’s an example of setting up client-side routes:</p>
<pre class="language-javascript"><code class="language-javascript code-highlight"><span class="code-line"><span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">BrowserRouter</span><span class="token punctuation">,</span> <span class="token maybe-class-name">Routes</span><span class="token punctuation">,</span> <span class="token maybe-class-name">Route</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">'react-router-dom'</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword module">import</span> <span class="token imports"><span class="token maybe-class-name">Home</span></span> <span class="token keyword module">from</span> <span class="token string">'./components/Home'</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword module">import</span> <span class="token imports"><span class="token maybe-class-name">UserProfile</span></span> <span class="token keyword module">from</span> <span class="token string">'./components/UserProfile'</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword module">import</span> <span class="token imports"><span class="token maybe-class-name">Dashboard</span></span> <span class="token keyword module">from</span> <span class="token string">'./components/Dashboard'</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword module">import</span> <span class="token imports"><span class="token maybe-class-name">NotFound</span></span> <span class="token keyword module">from</span> <span class="token string">'./components/NotFound'</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">function</span> <span class="token function"><span class="token maybe-class-name">App</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line">  <span class="token keyword control-flow">return</span> <span class="token punctuation">(</span>
</span><span class="code-line">    <span class="token operator">&lt;</span><span class="token maybe-class-name">BrowserRouter</span><span class="token operator">&gt;</span>
</span><span class="code-line">      <span class="token operator">&lt;</span><span class="token maybe-class-name">Routes</span><span class="token operator">&gt;</span>
</span><span class="code-line">        <span class="token operator">&lt;</span><span class="token maybe-class-name">Route</span> path<span class="token operator">=</span><span class="token string">"/"</span> element<span class="token operator">=</span><span class="token punctuation">{</span><span class="token operator">&lt;</span><span class="token maybe-class-name">Home</span> <span class="token operator">/</span><span class="token operator">&gt;</span><span class="token punctuation">}</span> <span class="token operator">/</span><span class="token operator">&gt;</span>
</span><span class="code-line">        <span class="token operator">&lt;</span><span class="token maybe-class-name">Route</span> path<span class="token operator">=</span><span class="token string">"/profile/:id"</span> element<span class="token operator">=</span><span class="token punctuation">{</span><span class="token operator">&lt;</span><span class="token maybe-class-name">UserProfile</span> <span class="token operator">/</span><span class="token operator">&gt;</span><span class="token punctuation">}</span> <span class="token operator">/</span><span class="token operator">&gt;</span>
</span><span class="code-line">        <span class="token operator">&lt;</span><span class="token maybe-class-name">Route</span> path<span class="token operator">=</span><span class="token string">"/dashboard"</span> element<span class="token operator">=</span><span class="token punctuation">{</span><span class="token operator">&lt;</span><span class="token maybe-class-name">Dashboard</span> <span class="token operator">/</span><span class="token operator">&gt;</span><span class="token punctuation">}</span> <span class="token operator">/</span><span class="token operator">&gt;</span>
</span><span class="code-line">        <span class="token operator">&lt;</span><span class="token maybe-class-name">Route</span> path<span class="token operator">=</span><span class="token string">"*"</span> element<span class="token operator">=</span><span class="token punctuation">{</span><span class="token operator">&lt;</span><span class="token maybe-class-name">NotFound</span> <span class="token operator">/</span><span class="token operator">&gt;</span><span class="token punctuation">}</span> <span class="token operator">/</span><span class="token operator">&gt;</span>
</span><span class="code-line">      <span class="token operator">&lt;</span><span class="token operator">/</span><span class="token maybe-class-name">Routes</span><span class="token operator">&gt;</span>
</span><span class="code-line">    <span class="token operator">&lt;</span><span class="token operator">/</span><span class="token maybe-class-name">BrowserRouter</span><span class="token operator">&gt;</span>
</span><span class="code-line">  <span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword module">export</span> <span class="token keyword module">default</span> <span class="token maybe-class-name">App</span><span class="token punctuation">;</span>
</span></code></pre>
<p>This setup defines routes for the home page, user profile, dashboard, and a catch-all for 404 errors. The <code>:id</code> parameter allows dynamic routing for user profiles.</p>
<h2>Connecting Frontend and Backend</h2>
<p>To connect the frontend routes to the backend API, we used Axios to make HTTP requests. For example, fetching user data for the <code>/profile/:id</code> route:</p>
<pre class="language-javascript"><code class="language-javascript code-highlight"><span class="code-line"><span class="token keyword module">import</span> <span class="token imports">axios</span> <span class="token keyword module">from</span> <span class="token string">'axios'</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> useEffect<span class="token punctuation">,</span> useState <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">'react'</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> useParams <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">'react-router-dom'</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">function</span> <span class="token function"><span class="token maybe-class-name">UserProfile</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line">  <span class="token keyword">const</span> <span class="token punctuation">[</span>user<span class="token punctuation">,</span> setUser<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">useState</span><span class="token punctuation">(</span><span class="token keyword null nil">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">  <span class="token keyword">const</span> <span class="token punctuation">{</span> id <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">useParams</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line">  <span class="token function">useEffect</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token arrow operator">=&gt;</span> <span class="token punctuation">{</span>
</span><span class="code-line">    axios<span class="token punctuation">.</span><span class="token method function property-access">get</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">/api/users/</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>id<span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span>
</span><span class="code-line">      <span class="token punctuation">.</span><span class="token method function property-access">then</span><span class="token punctuation">(</span><span class="token parameter">response</span> <span class="token arrow operator">=&gt;</span> <span class="token function">setUser</span><span class="token punctuation">(</span>response<span class="token punctuation">.</span><span class="token property-access">data</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
</span><span class="code-line">      <span class="token punctuation">.</span><span class="token keyword control-flow">catch</span><span class="token punctuation">(</span><span class="token parameter">error</span> <span class="token arrow operator">=&gt;</span> <span class="token console class-name">console</span><span class="token punctuation">.</span><span class="token method function property-access">error</span><span class="token punctuation">(</span><span class="token string">'Error fetching user:'</span><span class="token punctuation">,</span> error<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">  <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>id<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line">  <span class="token keyword control-flow">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>user<span class="token punctuation">)</span> <span class="token keyword control-flow">return</span> <span class="token operator">&lt;</span>div<span class="token operator">&gt;</span><span class="token maybe-class-name">Loading</span><span class="token spread operator">...</span><span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">&gt;</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line">  <span class="token keyword control-flow">return</span> <span class="token punctuation">(</span>
</span><span class="code-line">    <span class="token operator">&lt;</span>div<span class="token operator">&gt;</span>
</span><span class="code-line">      <span class="token operator">&lt;</span>h1<span class="token operator">&gt;</span><span class="token punctuation">{</span>user<span class="token punctuation">.</span><span class="token property-access">name</span><span class="token punctuation">}</span><span class="token operator">&lt;</span><span class="token operator">/</span>h1<span class="token operator">&gt;</span>
</span><span class="code-line">      <span class="token operator">&lt;</span>p<span class="token operator">&gt;</span><span class="token punctuation">{</span>user<span class="token punctuation">.</span><span class="token property-access">email</span><span class="token punctuation">}</span><span class="token operator">&lt;</span><span class="token operator">/</span>p<span class="token operator">&gt;</span>
</span><span class="code-line">    <span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">&gt;</span>
</span><span class="code-line">  <span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword module">export</span> <span class="token keyword module">default</span> <span class="token maybe-class-name">UserProfile</span><span class="token punctuation">;</span>
</span></code></pre>
<p>This component fetches user data from the backend API and displays it dynamically based on the route parameter.</p>
<h2>Best Practices for MERN Routing</h2>
<ol>
<li><strong>Modularize Routes</strong>: Keep backend routes modular by separating them into different router files (e.g., <code>userRoutes.js</code>, <code>productRoutes.js</code>).</li>
<li><strong>Protect Routes</strong>: Use middleware for authentication on sensitive routes (e.g., <code>/dashboard</code>).</li>
<li><strong>Handle Errors</strong>: Implement error handling for both client and server routes to ensure a smooth user experience.</li>
<li><strong>Optimize Performance</strong>: Use lazy loading for React components to reduce initial load times.</li>
</ol>
<p>By combining Express.js for server-side routing and React Router for client-side navigation, we built a MERN application that’s both scalable and user-friendly. This approach ensures our app can handle the demands of a multiplanetary future, where seamless navigation is key.</p>]]></content:encoded>
            <author>raghavadeva1903@gmail.com (Devan Sekar)</author>
        </item>
    </channel>
</rss>