<?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: Ayodeji Akinsunmade</title>
    <description>The latest articles on DEV Community by Ayodeji Akinsunmade (@ayodeji-sunmade).</description>
    <link>https://dev.to/ayodeji-sunmade</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%2F2629744%2F16b7e703-6408-49b7-a690-d71a57b74293.png</url>
      <title>DEV Community: Ayodeji Akinsunmade</title>
      <link>https://dev.to/ayodeji-sunmade</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ayodeji-sunmade"/>
    <language>en</language>
    <item>
      <title>REZ - agentic customer service for businesses</title>
      <dc:creator>Ayodeji Akinsunmade</dc:creator>
      <pubDate>Sun, 04 Oct 2026 21:45:45 +0000</pubDate>
      <link>https://dev.to/ayodeji-sunmade/rez-agentic-customer-service-for-businesses-4mh0</link>
      <guid>https://dev.to/ayodeji-sunmade/rez-agentic-customer-service-for-businesses-4mh0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path One: Ship an Agent That Queries Real Content&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

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

&lt;p&gt;I built REZ, a customer support agent for businesses.&lt;/p&gt;

&lt;p&gt;If you sell anything online, you know the drill. The same questions hit your inbox every day. Where's my order? Can I return this? Do you ship to Canada? So you either answer them yourself or pay someone to sit in the inbox all day. The annoying part is that the answers are already on your website.&lt;/p&gt;

&lt;p&gt;So I built an agent that reads the website for you and manages the information in a structured knoeledge base powered by sanity.&lt;/p&gt;

&lt;p&gt;You paste your website link. REZ reads your pages and learns your products, prices and policies. Then it gives you one line of code to add to your site. From there, a chat bubble answers your customers day and night, and every answer shows the page it came from.&lt;/p&gt;

&lt;p&gt;When REZ doesn't know something, it doesn't make it up. Refunds, complaints, anything it isn't sure about, it takes the customer's details and emails your team the whole conversation.&lt;/p&gt;

&lt;p&gt;For a business, that means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fewer repetitive emails, so your team spends its time on problems that actually need a person&lt;/li&gt;
&lt;li&gt;Customers get answers at 3am instead of waiting until Monday&lt;/li&gt;
&lt;li&gt;You can read and edit every answer REZ gives&lt;/li&gt;
&lt;li&gt;No made-up answers. If it's not on your site, REZ says so and hands it to you&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://rezagent.vercel.app" rel="noopener noreferrer"&gt;https://rezagent.vercel.app&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Video walkthrough:&lt;/strong&gt; &lt;a href="https://youtu.be/YxmWvRggwbk" rel="noopener noreferrer"&gt;youtube link&lt;/a&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Temitope15" rel="noopener noreferrer"&gt;
        Temitope15
      &lt;/a&gt; / &lt;a href="https://github.com/Temitope15/REZ" rel="noopener noreferrer"&gt;
        REZ
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      REZ learns your business and answers your customers for you, day and night. Anything it can’t handle comes straight to you.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;REZ&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;REZ is a customer-support agent a business installs with one script tag. Give it a website URL and it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reads&lt;/strong&gt; the site with its own crawler (sitemap + links, respects robots.txt). Pages that arrive as an empty JavaScript shell are rendered in headless Chrome, so React/Vue/Angular sites work too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extracts&lt;/strong&gt; small, single-topic answers with Gemini into structured Sanity documents. Every answer keeps its source URL. When two pages disagree, the answer is flagged for the business to review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Builds&lt;/strong&gt; a Sanity Context Knowledge Base from those documents (dataset source) and serves it to the agent through the Context MCP endpoint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Answers&lt;/strong&gt; customers in an embeddable widget, cites its source, and refuses to guess.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalates&lt;/strong&gt; anything it can't resolve: a ticket document in Sanity plus an email to the business (SMTP) with the transcript and a drafted reply.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reports&lt;/strong&gt;: every conversation, including tool calls, is saved to Sanity Context…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Temitope15/REZ" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Used Sanity
&lt;/h2&gt;

&lt;p&gt;When REZ reads a website, it doesn't just dump the pages somewhere. It breaks them into small answers, one topic each, and saves every answer as a document in Sanity with the page it came from. Fifteen pages of the Death Wish Coffee site turned into 41 answers like "Can I return coffee?" and "Do you ship to Canada?". If two pages disagree, the answer gets flagged so the owner can fix it.&lt;/p&gt;

&lt;p&gt;I then point Sanity Context at those answers. Each business gets its own Knowledge Base built from a simple GROQ query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*[_type == "knowledgeArticle" &amp;amp;&amp;amp; business._ref == $businessId &amp;amp;&amp;amp; enabled != false]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the part I like most. Because the Knowledge Base is built from my documents and not the raw website, the owner stays in control. They edit an answer in the dashboard, click "Push edits", and the agent knows the new answer. They turn an answer off, and the agent stops using it. Sanity also sorted the 41 answers into topics on its own, like returns, shipping and subscriptions.&lt;/p&gt;

&lt;p&gt;When a customer asks a question, the agent uses the Context MCP tools. It calls &lt;code&gt;initial_context&lt;/code&gt; to see what the Knowledge Base covers, &lt;code&gt;knowledge_base_search&lt;/code&gt; to find the right topic, and &lt;code&gt;knowledge_base_read&lt;/code&gt; to read the full answer. Then it replies in a few sentences and names its source. I added one tool of my own, &lt;code&gt;escalate_to_human&lt;/code&gt;, for when the answer isn't there.&lt;/p&gt;

&lt;p&gt;Everything happens from code with &lt;code&gt;@sanity/client&lt;/code&gt;, so a business signs up through a form and gets a working Knowledge Base without me touching anything. Every conversation is also saved to Sanity Insights, so the owner can see which questions REZ struggled with and what to add next.&lt;/p&gt;

&lt;p&gt;A plain keyword search would answer "can I return coffee?" with a whole help page. REZ answers with the one rule that applies, including the catch that coffee can't be returned, and tells you where it found it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's not there yet:&lt;/strong&gt; the free plan allows two Knowledge Bases, so extra businesses fall back to a simpler search. When the team replies to an escalation, the reply goes by email, not back into the chat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sanity Project Details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Project ID:&lt;/strong&gt; &lt;code&gt;wtwf6oam&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dataset:&lt;/strong&gt; &lt;code&gt;production&lt;/code&gt; (public). &lt;a href="https://wtwf6oam.api.sanity.io/v2026-09-01/data/query/production?query=*%5B_type%3D%3D%22knowledgeArticle%22%5D%5B0...10%5D%7Btitle%2Ckind%2Cquestion%2Csummary%2CsourceUrls%7D" rel="noopener noreferrer"&gt;Browse the articles&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge Base:&lt;/strong&gt; Death Wish Coffee support (&lt;code&gt;kb9xFlYaxFwv&lt;/code&gt;), dataset source over &lt;code&gt;knowledgeArticle&lt;/code&gt; documents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context MCP endpoint:&lt;/strong&gt; &lt;code&gt;rez&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document types:&lt;/strong&gt; &lt;code&gt;business&lt;/code&gt;, &lt;code&gt;sourcePage&lt;/code&gt;, &lt;code&gt;knowledgeArticle&lt;/code&gt;, &lt;code&gt;ticket&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
