<?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: Derin Karakoç</title>
    <description>The latest articles on DEV Community by Derin Karakoç (@kahveciderin).</description>
    <link>https://dev.to/kahveciderin</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%2F4102183%2Fe3a97dbf-bf28-4fea-981f-a5de086b40fb.png</url>
      <title>DEV Community: Derin Karakoç</title>
      <link>https://dev.to/kahveciderin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kahveciderin"/>
    <language>en</language>
    <item>
      <title>The six problems between a chat demo and a multi-tenant agent</title>
      <dc:creator>Derin Karakoç</dc:creator>
      <pubDate>Mon, 31 Aug 2026 06:18:50 +0000</pubDate>
      <link>https://dev.to/kahveciderin/the-six-problems-between-a-chat-demo-and-a-multi-tenant-agent-1aoe</link>
      <guid>https://dev.to/kahveciderin/the-six-problems-between-a-chat-demo-and-a-multi-tenant-agent-1aoe</guid>
      <description>&lt;p&gt;A chat demo is a weekend. Putting that demo in front of paying customers is usually a quarter, because the model was never the hard part.&lt;/p&gt;

&lt;p&gt;I kept hitting the same six problems while wiring agents into other people's SaaS products. Isolation, citations, permissions, a real computer, work that outlives the request, and a cost number you can actually bill back. Each one is "just engineering" until it isn't.&lt;/p&gt;

&lt;p&gt;This is the shape that held.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Keeping customers apart
&lt;/h2&gt;

&lt;p&gt;If tenant id comes from the request body, someone will change it. If it lives in a metadata filter on a shared vector index, one forgotten &lt;code&gt;filter=&lt;/code&gt; leaks another customer's neighbors. Namespaces help. They still don't cover the cache, the logs, or the write path.&lt;/p&gt;

&lt;p&gt;The boundary has to be in the data plane: a project is a tenant, the API takes the tenant from a short-lived token, never from the body. A missing filter should fail closed, not fan out.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Grounding the answer
&lt;/h2&gt;

&lt;p&gt;"Here are some chunks" is not a citation. Founders of document-heavy products need document, page, and quote, or they need the model to refuse. Layout-aware parsing matters; OCR only on the pages that need it matters; a reindex when you swap embedding models matters.&lt;/p&gt;

&lt;p&gt;If you cannot point at the clause, do not ship the sentence.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Deciding who may do what
&lt;/h2&gt;

&lt;p&gt;Tool calling makes prompt-injection load-bearing. A permission system the model can talk its way past is not a permission system. Capabilities belong on the token, intersected with a project ceiling, checked again per request. A tool the model decides to call without the capability is refused before it runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Letting it do real work
&lt;/h2&gt;

&lt;p&gt;Answers are half the product. The other half is: clean this CSV, chart it, hand me a PNG. That means a Linux sandbox per conversation, files in and out, no network unless you allow it, idle sleep, and an audit trail. Rolling your own is a graveyard of leftover containers.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Outliving the request
&lt;/h2&gt;

&lt;p&gt;"Every Monday, summarise new filings" dies the first time you deploy on a Sunday. You want durable one-shot and cron, DST-safe, signed webhooks, retries, dead letters. The schedule is part of the agent, not a sidecar you forget.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Knowing what it cost
&lt;/h2&gt;

&lt;p&gt;Provider invoices arrive a month late and they are not per customer. If you cannot slice spend, latency, and traces per project and per end-user as the calls happen, you cannot bill it back and you cannot cap it.&lt;/p&gt;

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

&lt;p&gt;I got tired of rebuilding those six, so they are the product. &lt;a href="https://oberik.com" rel="noopener noreferrer"&gt;Oberik&lt;/a&gt; is the agent layer you drop into a SaaS: mint a capability-scoped JWT from your backend, stream the answer into your own UI. Your models, your keys, your product. Free while we launch.&lt;/p&gt;

&lt;p&gt;Docs need no signup: &lt;a href="https://oberik.com/docs" rel="noopener noreferrer"&gt;https://oberik.com/docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are mid-LangChain on a multi-tenant app, I would rather you try this than spend the quarter on Pinecone namespaces. Roast the landing page if it is wrong for you.&lt;/p&gt;

</description>
      <category>saas</category>
      <category>ai</category>
      <category>rag</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
