<?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: Abhishek Kundagol</title>
    <description>The latest articles on DEV Community by Abhishek Kundagol (@chillpill_ak).</description>
    <link>https://dev.to/chillpill_ak</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%2F4020566%2Fb7d6436e-2b3d-4658-b562-7485cbf8072f.jpg</url>
      <title>DEV Community: Abhishek Kundagol</title>
      <link>https://dev.to/chillpill_ak</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chillpill_ak"/>
    <language>en</language>
    <item>
      <title>Beyond LLM JSON mode: decisions your code can branch on</title>
      <dc:creator>Abhishek Kundagol</dc:creator>
      <pubDate>Wed, 21 Oct 2026 13:46:24 +0000</pubDate>
      <link>https://dev.to/chillpill_ak/beyond-llm-json-mode-decisions-your-code-can-branch-on-1pde</link>
      <guid>https://dev.to/chillpill_ak/beyond-llm-json-mode-decisions-your-code-can-branch-on-1pde</guid>
      <description>&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%2Fdl234ho6183n2merkfcq.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%2Fdl234ho6183n2merkfcq.png" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your support pipeline asks a model which queue a ticket belongs to. It comes back with three sentences: "This appears to be a billing issue, as the customer mentions being charged twice. It could also relate to their account. Billing seems like the best fit." Now your code has to find the queue in that paragraph. So you reach for LLM JSON mode, and the paragraph turns into &lt;code&gt;{"queue": "billing"}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That is better. It is still not a decision your code can trust, and this post explains why, and what a typed decision looks like instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with deciding in prose
&lt;/h2&gt;

&lt;p&gt;When software gets its decisions back as text, three things go wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can't see how sure it is.&lt;/strong&gt; "Billing seems like the best fit" reads the same whether the model was certain or guessing. A ticket that is clearly about a double charge and one that could be billing or account access look identical by the time they reach your &lt;code&gt;if&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The words come first.&lt;/strong&gt; When a model writes its explanation before it settles the answer, the answer tends to follow the text it already wrote, not the other way round.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parsing is a guess.&lt;/strong&gt; Your regex works until the model says "Billing" with a capital B, or "the billing team", or adds a second suggestion at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  What LLM JSON mode fixes, and what it doesn't
&lt;/h2&gt;

&lt;p&gt;Structured outputs and JSON mode fix the last problem. The format is constrained, so the response parses and the field is where you expect it.&lt;/p&gt;

&lt;p&gt;They don't fix the first two. The model is still writing text underneath, token by token, with no sense of how sure it is. The queue inside your JSON is a token in a string. &lt;code&gt;{"queue": "billing"}&lt;/code&gt; carries no number that tells you whether to act on it or send it to a person.&lt;/p&gt;

&lt;p&gt;That missing number is the part that matters in production. Routing a ticket wrongly is cheap to undo. Issuing a refund wrongly is not. Without a probability, both get the same treatment.&lt;/p&gt;

&lt;h2&gt;
  
  
  A typed decision instead
&lt;/h2&gt;

&lt;p&gt;A typed decision is an answer your code can branch on directly: one of the options you defined, with a probability for every option. Here is the first request from the Wity quickstart, in Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.wity.alphanimble.com/v1/systemone&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;WITY_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;state&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hi, I was charged twice for my subscription this month. Please refund the duplicate.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;questions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;intent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;choice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;instructions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What does the customer want?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;criteria&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;billing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A charge, refund, invoice or payment problem&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;technical_support&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Something in the product is broken&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;account_access&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cannot log in or is locked out&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cancellation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Wants to cancel or downgrade&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reasoning&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auto&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;intent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;answers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;intent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;choice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;probabilities&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;choice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;  &lt;span class="c1"&gt;# billing 0.99
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You send the state (the thing to decide about) and the question, with the options spelled out. Nothing asks the model to "answer in JSON", because the answer was never text. This is what comes back:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wity-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"answers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"intent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"choice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"choice"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"billing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"probabilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"billing"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9912&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"technical_support"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0031&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"account_access"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0019&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"cancellation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0038&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.93&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"reasoning"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"thought"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"forecast"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"thought_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"input_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;212&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"output_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"reasoning"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"elapsed_ms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;94.1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Reading the answer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;choice&lt;/code&gt; is the option to act on. It can only be one of the keys you put in &lt;code&gt;criteria&lt;/code&gt;, so there is nothing to normalise.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;probabilities&lt;/code&gt; covers every option you offered and sums to 1. You can read any of them, not only the winner.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;confidence&lt;/code&gt; says how peaked the distribution is. The docs are clear that it describes the shape of the answer, not the chance of being right: use &lt;code&gt;probabilities&lt;/code&gt; for anything that acts, and &lt;code&gt;confidence&lt;/code&gt; for sorting a review queue.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;reasoning.thought&lt;/code&gt; is &lt;code&gt;false&lt;/code&gt; here. The question was clear, so Wity answered in one fast pass. On a close call it thinks first, and the answer comes back in the same shape.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full distribution is where the value is. A single label tells you what was picked. The probabilities tell you how the evidence split, and whether a second option deserves a look.&lt;/p&gt;

