<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: NexOper</title>
    <description>The latest articles on DEV Community by NexOper (@nexoper).</description>
    <link>https://dev.to/nexoper</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4122654%2F37f04002-2f7d-45ef-b832-8bab04a89b29.png</url>
      <title>DEV Community: NexOper</title>
      <link>https://dev.to/nexoper</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nexoper"/>
    <language>en</language>
    <item>
      <title>How I Built a Bilingual RAG-Powered AI Calling &amp; Chat Agent (With a Full Admin Ops Center)</title>
      <dc:creator>NexOper</dc:creator>
      <pubDate>Sun, 13 Sep 2026 19:56:29 +0000</pubDate>
      <link>https://dev.to/nexoper/how-i-built-a-bilingual-rag-powered-ai-calling-chat-agent-with-a-full-admin-ops-center-573o</link>
      <guid>https://dev.to/nexoper/how-i-built-a-bilingual-rag-powered-ai-calling-chat-agent-with-a-full-admin-ops-center-573o</guid>
      <description>&lt;p&gt;Most "AI chatbot" projects stop at a demo: a widget, an OpenAI/Gemini call, a canned prompt. Getting one into production for real businesses — across voice calls, web chat, and WhatsApp, in two languages, without hallucinating — is a different problem. Here's how I approached it.&lt;/p&gt;

&lt;p&gt;The Core Challenge&lt;/p&gt;

&lt;p&gt;Three requirements shaped the whole architecture:&lt;/p&gt;

&lt;p&gt;Multi-channel, single brain — phone calls, web chat, WhatsApp, and Instagram all needed to hit the same knowledge base and produce consistent answers.&lt;br&gt;
No hallucination tolerance — a wrong answer on a live sales call is worse than no answer.&lt;br&gt;
Non-technical operators — the business owner using the admin panel should never need to touch a config file, an API key in code, or a terminal.&lt;br&gt;
The RAG Pipeline&lt;/p&gt;

&lt;p&gt;The knowledge layer runs on a fairly standard but carefully tuned RAG stack:&lt;/p&gt;

&lt;p&gt;Ingestion: a website crawler pulls headers, paragraphs, and lists from a given URL (or a pasted/uploaded document), and normalizes it into clean text chunks.&lt;br&gt;
Embedding: chunks are embedded using gemini-embedding-001.&lt;br&gt;
Storage: vectors are indexed into ChromaDB for fast cosine-similarity retrieval.&lt;br&gt;
Retrieval-time logic: on every incoming query, the system computes similarity scores against the knowledge base. If the top match clears a confidence threshold, it answers from the KB (source: knowledge_base). If not, it falls back to a live, relevant web search (source: search_fallback) rather than letting the LLM freestyle an answer from parametric memory.&lt;/p&gt;

&lt;p&gt;That fallback tagging turned out to be one of the most useful design decisions — every logged interaction carries a source field (knowledge_base or search_fallback), which means you get a real-time KB Hit Rate metric for free: how often the system is confidently answering from your own data vs. reaching outside it.&lt;/p&gt;

&lt;p&gt;Observability Was Not an Afterthought&lt;/p&gt;

&lt;p&gt;A lot of RAG demos skip this, and it's the first thing that breaks trust once you hand a system to a real business. I built a diagnostic layer that surfaces, per query:&lt;/p&gt;

&lt;p&gt;Cosine distance / similarity scores against retrieved chunks&lt;br&gt;
Which knowledge base sections were actually matched&lt;br&gt;
End-to-end latency (ms)&lt;br&gt;
Source attribution (KB vs. fallback)&lt;/p&gt;

&lt;p&gt;This is exposed directly in a "Diagnostic Playground" in the admin UI — type a query, and see exactly what the retrieval layer matched and why, before it ever reaches a real customer.&lt;/p&gt;

&lt;p&gt;Aggregate metrics (Total Conversations, Average Latency, KB Hit Rate, Search Fallback %, Error Rate) roll up from the same interaction logs into an overview dashboard — no separate analytics pipeline needed.&lt;/p&gt;

&lt;p&gt;Lead Extraction Without a Structured Form&lt;/p&gt;

&lt;p&gt;Because conversations happen in free text (and voice-to-text), lead capture couldn't rely on form fields. The system parses conversational turns for identifiers — name, phone number, email — as they're mentioned naturally ("my name is X and my number is Y"), writes them to a leads table, deduplicates against existing entries, and assigns the lead to a sales rep via round-robin rotation. This runs as a lightweight side-effect of the main conversation loop, not a separate workflow the user has to trigger.&lt;/p&gt;

&lt;p&gt;Multi-Tenant Branding Without Multi-Tenant Infra Complexity&lt;/p&gt;

