<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://your-docusaurus-site.example.com/blog</id>
    <title>airules Blog</title>
    <updated>2026-06-16T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://your-docusaurus-site.example.com/blog"/>
    <subtitle>airules Blog</subtitle>
    <icon>https://your-docusaurus-site.example.com/img/favicon.svg</icon>
    <entry>
        <title type="html"><![CDATA[Your LLM Shouldn't Be Handling If/Else Logic]]></title>
        <id>https://your-docusaurus-site.example.com/blog/llm-should-not-handle-if-else</id>
        <link href="https://your-docusaurus-site.example.com/blog/llm-should-not-handle-if-else"/>
        <updated>2026-06-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Here's code that's running in production right now across thousands of applications:]]></summary>
        <content type="html"><![CDATA[<p>Here's code that's running in production right now across thousands of applications:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> pydantic_ai </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> Agent</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> enum </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> Enum</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">Team</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">Enum</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    BILLING </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"billing"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    AUTH </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"auth"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    SHIPPING </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"shipping"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    RETURNS </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"returns"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    GENERAL </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"general"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">agent </span><span class="token operator">=</span><span class="token plain"> Agent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"openai:gpt-4o-mini"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    output_type</span><span class="token operator">=</span><span class="token plain">Team</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    system_prompt</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"Route this support ticket to the correct team."</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">route</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">subject</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> body</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(189, 147, 249)">str</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token plain"> Team</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    result </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> agent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Subject: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">subject</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">\n\n</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">body</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> result</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">output</span><br></div></code></pre></div></div>
<p>It's clean. It's flexible. And every time a user types "I want to unsubscribe"
or "forgot my password," it burns tokens to answer a question the model already
answered yesterday.</p>
<!-- -->
<p><code>gpt-4o-mini</code> costs $0.15 per million input tokens. At 50,000 tickets a day,
with an average prompt of 300 tokens, that's 15 million tokens a day - $2.25
daily, $820 a year - on inputs that need zero intelligence. Just pattern
matching.</p>
<p>You might think: <em>fine, I'll add a quick if/elif pre-filter.</em> That works until
you have 15 conditions, three engineers who've each added their own special
cases, a subtly wrong ordering that shadows a rule nobody noticed, and zero tests
for the logic structure itself. The spaghetti grows fast.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-smarter-architecture">The smarter architecture<a href="https://your-docusaurus-site.example.com/blog/llm-should-not-handle-if-else#the-smarter-architecture" class="hash-link" aria-label="Direct link to The smarter architecture" title="Direct link to The smarter architecture" translate="no">​</a></h2>
<p>What's missing is a <strong>declarative, type-safe pre-filter</strong> that handles the
predictable 80% of your traffic deterministically - cheap, instantaneous,
auditable - and routes only the genuine edge cases to the LLM.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">Incoming ticket</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      ▼</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">┌─────────────────┐    match     ┌──────────────┐</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│  TicketRouter   │ ──────────▶  │  Return Team │  ← 0ms, $0</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│  (airules)      │              └──────────────┘</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│                 │    no match</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│                 │ ──────────▶  ┌──────────────┐</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">└─────────────────┘              │     LLM      │  ← 800ms, $$$</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                 └──────────────┘</span><br></div></code></pre></div></div>
<p>The key insight: most decisions are already known. If you can write down the
right answer for a given input pattern, that knowledge belongs in a rule.
AI earns its cost on the genuinely unknown tail - the inputs nobody anticipated.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="type-safety-matters">Type safety matters<a href="https://your-docusaurus-site.example.com/blog/llm-should-not-handle-if-else#type-safety-matters" class="hash-link" aria-label="Direct link to Type safety matters" title="Direct link to Type safety matters" translate="no">​</a></h2>
<p>The problem with if/elif chains isn't just readability. It's that
<code>ticket["subject"]</code> is untyped - a missing key silently becomes a <code>KeyError</code>
at runtime, a typo in a field name goes undetected until production, and nothing
stops you from comparing a <code>float</code> to a string.</p>
<p><code>airules</code> brings static typing to decision logic. Facts are typed schemas,
predicates are built from field accessors, and the engine is
<code>Generic[FactType, ReturnType]</code> - your editor catches bad field references
and type mismatches before you deploy.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-default-fallback">The @Default fallback<a href="https://your-docusaurus-site.example.com/blog/llm-should-not-handle-if-else#the-default-fallback" class="hash-link" aria-label="Direct link to The @Default fallback" title="Direct link to The @Default fallback" translate="no">​</a></h2>
<p>The LLM call moves into the <code>@Default</code> method - the one that fires only when
the engine found no match:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">TicketRouter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">KnowledgeEngine</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">Ticket</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Team</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token decorator annotation punctuation" style="color:rgb(248, 248, 242)">@Rule</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        Ticket</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">subject</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">contains</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"billing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> case_insensitive</span><span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token operator">|</span><span class="token plain"> Ticket</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">body</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">contains</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"invoice"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> case_insensitive</span><span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">billing</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> ticket</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Ticket</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token plain"> Team</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> Team</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">BILLING</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token decorator annotation punctuation" style="color:rgb(248, 248, 242)">@Rule</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        Ticket</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">subject</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">contains</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"password"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> case_insensitive</span><span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token operator">|</span><span class="token plain"> Ticket</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">subject</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">contains</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"login"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> case_insensitive</span><span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">auth</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> ticket</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Ticket</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token plain"> Team</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> Team</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">AUTH</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token decorator annotation punctuation" style="color:rgb(248, 248, 242)">@Default</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">llm_fallback</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> ticket</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Ticket</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token plain"> Team</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        rules_schema </span><span class="token operator">=</span><span class="token plain"> json</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">dumps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token builtin" style="color:rgb(189, 147, 249)">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">describe</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> indent</span><span class="token operator">=</span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        agent </span><span class="token operator">=</span><span class="token plain"> Agent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"openai:gpt-4o-mini"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            output_type</span><span class="token operator">=</span><span class="token plain">Team</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            system_prompt</span><span class="token operator">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"You only receive tickets that matched none of the deterministic rules.\n\n"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Existing rules:\n</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">rules_schema</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        result </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> agent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"Subject: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">ticket</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">subject</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">\n\n</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">ticket</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">body</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> result</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">output</span><br></div></code></pre></div></div>
<p>Look at <code>type(self).describe()</code>. When the LLM receives the system prompt, it
also receives the complete serialized schema of every rule that already exists in
the engine. The model knows precisely which patterns have already been handled.
It won't accidentally contradict an existing rule, because it can see what the
rules are.</p>
<p>Without this, your LLM and your rules engine are two separate systems with no
shared understanding. With it, they're one coherent pipeline.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-iterative-loop">The iterative loop<a href="https://your-docusaurus-site.example.com/blog/llm-should-not-handle-if-else#the-iterative-loop" class="hash-link" aria-label="Direct link to The iterative loop" title="Direct link to The iterative loop" translate="no">​</a></h2>
<p>Once this is running, your <code>@Default</code> hits are a roadmap:</p>
<ol>
<li class=""><strong>Observe</strong> - track which inputs are hitting the LLM</li>
<li class=""><strong>Analyze</strong> - cluster the default facts by field values and patterns</li>
<li class=""><strong>Add rules</strong> - write a new <code>@Rule</code> for each pattern you can enumerate</li>
<li class=""><strong>Repeat</strong> - default rate drops, token spend drops, latency drops</li>
</ol>
<p>The LLM trains the rules engine. Every correct LLM classification is signal for
a new rule. Over time, the engine handles more and more of the traffic - the LLM
handles less and less, and stays reserved for inputs that genuinely benefit from
its reasoning.</p>
<p>Optimizing LLM cost and latency isn't just about choosing smaller models or
caching responses. It's about being intentional with what you send to the LLM
in the first place. The pattern is simple: <strong>rules for what you know, LLM for
what you don't.</strong></p>]]></content>
        <author>
            <name>Tomasz Bilaszewski</name>
            <uri>https://github.com/tbilaszewski</uri>
        </author>
        <category label="Rules Engine" term="Rules Engine"/>
        <category label="LLM" term="LLM"/>
        <category label="Cost Optimization" term="Cost Optimization"/>
        <category label="Python" term="Python"/>
    </entry>
</feed>