<?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>Forem: Samuel Kyeremeh</title>
    <description>The latest articles on Forem by Samuel Kyeremeh (@kyeremehs).</description>
    <link>https://forem.com/kyeremehs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3822610%2F79dd1103-5a09-4fc2-8bf0-f73f497dc2cf.jpeg</url>
      <title>Forem: Samuel Kyeremeh</title>
      <link>https://forem.com/kyeremehs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/kyeremehs"/>
    <language>en</language>
    <item>
      <title>Turning an Existing Express API into a Conversational Backend (Konsier Integration)</title>
      <dc:creator>Samuel Kyeremeh</dc:creator>
      <pubDate>Fri, 10 Apr 2026 17:14:06 +0000</pubDate>
      <link>https://forem.com/kyeremehs/turning-an-existing-express-api-into-a-conversational-backend-konsier-integration-575c</link>
      <guid>https://forem.com/kyeremehs/turning-an-existing-express-api-into-a-conversational-backend-konsier-integration-575c</guid>
      <description>&lt;p&gt;In Part 2, I broke down the architecture behind conversational systems:&lt;/p&gt;

&lt;p&gt;Agents → Tools → Backend → Channels&lt;/p&gt;

&lt;p&gt;Now let’s make it real.&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk through how I integrated this model into an &lt;strong&gt;existing Express API&lt;/strong&gt; using Konsier.&lt;/p&gt;

&lt;p&gt;No rewrite.&lt;br&gt;
No new backend.&lt;/p&gt;

&lt;p&gt;Just layering a conversational interface on top of what already exists.&lt;/p&gt;


&lt;h2&gt;
  
  
  Starting Point
&lt;/h2&gt;

&lt;p&gt;I already had a simple Express + PostgreSQL backend.&lt;/p&gt;

&lt;p&gt;It exposed endpoints like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /menu
POST /orders
GET /orders/:id
PATCH /orders/:id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Typical setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client → Express API → Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Allow users to interact with this backend through chat (Telegram, WhatsApp, etc.)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;without rewriting the API.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Changes (and What Doesn’t)
&lt;/h2&gt;

&lt;p&gt;The important thing to understand:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your backend stays the same.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You’re not replacing your API.&lt;/p&gt;

&lt;p&gt;You’re adding a new layer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User (chat)
     ↓
Konsier
     ↓
Express API
     ↓
Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 1 — Install Konsier
&lt;/h2&gt;



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

&lt;/div&gt;



&lt;p&gt;If you're using Express:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2 — Define Your First Tool
&lt;/h2&gt;

&lt;p&gt;Tools are how your agent interacts with your backend.&lt;/p&gt;