&lt;h2&gt;
  
  
  Branching on probabilities
&lt;/h2&gt;

&lt;p&gt;Once the answer is a number, the rule lives in your code, not in a prompt. This is the three-zone pattern from the docs on probabilities, for a question named &lt;code&gt;route&lt;/code&gt; with a &lt;code&gt;refunds_queue&lt;/code&gt; option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;ans&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;answers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;route&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ans&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;probabilities&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;ans&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;choice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ans&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;choice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;refunds_queue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.95&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;issue_refund&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;             &lt;span class="c1"&gt;# cheap to undo: act on your own
&lt;/span&gt;&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;queue_for_one_click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ans&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# a person confirms with one click
&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;send_to_human&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ans&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;         &lt;span class="c1"&gt;# genuinely unsure: full review
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Refunds get a stricter bar because they cost money. Other routes need 0.80 because a wrongly routed ticket is cheap to move. You set the lines from what a mistake costs, and you can move them without touching a prompt.&lt;/p&gt;

&lt;p&gt;No model is perfect, and these numbers are not a promise about any single answer. That's the reason to have them: act on the clear calls and hand the close ones to a person.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where text still belongs
&lt;/h2&gt;

&lt;p&gt;Some actions need words: a city to type into a form, a one-line reply, a field value. For those, Wity's &lt;code&gt;generate&lt;/code&gt; primitive writes short text in a shape you define, from the same state, after the decision is made. Output is capped at 100 tokens. If the answer is one of a set you could list, use &lt;code&gt;choice&lt;/code&gt; instead, because a decision gives you probabilities and generated text doesn't.&lt;/p&gt;

&lt;p&gt;The rule of thumb: decide first, in a type, and write text only for the part of the action that needs it.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://wity.alphanimble.com/docs/quickstart" rel="noopener noreferrer"&gt;quickstart&lt;/a&gt; gets you to your first typed decision in about a minute, and every account starts with $5 of free credit to use within 48 hours of signing up.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>decisionmodel</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>System 1 vs System 2 AI, and the gap between them</title>
      <dc:creator>Abhishek Kundagol</dc:creator>
      <pubDate>Tue, 20 Oct 2026 10:02:07 +0000</pubDate>
      <link>https://dev.to/chillpill_ak/system-1-vs-system-2-ai-and-the-gap-between-them-22cc</link>
      <guid>https://dev.to/chillpill_ak/system-1-vs-system-2-ai-and-the-gap-between-them-22cc</guid>
      <description>&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%2F8yhqmyg57o5g34agsouy.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%2F8yhqmyg57o5g34agsouy.png" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Psychologists describe two modes of thought. System 1 is fast and intuitive. System 2 is slow and deliberate. Most of what we decide in a day is System 1, and we switch to System 2 only when something feels off.&lt;/p&gt;

&lt;p&gt;That split is a useful way to look at the models we put inside software. Ask "system 1 vs system 2 AI" and you get two families, each good at half the job. This post walks through what goes wrong at each extreme, and what a model that sits between them does instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  System 2: models that think through everything
&lt;/h2&gt;

&lt;p&gt;Reasoning models think through every question, even the easy ones, and answer in paragraphs you still have to parse.&lt;/p&gt;

&lt;p&gt;Look at the decisions a real system makes in a day and most of them are easy. The language of a ticket. Whether a page has loaded. Which of five clearly different queues a message belongs to. A direct read gets these right, and thinking about them only adds seconds.&lt;/p&gt;

&lt;p&gt;So a System 2 model costs you twice. You wait for deliberation the question never needed, and then you write code to dig the answer out of prose. On one call that's tolerable. On every event in a pipeline, it decides whether the model can sit inside a request at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  System 1: models that answer at a glance
&lt;/h2&gt;