&lt;p&gt;Rather than spinning up separate deployments per client, business identity (company name, agent persona, tone, contact details, tagline) is stored as a set of "Business Variables" that get interpolated into the system prompt and voice/chat responses at runtime. One codebase, many brands — which matters a lot if you're an agency or planning to white-label this.&lt;/p&gt;

&lt;p&gt;No-Code Data Layer&lt;/p&gt;

&lt;p&gt;The default store is local (SQLite) for simplicity, but the admin UI also supports connecting an external Postgres-compatible database (Supabase, Neon, or vanilla Postgres) via a connection string pasted directly into the UI — no backend redeploy required. This was a deliberate trade-off: less "clever" than an ORM migration system, but it means a non-engineer can point the whole system at their own cloud database in under a minute.&lt;/p&gt;

&lt;p&gt;&lt;a href="![%20](https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/k7cc673o3a1hz0zdpjgc.jpeg)"&gt;&lt;/a&gt;Bilingual by Default&lt;/p&gt;

&lt;p&gt;Since the target users span Hindi and English speakers, language handling isn't a toggle — the model detects and responds in whichever language the user used, per message, in both voice (STT/TTS) and text channels.&lt;/p&gt;

&lt;p&gt;What I'd Do Differently Next&lt;br&gt;
Real-time in-call escalation to a human when confidence is low (currently: unresolved queries become a lead for post-call follow-up — live handoff is the next milestone)&lt;br&gt;
Per-channel confidence thresholds (a WhatsApp typo tolerance vs. a live voice transcript need different tuning)&lt;br&gt;
Try It&lt;/p&gt;

&lt;p&gt;If you're building something similar or want to see this running on a real business's data, I opened up a free 10-day trial — happy to walk through the architecture in more depth too.&lt;/p&gt;

&lt;p&gt;📧 &lt;a href="mailto:nexopersupport@gmail.com"&gt;nexopersupport@gmail.com&lt;/a&gt; · 🌐 nexoper.in&lt;/p&gt;

&lt;p&gt;Would genuinely love feedback from anyone who's tuned RAG confidence thresholds for production voice use cases — what's worked for you?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>automation</category>
      <category>saas</category>
    </item>
    <item>
      <title>Taking a Client from Zero Web Presence to 95+ Lighthouse Scores: A Real Build Breakdown</title>
      <dc:creator>NexOper</dc:creator>
      <pubDate>Sat, 12 Sep 2026 18:30:00 +0000</pubDate>
      <link>https://dev.to/nexoper/taking-a-client-from-zero-web-presence-to-95-lighthouse-scores-a-real-build-breakdown-mhm</link>
      <guid>https://dev.to/nexoper/taking-a-client-from-zero-web-presence-to-95-lighthouse-scores-a-real-build-breakdown-mhm</guid>
      <description>&lt;p&gt;A recent client project: a tourist/student visa consultancy with no existing website — every lead came through offline referrals. Sharing the technical approach and real post-launch metrics, since most case studies skip the actual numbers.&lt;/p&gt;

&lt;p&gt;Technical approach:&lt;/p&gt;

&lt;p&gt;Built for Core Web Vitals from the start — no retrofitting performance later&lt;br&gt;
Structured content around destination-specific pages (US, UK, Canada, Australia, Schengen) rather than one generic services page, for clearer topical relevance per query&lt;br&gt;
Clean semantic markup throughout&lt;br&gt;
WhatsApp-first contact flow instead of a traditional form (matches actual user behavior for this market)&lt;/p&gt;

&lt;p&gt;Lighthouse scores at launch:&lt;/p&gt;

&lt;p&gt;Performance: 95&lt;br&gt;
Accessibility: 97&lt;br&gt;
Best Practices: 100&lt;br&gt;
SEO: 100&lt;/p&gt;

&lt;p&gt;Real Search Console data, first 4-5 weeks post-launch:&lt;/p&gt;

&lt;p&gt;45 clicks / 80 impressions over 28 days&lt;br&gt;
56.3% CTR (high, but expected — see caveat below)&lt;br&gt;
Fully indexed within the first month&lt;/p&gt;

&lt;p&gt;Honest caveat worth sharing: the current traffic is almost entirely branded search (people searching the business name directly), which inflates CTR since branded queries convert at a much higher rate than generic ones. The real test is ranking for non-branded, generic service queries — that's the next phase, and where the harder SEO work actually happens.&lt;/p&gt;

&lt;p&gt;Happy to go deeper into any part of the technical setup if useful — schema markup, the redirect/canonical cleanup we did, or the destination-page structure specifically.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>seo</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