&lt;p&gt;Start with something simple like fetching the menu.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```ts id="tool1"&lt;br&gt;
import { Konsier } from "konsier";&lt;br&gt;
import { z } from "zod";&lt;/p&gt;

&lt;p&gt;const getMenu = Konsier.tool({&lt;br&gt;
  name: "get_menu",&lt;br&gt;
  description: "Returns all menu items",&lt;/p&gt;

&lt;p&gt;input: z.object({&lt;br&gt;
    category: z.string().optional(),&lt;br&gt;
  }),&lt;/p&gt;

&lt;p&gt;handler: async (input) =&amp;gt; {&lt;br&gt;
    const items = await db.query("SELECT * FROM menu_items");&lt;br&gt;
    return { items: items.rows };&lt;br&gt;
  },&lt;br&gt;
});&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


This is just a wrapper around your existing logic.

---

## Step 3 — Configure the Agent

Now define an agent that can use this tool.



```ts id="agent1"
const konsier = new Konsier({
  apiKey: process.env.KONSIER_API_KEY!,

  endpointUrl: "https://your-public-url.com/konsier",

  agents: {
    customer_support: {
      name: "Customer Support",
      description: "Helps users browse the menu",

      systemPrompt: "You help users find food and place orders.",

      tools: [getMenu],
    },
  },
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The agent decides when to call &lt;code&gt;get_menu&lt;/code&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 4 — Mount the Webhook
&lt;/h2&gt;

&lt;p&gt;This is the connection point between Konsier and your backend.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```ts id="webhook1"&lt;br&gt;
import express from "express";&lt;br&gt;
import { serveKonsier } from "konsier/express";&lt;/p&gt;

&lt;p&gt;const app = express();&lt;/p&gt;

&lt;p&gt;serveKonsier(app, konsier);&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


This automatically:

* creates the webhook route
* validates requests
* routes messages to your agent

---

## Step 5 — Sync Your Configuration

Start your server and sync:



```ts id="sync1"
app.listen(3000, async () =&amp;gt; {
  await konsier.sync();
  console.log("Server running");
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This pushes your local agent + tools config to Konsier Cloud.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 6 — Connect a Channel
&lt;/h2&gt;

&lt;p&gt;In the Konsier dashboard:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a project&lt;/li&gt;
&lt;li&gt;Add your API key&lt;/li&gt;
&lt;li&gt;Set your public &lt;code&gt;/konsier&lt;/code&gt; endpoint&lt;/li&gt;
&lt;li&gt;Link your agent&lt;/li&gt;
&lt;li&gt;Connect a channel (Telegram, Slack, etc.)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now send a message like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What food do you have?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Your agent will automatically call &lt;code&gt;get_menu&lt;/code&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  End-to-End Flow
&lt;/h2&gt;

&lt;p&gt;Here’s what happens when a user sends a message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User → Telegram
        ↓
     Konsier
        ↓
   /konsier webhook
        ↓
     Agent
        ↓
     Tool (get_menu)
        ↓
     Database
        ↓
     Response → User
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Key Takeaway
&lt;/h2&gt;

&lt;p&gt;You didn’t rebuild your backend.&lt;/p&gt;

&lt;p&gt;You didn’t duplicate logic.&lt;/p&gt;

&lt;p&gt;You simply exposed your existing functionality as &lt;strong&gt;tools&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That’s the power of this approach.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s Next
&lt;/h2&gt;

&lt;p&gt;So far we’ve only used a simple read operation (&lt;code&gt;get_menu&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;But real systems need more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;creating orders&lt;/li&gt;
&lt;li&gt;updating orders&lt;/li&gt;
&lt;li&gt;tracking status&lt;/li&gt;
&lt;li&gt;handling edge cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In &lt;strong&gt;Part 4&lt;/strong&gt;, we’ll go deeper into &lt;strong&gt;tool design&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how to structure tools properly&lt;/li&gt;
&lt;li&gt;how to validate inputs&lt;/li&gt;
&lt;li&gt;how to avoid breaking your backend&lt;/li&gt;
&lt;li&gt;and how to handle real business logic&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you're already running an Express backend, you're closer than you think to having a conversational interface.&lt;/p&gt;

&lt;p&gt;In the next post, we’ll build real tools on top of it.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>ai</category>
      <category>agents</category>
      <category>node</category>
    </item>
    <item>
      <title>How AI Agents Actually Connect to Real Backends (Agents, Tools, Channels Explained)</title>
      <dc:creator>Samuel Kyeremeh</dc:creator>
      <pubDate>Tue, 17 Mar 2026 16:16:01 +0000</pubDate>
      <link>https://forem.com/kyeremehs/how-ai-agents-actually-connect-to-real-backends-agents-tools-channels-explained-3aj3</link>
      <guid>https://forem.com/kyeremehs/how-ai-agents-actually-connect-to-real-backends-agents-tools-channels-explained-3aj3</guid>
      <description>&lt;p&gt;In Part 1, I talked about why building conversational apps is still messy.&lt;/p&gt;

&lt;p&gt;Now let’s get into the part that actually matters:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do these systems really work under the hood?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If a user sends:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I want 2 fried rice”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;How does that message turn into a real backend action?&lt;/p&gt;

&lt;p&gt;Not just a response — but something like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;creating an order&lt;/li&gt;
&lt;li&gt;updating a database&lt;/li&gt;
&lt;li&gt;returning a real result&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To understand that, we need to look at the core building blocks behind modern conversational systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Idea
&lt;/h2&gt;

&lt;p&gt;At a high level, the architecture looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User (Telegram / Slack / WhatsApp)
            ↓
         Agent
            ↓
          Tool
            ↓
        Backend API
            ↓
         Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each piece has a very specific role.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Agent — The Brain
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;agent&lt;/strong&gt; is the AI layer that understands user messages and decides what to do.&lt;/p&gt;

&lt;p&gt;It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reads the user’s message&lt;/li&gt;
&lt;li&gt;interprets intent&lt;/li&gt;
&lt;li&gt;decides whether to respond directly or call a tool&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can think of it as the &lt;strong&gt;decision-maker&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But here’s the important part:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The agent should &lt;strong&gt;not contain your business logic&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It shouldn’t calculate totals, write database queries, or enforce rules.&lt;/p&gt;

&lt;p&gt;That belongs in your backend.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Tool — The Bridge to Your Backend
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;tool&lt;/strong&gt; is just a function your agent can call.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;get_menu&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;create_order&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;track_order&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of the agent guessing or hallucinating results, it calls a tool like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;create_order({
  items: [...]
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That tool then runs real backend logic.&lt;/p&gt;

&lt;p&gt;This is the most important concept:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tools are the &lt;strong&gt;only safe way&lt;/strong&gt; for agents to interact with real systems.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;validate input&lt;/li&gt;
&lt;li&gt;execute real logic&lt;/li&gt;
&lt;li&gt;return structured results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No guessing. No hallucination.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Backend — The Source of Truth
&lt;/h2&gt;

&lt;p&gt;Your backend still does everything it normally does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;database queries&lt;/li&gt;
&lt;li&gt;validation&lt;/li&gt;
&lt;li&gt;business rules&lt;/li&gt;
&lt;li&gt;calculations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing changes here.&lt;/p&gt;

&lt;p&gt;The agent doesn’t replace your backend.&lt;/p&gt;

&lt;p&gt;It just &lt;strong&gt;sits on top of it&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Channels — Where Users Come From
&lt;/h2&gt;

&lt;p&gt;Users don’t talk to your backend directly.&lt;/p&gt;

&lt;p&gt;They come from platforms like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Telegram&lt;/li&gt;
&lt;li&gt;Slack&lt;/li&gt;
&lt;li&gt;WhatsApp&lt;/li&gt;
&lt;li&gt;Discord&lt;/li&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;li&gt;SMS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these platforms has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;different APIs&lt;/li&gt;
&lt;li&gt;different message formats&lt;/li&gt;
&lt;li&gt;different authentication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where things usually get messy.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The Missing Piece: Routing
&lt;/h2&gt;

&lt;p&gt;So how does everything connect?&lt;/p&gt;

&lt;p&gt;That’s where the &lt;strong&gt;webhook layer&lt;/strong&gt; comes in.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User → Channel → Webhook → Agent → Tool → Backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a user sends a message:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The channel sends it to your webhook&lt;/li&gt;
&lt;li&gt;The agent processes it&lt;/li&gt;
&lt;li&gt;The agent decides to call a tool&lt;/li&gt;
&lt;li&gt;The tool runs backend logic&lt;/li&gt;
&lt;li&gt;A response is sent back to the user&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Where Konsier Fits In
&lt;/h2&gt;

&lt;p&gt;Instead of building all of this yourself, Konsier provides a structured way to handle it.&lt;/p&gt;

&lt;p&gt;It gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a way to define &lt;strong&gt;agents&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;a way to define &lt;strong&gt;tools&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;a unified &lt;strong&gt;webhook layer&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;built-in support for &lt;strong&gt;multiple channels&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So instead of wiring everything manually, you focus on:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;defining what your system can do&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and Konsier handles the rest.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Model Works
&lt;/h2&gt;

&lt;p&gt;This approach solves a major problem:&lt;/p&gt;

&lt;p&gt;It separates &lt;strong&gt;AI reasoning&lt;/strong&gt; from &lt;strong&gt;business logic&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The agent decides &lt;em&gt;what to do&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;The backend decides &lt;em&gt;how it’s done&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That separation makes the system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;more reliable&lt;/li&gt;
&lt;li&gt;easier to debug&lt;/li&gt;
&lt;li&gt;easier to scale&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  A Simple Mental Model
&lt;/h2&gt;

&lt;p&gt;If you remember nothing else, remember this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agent = decision maker&lt;/li&gt;
&lt;li&gt;Tool = controlled execution&lt;/li&gt;
&lt;li&gt;Backend = source of truth&lt;/li&gt;
&lt;li&gt;Channel = entry point&lt;/li&gt;
&lt;li&gt;Webhook = connection layer&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What’s Next
&lt;/h2&gt;

&lt;p&gt;Now that the architecture is clear, the next question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do you actually plug this into an existing backend?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In &lt;strong&gt;Part 3&lt;/strong&gt;, I’ll walk through how I integrated this model into an existing Express + PostgreSQL API using Konsier.&lt;/p&gt;

&lt;p&gt;We’ll go from theory to actual code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;setting up the SDK&lt;/li&gt;
&lt;li&gt;defining tools&lt;/li&gt;
&lt;li&gt;mounting the webhook&lt;/li&gt;
&lt;li&gt;syncing configuration&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you're building conversational systems, understanding this pattern will save you a lot of time.&lt;/p&gt;

&lt;p&gt;In the next post, we’ll make it real.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why Building AI Chat Apps Is Still Hard in 2026</title>
      <dc:creator>Samuel Kyeremeh</dc:creator>
      <pubDate>Fri, 13 Mar 2026 17:58:02 +0000</pubDate>
      <link>https://forem.com/kyeremehs/why-building-ai-chat-apps-is-still-hard-in-2026-2918</link>
      <guid>https://forem.com/kyeremehs/why-building-ai-chat-apps-is-still-hard-in-2026-2918</guid>
      <description>&lt;blockquote&gt;
&lt;h1&gt;
  
  
  Why Building AI Chat Apps Is Still Hard in 2026
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;A few months ago I tried building what sounded like a simple feature.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Let users place orders through chat.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nothing fancy. Just a conversational interface that could talk to a backend and perform actions.&lt;/p&gt;

&lt;p&gt;In my head, it felt like something that could take a weekend.&lt;/p&gt;

&lt;p&gt;In reality, it quickly turned into a pile of moving parts.&lt;/p&gt;

&lt;p&gt;LLM APIs.&lt;br&gt;
Prompt tuning.&lt;br&gt;
Conversation state.&lt;br&gt;
API integrations.&lt;br&gt;
Safety checks so the AI doesn’t hallucinate things like a &lt;strong&gt;100% discount&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What looked like a small feature started feeling like I was assembling a mini distributed system.&lt;/p&gt;

&lt;p&gt;And that’s when I realized something:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conversational interfaces look simple, but building them is still messy.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Illusion of a “Simple Chat Interface”
&lt;/h2&gt;

&lt;p&gt;From the user’s perspective, chat feels incredibly simple.&lt;/p&gt;

&lt;p&gt;They send a message.&lt;br&gt;
The system replies.&lt;br&gt;
Something gets done.&lt;/p&gt;

&lt;p&gt;But behind that simple interaction, developers usually end up stitching together several different systems.&lt;/p&gt;

&lt;p&gt;A typical conversational stack often includes things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;LLM APIs&lt;/strong&gt;&lt;br&gt;
constantly switching models, providers, and pricing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prompt engineering&lt;/strong&gt;&lt;br&gt;
the strange craft of convincing a machine to behave consistently.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;API integrations&lt;/strong&gt;&lt;br&gt;
teaching the AI how to actually perform useful actions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Conversation state&lt;/strong&gt;&lt;br&gt;
making sure the bot remembers context between messages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Business logic&lt;/strong&gt;&lt;br&gt;
preventing the AI from inventing features or hallucinating results.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these pieces is manageable on its own.&lt;/p&gt;

&lt;p&gt;But when you combine them, the system becomes surprisingly fragile.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Problem: Too Many Responsibilities
&lt;/h2&gt;

&lt;p&gt;When building conversational systems today, developers often end up responsible for far more than just backend logic.&lt;/p&gt;

&lt;p&gt;You suddenly find yourself building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a conversation orchestration layer&lt;/li&gt;
&lt;li&gt;a tool execution system&lt;/li&gt;
&lt;li&gt;integrations with messaging platforms&lt;/li&gt;
&lt;li&gt;state management for conversations&lt;/li&gt;
&lt;li&gt;guardrails around AI behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And then there’s &lt;strong&gt;distribution&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you want your assistant to work across platforms like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Telegram&lt;/li&gt;
&lt;li&gt;Slack&lt;/li&gt;
&lt;li&gt;WhatsApp&lt;/li&gt;
&lt;li&gt;Discord&lt;/li&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;li&gt;SMS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;you usually have to build &lt;strong&gt;separate integrations for each one&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Different webhooks.&lt;br&gt;
Different payload formats.&lt;br&gt;
Different authentication models.&lt;/p&gt;

&lt;p&gt;The same logic ends up being repeated again and again.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Developers Actually Want
&lt;/h2&gt;

&lt;p&gt;Most developers don’t want to reinvent messaging infrastructure.&lt;/p&gt;

&lt;p&gt;They just want something simpler:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define &lt;strong&gt;what the AI can do&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Connect it to &lt;strong&gt;real backend actions&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Expose it across &lt;strong&gt;multiple channels&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;without rewriting everything for each platform.&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;p&gt;Focus on the &lt;strong&gt;business logic&lt;/strong&gt;, not the plumbing.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Different Approach
&lt;/h2&gt;

&lt;p&gt;Recently, while experimenting with conversational interfaces, I came across an SDK called &lt;strong&gt;Konsier&lt;/strong&gt; that tries to simplify this problem.&lt;/p&gt;

&lt;p&gt;Instead of building separate bots or integrations for every messaging platform, the idea is to define your agents and capabilities once in code, while the SDK handles messaging channels and conversation infrastructure.&lt;/p&gt;

&lt;p&gt;Your backend stays the &lt;strong&gt;source of truth&lt;/strong&gt;, while the conversational layer becomes a thin interface on top.&lt;/p&gt;

&lt;p&gt;The mental model was interesting enough that I decided to explore it further.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Series Will Cover
&lt;/h2&gt;

&lt;p&gt;Over the next few posts, I’ll walk through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the architecture behind conversational agents&lt;/li&gt;
&lt;li&gt;how agents call backend tools safely&lt;/li&gt;
&lt;li&gt;how messaging platforms connect to the system&lt;/li&gt;
&lt;li&gt;how to integrate this into an existing Express backend&lt;/li&gt;
&lt;li&gt;real bugs and production issues I ran into&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn’t to promote a tool.&lt;/p&gt;

&lt;p&gt;It’s to explore &lt;strong&gt;a practical pattern for building conversational backends&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Next in the Series
&lt;/h2&gt;

&lt;p&gt;In &lt;strong&gt;Part 2&lt;/strong&gt;, I’ll break down the core primitives behind this approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;agents&lt;/li&gt;
&lt;li&gt;tools&lt;/li&gt;
&lt;li&gt;channels&lt;/li&gt;
&lt;li&gt;webhooks&lt;/li&gt;
&lt;li&gt;configuration sync&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and how these pieces fit together to make conversational systems easier to build.&lt;/p&gt;




&lt;p&gt;If you’re building chat interfaces in 2026, follow this series.&lt;/p&gt;

&lt;p&gt;Next, we’ll dive into &lt;strong&gt;how agents call backend tools reliably without turning your backend into chaos&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Series
&lt;/h3&gt;

&lt;p&gt;Part 1 — Why conversational apps are still hard&lt;br&gt;
Part 2 — The architecture behind agents, tools, and channels&lt;br&gt;
Part 3 — Integrating Konsier into an existing Express backend&lt;br&gt;
Part 4 — Designing tools for real business logic&lt;br&gt;
Part 5 — Production bugs and lessons learned&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>backend</category>
      <category>node</category>
    </item>
  </channel>
</rss>