&lt;p&gt;Fast decision models go the other way. They answer in a single glance. Easy calls are instant. Hard ones come back confidently wrong.&lt;/p&gt;

&lt;p&gt;Take a delivery question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Ordered Friday. Delivery takes 9 days, weekends included." Which day does it arrive?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At a glance, Saturday and Sunday look about equally likely. Getting it right takes counting, and a model that can only glance has no way to slow down. It picks one, fast, and your code has nothing to tell it that this answer was a coin flip.&lt;/p&gt;

&lt;p&gt;That's the System 1 failure: not that it's wrong sometimes (every model is), but that the hard questions get the same treatment as the easy ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap between them
&lt;/h2&gt;

&lt;p&gt;Put the two side by side and the gap is clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;System 2&lt;/strong&gt; is careful on every question, including the many that don't need it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System 1&lt;/strong&gt; is fast on every question, including the few that do need care.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What you want is fast on the easy majority and careful on the close calls, decided per question, with the same kind of answer either way. That's what we mean by System 1.5.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a System 1.5 model does
&lt;/h2&gt;

&lt;p&gt;Wity answers most questions in one fast pass, in about a tenth of a second. When an answer is uncertain or unstable, it thinks first and then answers. Either way you get the same thing back: a typed decision with a probability for every option.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;auto&lt;/code&gt; mode the flow has three steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Direct read.&lt;/strong&gt; Wity answers at once and checks whether that answer is robust: a clear winner that doesn't change when the options are presented differently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Close call?&lt;/strong&gt; Most questions pass, and the answer comes straight back. If not, it thinks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Think, then stop.&lt;/strong&gt; It reasons step by step and stops as soon as the answer has settled, instead of running a fixed long chain of thought.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There are three reasons it will think:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;close_call&lt;/code&gt;: the top options are close. A ticket at 0.51 billing and 0.46 account access deserves a closer look.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;order_sensitive&lt;/code&gt;: the answer changes with the order of the options. A sound answer shouldn't depend on that.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;forecast&lt;/code&gt;: the question asks how likely something is, not which answer is right.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Back to the delivery question. Saturday and Sunday are close, so Wity counts: Friday plus seven is Friday again, then Saturday, then Sunday. It answers Sunday, and is now sure of it.&lt;/p&gt;

&lt;p&gt;Most thoughts finish in a few hundred tokens, and thought answers typically take one to four seconds. The easy questions in the same request still come back at direct-read speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  You can see when it thought
&lt;/h2&gt;

&lt;p&gt;Every answer says whether it thought, and why:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"reasoning"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"thought"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"close_call"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"thought_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;184&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Log that next to each decision. A question that often thinks for &lt;code&gt;close_call&lt;/code&gt; is telling you two of its options overlap. Sharper descriptions, or splitting it in two, make it both faster and more accurate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing the mode
&lt;/h2&gt;

&lt;p&gt;One field sets it for the whole request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"…"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"questions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"reasoning"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auto"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;auto&lt;/code&gt; for almost everything: fast where it can be, careful where it has to be.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;off&lt;/code&gt; for the lowest, most predictable latency, like a step in an interactive UI. Close calls still show up as close probabilities, so your thresholds keep working.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;always&lt;/code&gt; for batch jobs where every decision is expensive to get wrong and nobody is waiting, like overnight review of flagged transactions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The output type is the same in every mode, so switching never changes your code. Thinking isn't billed either, so a thought answer costs the same as a direct one. The only reason to turn it off is time, not money.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this leaves you
&lt;/h2&gt;

&lt;p&gt;No model is perfect, and a 1.5 model doesn't change that. What changes is where the effort goes: none on the questions that don't need it, and some on the ones that do. The probability on every answer still lets your code decide when to act and when to hand a decision to a person.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://wity.alphanimble.com/docs/reasoning" rel="noopener noreferrer"&gt;reasoning docs&lt;/a&gt; cover the modes, the response fields and how to plan around latency.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>api</category>
    </item>
    <item>
      <title>What is Wity? The first System 1.5 model, explained.</title>
      <dc:creator>Abhishek Kundagol</dc:creator>
      <pubDate>Mon, 19 Oct 2026 11:35:46 +0000</pubDate>
      <link>https://dev.to/chillpill_ak/what-is-wity-the-first-system-15-model-explained-55i8</link>
      <guid>https://dev.to/chillpill_ak/what-is-wity-the-first-system-15-model-explained-55i8</guid>
      <description>&lt;p&gt;Software makes thousands of small decisions a day. Which team owns this ticket? Is this scan a receipt or an invoice? Has the page finished loading? Is the customer reporting an accident?&lt;/p&gt;

&lt;p&gt;None of these needs an essay. Each needs an answer your code can act on, and some sense of how sure that answer is. Today those calls usually go to one of two kinds of model, and neither is built for the job. Wity is a System 1.5 model, and it sits between them. This post explains what it is from scratch: the idea, what an answer looks like, and where it fits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two kinds of model, two kinds of problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Large language models think through every question&lt;/strong&gt;, even the easy ones. Then they answer in paragraphs your code has to parse. You pay in seconds and tokens for reasoning that a clear-cut question never needed, and you still have to guess how confident the answer was.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fast decision models answer in a single glance.&lt;/strong&gt; Easy calls come back instantly. Hard ones come back instantly too, and confidently wrong, because the model has no way to slow down.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "System 1.5" means
&lt;/h2&gt;

&lt;p&gt;Psychologists describe two modes of thought. System 1 is fast and intuitive. System 2 is slow and deliberate. Most of what you decide in a day is System 1, and you switch to System 2 only when something feels off.&lt;/p&gt;

&lt;p&gt;Wity works the same way. It answers most questions in one fast pass, in about a tenth of a second. When an answer is uncertain or unstable, it thinks first and then answers. Either way you get the same thing back: &lt;strong&gt;a typed decision with a probability for every option.&lt;/strong&gt; That's why we call it a System 1.5 model. It sits between instinct and deliberation and picks per question.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a decision looks like
&lt;/h2&gt;

&lt;p&gt;You send a &lt;em&gt;state&lt;/em&gt; (the thing to decide about: text, JSON, an image, or all three) and one or more questions with the options spelled out:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.wity.alphanimble.com/v1/systemone &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$WITY_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "state": "Hi, I was charged twice for my subscription this month. Please refund the duplicate.",
    "questions": {
      "intent": {
        "type": "choice",
        "instructions": "What does the customer want?",
        "criteria": {
          "billing": "A charge, refund, invoice or payment problem",
          "technical_support": "Something in the product is broken",
          "account_access": "Cannot log in or is locked out",
          "cancellation": "Wants to cancel or downgrade"
        }
      }
    },
    "reasoning": "auto"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The answer comes back under the name you gave the question:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wity-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"answers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"intent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"choice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"choice"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"billing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"probabilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"billing"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9912&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"technical_support"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0031&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"account_access"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0019&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"cancellation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0038&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.93&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"reasoning"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"thought"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"forecast"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"thought_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"input_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;212&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"output_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"reasoning"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"elapsed_ms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;94.1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There's no prose to parse. &lt;code&gt;choice&lt;/code&gt; is the option to act on, and &lt;code&gt;probabilities&lt;/code&gt; covers every option you offered. &lt;code&gt;reasoning.thought&lt;/code&gt; is &lt;code&gt;false&lt;/code&gt; here because the question was clear, so Wity answered directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four primitives, every answer typed
&lt;/h2&gt;

&lt;p&gt;Every question takes one of four shapes. You pick the shape, Wity fills it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;noul&lt;/strong&gt;: a yes-or-no call. &lt;em&gt;"Was the insured driver at fault?"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;score&lt;/strong&gt;: where on a scale something sits. &lt;em&gt;"How bad is the damage: cosmetic, repairable or total loss?"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;choice&lt;/strong&gt;: one option from a set. &lt;em&gt;"Which team owns this?"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;generate&lt;/strong&gt;: the short text an action needs, in a shape you define. &lt;em&gt;"The policy number from the scan."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because every decision carries its probabilities, your code decides how sure is sure enough:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;intent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;intent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;probabilities&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;choice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.85&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;choice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;       &lt;span class="c1"&gt;# sure enough: act on its own
&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;send_to_triage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                &lt;span class="c1"&gt;# close call: a person decides
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Act on clear calls, hand close ones to a person, and set that line per question.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five things that set it apart
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Multimodal.&lt;/strong&gt; Photos, screenshots and scanned pages go in the same request as your text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;128K-token context.&lt;/strong&gt; A whole contract, a long email thread or a stack of scans fits in one state. No chunking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;generate.&lt;/strong&gt; A primitive for the few places software genuinely needs words, written from the same state, right after the decision.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-thinking.&lt;/strong&gt; Instant on clear-cut questions, deliberate on shaky ones, decided per question.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-prem.&lt;/strong&gt; It can run inside your own network, with the same API as the cloud.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Fast and cheap enough to put everywhere
&lt;/h2&gt;

&lt;p&gt;A decision model earns its place by being cheap enough to call on every event and fast enough to sit inside a request. We ran Wity and eight fast, low-cost models through the same 200 real-world cases. Wity's typical call took &lt;strong&gt;109 ms&lt;/strong&gt;, against 943 ms for the next fastest. 1,000 runs cost &lt;strong&gt;$3.29&lt;/strong&gt;, against $17.95 for the next cheapest. That's our own benchmark, and the method is published alongside it.&lt;/p&gt;

&lt;p&gt;Pricing is one number: &lt;strong&gt;$0.042 per 1M tokens, and failed calls are free.&lt;/strong&gt; Thinking isn't billed, so a thought answer costs the same as a direct one.&lt;/p&gt;

&lt;p&gt;No model is perfect. Use the probability on each decision to choose when to act and when to escalate, and validate generated text like any other input.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;This is the first post in a series where we build up from here, one idea a day: System 1 vs System 2, why decisions shouldn't come back as paragraphs, when a model should think, each primitive in depth, and real builds with code.&lt;/p&gt;

&lt;p&gt;If you want to try it now, the &lt;a href="https://wity.alphanimble.com/docs/quickstart" rel="noopener noreferrer"&gt;quickstart&lt;/a&gt; gets you to your first decision in about a minute. Every account starts with $5 of free credit to use within 48 hours of signing up, and the &lt;a href="https://wity.alphanimble.com/console/playground" rel="noopener noreferrer"&gt;Playground&lt;/a&gt; runs real requests from your browser with no code at all.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machine</category>
      <category>llm</category>
      <category>api</category>
    </item>
    <item>
      <title>The Two Ways AI Memory Breaks</title>
      <dc:creator>Abhishek Kundagol</dc:creator>
      <pubDate>Thu, 20 Aug 2026 07:26:44 +0000</pubDate>
      <link>https://dev.to/chillpill_ak/the-two-ways-ai-memory-breaks-nj4</link>
      <guid>https://dev.to/chillpill_ak/the-two-ways-ai-memory-breaks-nj4</guid>
      <description>&lt;p&gt;The interesting decision our memory system &lt;a href="https://www.memuron.com/" rel="noopener noreferrer"&gt;Memuron&lt;/a&gt; makes isn't "should I keep this."&lt;/p&gt;

&lt;p&gt;It's "is this new, or is this something I already know, changed?"&lt;/p&gt;

&lt;p&gt;Day 4. This one's about what we're building.&lt;/p&gt;

&lt;p&gt;In the last post i said the hard part of the memory is deciding. I think most people hear that and picture a bouncer, something at the door turning away claims that don't make the cut.&lt;/p&gt;

&lt;p&gt;That's the wrong picture. Throwing things away is one thing a memory system shouldn't do. Storage is cheap. The expensive question is structural.&lt;/p&gt;

&lt;p&gt;Every new piece of information is either a genuinely new thing, or it's a change to something already in the record. Getting that wrong in either direction is what breaks systems.&lt;/p&gt;

&lt;p&gt;Call every update a new memory and you get five near-identical claims about the same fact, drifting apart, all retrievable, none authoritative. Your agent picks one at random and sounds confident.&lt;/p&gt;

&lt;p&gt;Call every new thing an update and you quietly overwrite distinct facts that happened to look similar. That one's worse, because it's silent.&lt;/p&gt;

&lt;p&gt;So that judgement, new or changed, is the actual work. And it has to be made at write time, by something that can look at what's already known.&lt;/p&gt;

&lt;p&gt;Two things we decided early. Nothing gets overwritten: a change appends, and the previous state stays in the record. And every one of those decisions gets stored with the reasoning behind it, so you can go back and see not just what the system concluded, but why it concluded it.&lt;/p&gt;

&lt;p&gt;Neither is clever. Both are the kind of thing you can't add later.&lt;/p&gt;

&lt;p&gt;Day 5: why nobody in your org chart owns any of this.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>architecture</category>
      <category>database</category>
    </item>
    <item>
      <title>Your AI Memory Has No One in Charge</title>
      <dc:creator>Abhishek Kundagol</dc:creator>
      <pubDate>Tue, 18 Aug 2026 05:15:51 +0000</pubDate>
      <link>https://dev.to/chillpill_ak/your-ai-memory-has-no-one-in-charge-b0d</link>
      <guid>https://dev.to/chillpill_ak/your-ai-memory-has-no-one-in-charge-b0d</guid>
      <description>&lt;p&gt;Every time your AI stores something, it makes a decision.&lt;/p&gt;

&lt;p&gt;Keep this or merge this with what we already know. Correct the old version or reject it since it is wrong.&lt;/p&gt;

&lt;p&gt;In most systems today, nobody makes that decision. It's just an insert.&lt;/p&gt;

&lt;p&gt;Day 3.&lt;/p&gt;

&lt;p&gt;Think about how a good analyst handles new information. They don't just append it. They ask: does this contradict what I already have? Is this an update or a duplicate? Is the source reliable? Should this replace something?&lt;/p&gt;

&lt;p&gt;That's the actual work of remembering. Not the writing down, the judging.&lt;/p&gt;

&lt;p&gt;Now look at what most AI memory does. Embed the text. Insert the row and done. Every claim enters with equal standing. The correction doesn't overwrite the mistake, it just sits next to it. The duplicate becomes two votes for the same idea. The hallucination gets stores with exactly the same confidence as the verified fact.&lt;/p&gt;

&lt;p&gt;Then six weeks later, retrieval pulls one of them out, and no one can tell you which one it was or why.&lt;/p&gt;

&lt;p&gt;Writing is the easy half. Deciding is the whole problem.&lt;/p&gt;

&lt;p&gt;Day 4: what happens when you put something in charge of that decision.&lt;/p&gt;

&lt;p&gt;We at AlphaNimble building &lt;a href="https://www.memuron.com/" rel="noopener noreferrer"&gt;Memuron&lt;/a&gt;, a memory system for AI agents. This series is the thinking behind it, in the open.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>agents</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Retrieval Is Not Memory</title>
      <dc:creator>Abhishek Kundagol</dc:creator>
      <pubDate>Sat, 15 Aug 2026 06:10:57 +0000</pubDate>
      <link>https://dev.to/chillpill_ak/retrieval-is-not-memory-34f6</link>
      <guid>https://dev.to/chillpill_ak/retrieval-is-not-memory-34f6</guid>
      <description>&lt;p&gt;"We have memory. We're using RAG."&lt;/p&gt;

&lt;p&gt;You have retrieval. Those aren't the same thing, and the gap between them is where agents quietly go wrong.&lt;/p&gt;

&lt;p&gt;Day 2.&lt;/p&gt;

&lt;p&gt;RAG finds documents that look relevant to your question. That's it . That's the whole job. It's a very good search engine bolted to a very good writer.&lt;/p&gt;

&lt;p&gt;But consider what it can't do.&lt;/p&gt;

&lt;p&gt;Your customer changed their pricing tier in March. The old contract is still in the index. The new one is too. RAG doesn't know which one is true, it just knows both are relevant. It hands the model two answers and lets it guess.&lt;/p&gt;

&lt;p&gt;Memory would know one of those facts replaced the other, and when.&lt;/p&gt;

&lt;p&gt;That's the difference. Retrieval finds. Memory concludes.&lt;/p&gt;

&lt;p&gt;Retrieval asks "what documents match?" Memory asks "what do I actually believe, what changed my mind, and when did that happen?"&lt;/p&gt;

&lt;p&gt;One is lookup. The other is position.&lt;/p&gt;

&lt;p&gt;This matters because a system that only retrieves can never be wrong and it can never be right either. It has no beliefs to correct. Every contradiction in your data is a contradiction it will faithfully pass along, forever, with total confidence.&lt;/p&gt;

&lt;p&gt;Day 3: if memory means concluding things, then something has to decide what gets remembered. Right now, in most systems, nothing does.&lt;/p&gt;

&lt;p&gt;We at &lt;a href="https://www.alphanimble.com/" rel="noopener noreferrer"&gt;AlphaNimble&lt;/a&gt; are building &lt;a href="https://www.memuron.com/" rel="noopener noreferrer"&gt;Memuron&lt;/a&gt;, a memory system for AI agents. This series is thinking behind it, in the open.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>llm</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Context Windows Are Not Memory</title>
      <dc:creator>Abhishek Kundagol</dc:creator>
      <pubDate>Fri, 14 Aug 2026 05:44:10 +0000</pubDate>
      <link>https://dev.to/chillpill_ak/context-windows-are-not-memory-2edn</link>
      <guid>https://dev.to/chillpill_ak/context-windows-are-not-memory-2edn</guid>
      <description>&lt;p&gt;Everyone is racing to make AI smarter.&lt;br&gt;
Almost nobody is asking what it's allowed to remember.&lt;/p&gt;

&lt;p&gt;I'm starting a daily series on the least understood layer in AI. Day 1.&lt;/p&gt;

&lt;p&gt;Here's the confusion at the center of it: we've started calling the context window "memory." It isn't.&lt;/p&gt;

&lt;p&gt;A context window is a desk. You pile things on it, you work, and at the end of the session someone clears the desk. Bigger models just give you a bigger desk.&lt;/p&gt;

&lt;p&gt;Memory is the filing cabinet. What survives the desk being cleared.&lt;/p&gt;

&lt;p&gt;So picture hiring a brilliant analyst with no long-term memory. Every morning you re-brief them on the company, the customers, the decisions you already made together. They nod. They do genuinely excellent work. And by tomorrow, it's gone.&lt;/p&gt;

&lt;p&gt;You'd never call that person a knowledge worker. You'd call it a very expensive Groundhog Day.&lt;/p&gt;

&lt;p&gt;That is most "AI agents" running in production today.&lt;/p&gt;

&lt;p&gt;The industry's answer has been to treat this as a storage problem. Bigger context. Another vector database. Stuff more in, hope the right thing comes out.&lt;/p&gt;

&lt;p&gt;I think that's the wrong frame entirely. Memory isn't a storage problem.&lt;/p&gt;

&lt;p&gt;It's a trust problem.&lt;/p&gt;

&lt;p&gt;Tomorrow, Day 2: why RAG is not memory — and why confusing the two costs teams more than they realise.&lt;/p&gt;

&lt;p&gt;—&lt;/p&gt;

&lt;p&gt;We at Alphanimble building Memuron, a memory system for AI agents. This series is the thinking behind it, in the open. Every post is something I've had to figure out to build the thing.&lt;/p&gt;

&lt;h1&gt;
  
  
  AI #AIAgents #AIMemory
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>discuss</category>
      <category>startup</category>
    </item>
    <item>
      <title>Your AI Doesn't Have Amnesia — It Has a Storage Problem</title>
      <dc:creator>Abhishek Kundagol</dc:creator>
      <pubDate>Wed, 08 Jul 2026 05:35:03 +0000</pubDate>
      <link>https://dev.to/chillpill_ak/your-ai-doesnt-have-amnesia-it-has-a-storage-problem-3nie</link>
      <guid>https://dev.to/chillpill_ak/your-ai-doesnt-have-amnesia-it-has-a-storage-problem-3nie</guid>
      <description>&lt;p&gt;I hit this wall over and over.&lt;/p&gt;

&lt;p&gt;I'd have a long conversation with one LLM — Claude, ChatGPT, Gemini, whatever — and then want to continue the same thread in another. Maybe I started researching in ChatGPT and wanted to implement in Cursor. Maybe Claude had better reasoning for one part, but I needed a different tool for the next step.&lt;br&gt;
The only workaround? Copy-paste the entire conversation. Every message. Every detail. Just to give the new model enough context to pick up where the last one left off.&lt;/p&gt;

&lt;p&gt;It works, barely. But it's awful. You're manually shuttling context between tools that are supposed to be smart. And you're burning tokens on duplicated history — paying twice (or three times) for information you already established once.&lt;/p&gt;

&lt;h2&gt;
  
  
  That friction is where this problem really started for me. Not abstractly. Practically. Every time you switch AI tools, you start over — or you become the copy-paste middleware between siloed memories.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Every AI remembers you differently. None of them share.
&lt;/h2&gt;

&lt;p&gt;ChatGPT has its own memory. Claude has connectors and conversation context. Cursor picks up rules and session context. Gemini holds a different slice of your preferences. Every custom agent, IDE plugin, and workflow tool stores what it learns separately.&lt;br&gt;
Each platform is getting smarter. Each one remembers more. And none of them talk to each other.&lt;/p&gt;

&lt;p&gt;You explain your tech stack in Claude, then again in Cursor. You set tone preferences in ChatGPT that your coding agent never sees. You research in one tool and reconstruct context from scratch in another.&lt;/p&gt;

&lt;p&gt;It's not just inconvenient. It's a structural flaw: &lt;strong&gt;each AI owns its own memory, and there's no shared layer underneath.&lt;/strong&gt;&lt;br&gt;
And underneath most of these systems? Vector databases — similarity search over a bag of facts. Tell an agent &lt;em&gt;"I like blue"&lt;/em&gt; on Monday and &lt;em&gt;"actually, I prefer red"&lt;/em&gt; on Tuesday, and a plain vector store returns &lt;strong&gt;both&lt;/strong&gt;. The agent gets a contradiction it can't resolve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every contradicted memory is a silent hallucination waiting to surface.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  What we built: one memory graph, every agent
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.memuron.com/" rel="noopener noreferrer"&gt;Memuron&lt;/a&gt;&lt;/strong&gt; is a semantic memory layer for AI agents — not a vector bucket, but a managed knowledge graph that any tool can read from and write to.&lt;/p&gt;

&lt;p&gt;Connect Cursor, Claude, ChatGPT, or your own agents via MCP or API, and they all work against the &lt;strong&gt;same&lt;/strong&gt; durable memory. Start a conversation in one place. Continue in another. No copy-pasting. No re-explaining. No wasted tokens shuttling context you already established.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.memuron.com/" rel="noopener noreferrer"&gt;Memuron&lt;/a&gt; doesn't replace your AI tools. It gives them a shared brain.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Guardian decides before it stores.&lt;/strong&gt; Every write passes through an LLM pipeline that asks: is this a new fact, an update to something already known, or a link to a related memory? When preferences change, &lt;a href="https://www.memuron.com/" rel="noopener noreferrer"&gt;Memuron&lt;/a&gt; evolves the existing memory in place — it doesn't pile up contradictions.&lt;br&gt;
&lt;strong&gt;A graph, not a pile of embeddings.&lt;/strong&gt; Memories are typed nodes connected by semantic links. Agents can search, traverse, and reason over relationships — not just grab the nearest vector match.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;One substrate, many clients.&lt;/strong&gt; MCP-native integration means Cursor, Claude, and ChatGPT query and write to the same org-scoped graph. OAuth authentication — no API key wrangling in your editor.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  What you get
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid Graph Search&lt;/strong&gt; — vector, lexical, and link-description matching fused together. Returns memories and the edge that made them relevant.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GraphFS&lt;/strong&gt; — query your memory graph like a filesystem:&lt;br&gt;
cwd /spaces/work ls | grep "auth" | semantic "rate limiting" | links&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Spaces&lt;/strong&gt; — separate work, personal, and project context, each with its own Guardian rules.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Document Ingestion&lt;/strong&gt; — PDFs, DOCX, Markdown, images, and more, parsed into chunk nodes and linked into your graph. Resolve any chunk back to the original source.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;URL &amp;amp; Folder Sync&lt;/strong&gt; — fetch pages, sync local folders, keep stable identities so re-runs update instead of duplicate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Context Assembly&lt;/strong&gt; — prompt-ready blocks with citations, graph breadcrumbs, and hard token budgets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multi-Tenant Isolation&lt;/strong&gt; — cryptographic tenant boundaries for B2B SaaS and team deployments.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  - &lt;strong&gt;REST API + CLI&lt;/strong&gt; — &lt;code&gt;uvx memuron&lt;/code&gt; for scripts, CI, and custom integrations.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Memory that travels with you
&lt;/h2&gt;

&lt;p&gt;The future of AI isn't ten separate brains that each forget what the others learned. It's one durable memory layer that every agent can tap into — smart enough to update itself, structured enough to query, and open enough to connect anywhere.&lt;br&gt;
You shouldn't have to be the copy-paste layer between your AI tools. &lt;a href="https://www.memuron.com/&lt;br&gt;%0A![%20](https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/036lci611t7fjhd0hgs4.png)" rel="noopener noreferrer"&gt;Memuron&lt;/a&gt; is that layer — so you can stop repeating yourself and start building on what you already know.&lt;br&gt;
&lt;strong&gt;Memory that decides before it stores. One graph for every agent you use.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>discuss</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
