<?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: Vishal Shinde</title>
    <description>The latest articles on DEV Community by Vishal Shinde (@vishal_shinde_4ab1697a22a).</description>
    <link>https://dev.to/vishal_shinde_4ab1697a22a</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%2F4218795%2F25fc00c0-8689-4e9d-8d48-d46fc7cd34d3.png</url>
      <title>DEV Community: Vishal Shinde</title>
      <link>https://dev.to/vishal_shinde_4ab1697a22a</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vishal_shinde_4ab1697a22a"/>
    <language>en</language>
    <item>
      <title>Cut Your AI Agent Prompt Size by 75% Using a Fast Decision Model (Jev / decision-1)</title>
      <dc:creator>Vishal Shinde</dc:creator>
      <pubDate>Sat, 31 Oct 2026 10:21:03 +0000</pubDate>
      <link>https://dev.to/vishal_shinde_4ab1697a22a/cut-your-ai-agent-prompt-size-by-75-using-a-fast-decision-model-jev-decision-1-4lhb</link>
      <guid>https://dev.to/vishal_shinde_4ab1697a22a/cut-your-ai-agent-prompt-size-by-75-using-a-fast-decision-model-jev-decision-1-4lhb</guid>
      <description>&lt;h2&gt;
  
  
  How to split a bloated AI agent prompt into modular skills and use a fast Decision Model to route only the instructions and tools each user question actually needs.
&lt;/h2&gt;

&lt;p&gt;When you build an AI assistant for a web application — say, an &lt;strong&gt;Online Travel &amp;amp; Flight Booking Assistant&lt;/strong&gt; — it always starts simple. You write a short system prompt and attach one or two tools, like &lt;code&gt;search_bookings&lt;/code&gt; and &lt;code&gt;cancel_booking&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Fast-forward a few months. Your assistant now supports searching flights, switching UI tabs, applying multi-field filters, downloading boarding passes, checking refund eligibility, rebooking flights, and answering baggage policy questions. Suddenly, every single user message sends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;15,000+ characters&lt;/strong&gt; of system prompt instructions covering every possible edge case&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;8 to 15 JSON Schema tool definitions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The live UI state and conversation history&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even when a user simply types &lt;em&gt;"Switch to my Cancelled Trips tab"&lt;/em&gt;, your application pays the token cost and latency of sending rules for baggage claims, refund penalties, and multi-city date filters to your primary LLM.&lt;/p&gt;

&lt;p&gt;In this post, I’ll share how we used a lightweight, ultra-fast &lt;strong&gt;Decision Model (&lt;code&gt;decision-1&lt;/code&gt; / Jev)&lt;/strong&gt; as a skill router in front of our primary LLM—cutting prompt size by &lt;strong&gt;60% to 76%&lt;/strong&gt; on every turn.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is a Decision Model (&lt;code&gt;decision-1&lt;/code&gt; / Jev)?
&lt;/h2&gt;

&lt;p&gt;Unlike a large generative model that writes free-form paragraphs, a &lt;strong&gt;Decision Model&lt;/strong&gt; is a small, specialized model designed to answer a batch of binary (&lt;code&gt;yes&lt;/code&gt; / &lt;code&gt;no&lt;/code&gt;) classification questions against a given context in a single fast pass.&lt;/p&gt;

&lt;p&gt;Instead of asking a heavyweight LLM to read 15,000 characters of instructions and 10 tool schemas on every turn, we use a two-stage pipeline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stage 1 — Skill Selection (~300–700ms):&lt;/strong&gt; Send the user’s recent conversation and a list of skill descriptions to &lt;code&gt;decision-1&lt;/code&gt;. It evaluates all skills in parallel and returns &lt;code&gt;yes&lt;/code&gt; or &lt;code&gt;no&lt;/code&gt; for each skill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stage 2 — Tailored LLM Call:&lt;/strong&gt; Build the system prompt and tool list using &lt;strong&gt;only&lt;/strong&gt; the skills where &lt;code&gt;decision-1&lt;/code&gt; answered &lt;code&gt;yes&lt;/code&gt;, and send that compact payload to the primary LLM.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Divide Your Monolithic Prompt into Skills
&lt;/h2&gt;

&lt;p&gt;Instead of one giant system prompt, we group domain instructions and tools into self-contained &lt;strong&gt;Skills&lt;/strong&gt;. Each skill has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An &lt;strong&gt;ID&lt;/strong&gt; (e.g., &lt;code&gt;NAVIGATE_TAB&lt;/code&gt;, &lt;code&gt;FILTER_BOOKINGS&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;A concise &lt;strong&gt;1-sentence &lt;code&gt;description&lt;/code&gt;&lt;/strong&gt; that tells the Decision Model when to select &lt;code&gt;yes&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;tool names&lt;/strong&gt; associated with that skill&lt;/li&gt;
&lt;li&gt;The detailed &lt;strong&gt;&lt;code&gt;instructions&lt;/code&gt;&lt;/strong&gt; that should be injected into the main LLM prompt &lt;em&gt;only&lt;/em&gt; when that skill is selected&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A key lesson we learned: &lt;strong&gt;don’t pass the entire multi-paragraph skill instructions to the Decision Model&lt;/strong&gt; (it slows down evaluation), and &lt;strong&gt;don’t maintain separate custom &lt;code&gt;yes&lt;/code&gt; and &lt;code&gt;no&lt;/code&gt; rules per skill&lt;/strong&gt; (it doubles maintenance). A single 1-sentence &lt;code&gt;description&lt;/code&gt; per skill is fast, accurate, and easy to maintain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;enum&lt;/span&gt; &lt;span class="nc"&gt;BookingSkill&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="no"&gt;SEARCH_BOOKINGS&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="s"&gt;"SEARCH_BOOKINGS"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"""
            Select 'yes' when the user asks to find, list, look up, or check the status of their flight or hotel bookings.
            """&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"search_bookings"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;"""
            ### Searching Bookings (search_bookings)
            - Always call search_bookings before quoting PNR codes, flight numbers, or departure times.
            - Present results in a clean Markdown table with columns: PNR, Route, Date, and Status.
            """&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;

    &lt;span class="no"&gt;NAVIGATE_TAB&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="s"&gt;"NAVIGATE_TAB"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"""
            Select 'yes' when the user asks to switch views or open the Upcoming, Past, or Cancelled bookings tab.
            """&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"navigate_tab"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;"""
            ### Navigating Tabs (navigate_tab)
            - Valid tabs: UPCOMING, PAST, CANCELLED.
            - Check the current activeTab in the UI context first; if already on the target tab, do not call the tool.
            """&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;

    &lt;span class="no"&gt;FILTER_BOOKINGS&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="s"&gt;"FILTER_BOOKINGS"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"""
            Select 'yes' when the user asks to filter bookings by airline, destination city, date range, or passenger name, or clear filters.
            """&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"filter_bookings"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;"""
            ### Filtering Bookings (filter_bookings)
            - Map city names to 3-letter IATA airport codes when available.
            - Pass clearAll: true when the user asks to reset or remove active filters.
            """&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;

    &lt;span class="no"&gt;REFUND_OR_REBOOK&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="s"&gt;"REFUND_OR_REBOOK"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"""
            Select 'yes' when the user asks to cancel a trip, request a refund, or change their flight date or time.
            """&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"check_refund_eligibility"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"request_refund"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;"""
            ### Refunds &amp;amp; Rebooking (check_refund_eligibility, request_refund)
            - Always call check_refund_eligibility first and show the breakdown to the user.
            - Never invoke request_refund without explicit user confirmation of the penalty amount.
            """&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;toolNames&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nc"&gt;BookingSkill&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;toolNames&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toolNames&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;copyOf&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;toolNames&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;instructions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: How Skills Are Sent to the Decision Model
&lt;/h2&gt;

&lt;p&gt;The Decision Model API (&lt;code&gt;/v1/systemone&lt;/code&gt;) accepts a JSON request with three fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;model&lt;/code&gt;:&lt;/strong&gt; &lt;code&gt;"decision-1"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;context&lt;/code&gt;:&lt;/strong&gt; The recent conversation turns plus the latest user question&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;questions&lt;/code&gt;:&lt;/strong&gt; A map where each key is a Skill ID and each value defines the &lt;code&gt;yes&lt;/code&gt; and &lt;code&gt;no&lt;/code&gt; criteria&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We map each skill’s &lt;code&gt;description&lt;/code&gt; to &lt;code&gt;"yes"&lt;/code&gt; and use a single shared constant for &lt;code&gt;"no"&lt;/code&gt; across all skills:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="no"&gt;NO_CRITERION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="s"&gt;"Select 'no' when this skill is not needed to answer the user's request."&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;buildQuestions&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BookingSkill&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;values&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Collectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toMap&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                    &lt;span class="nl"&gt;BookingSkill:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;getId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;skill&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                            &lt;span class="s"&gt;"yes"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDescription&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;strip&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
                            &lt;span class="s"&gt;"no"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;NO_CRITERION&lt;/span&gt;
                    &lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sample Request to &lt;code&gt;decision-1&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Suppose the user asks: &lt;em&gt;"Can you take me to my cancelled flights and filter by London?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here is the exact JSON payload sent to the Decision Model:&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;"decision-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;"context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Recent conversation:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;USER: Can you take me to my cancelled flights and filter by London?&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;Latest user question:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Can you take me to my cancelled flights and filter by London?"&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="nl"&gt;"SEARCH_BOOKINGS"&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;"yes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Select 'yes' when the user asks to find, list, look up, or check the status of their flight or hotel bookings."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"no"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Select 'no' when this skill is not needed to answer the user's request."&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;"NAVIGATE_TAB"&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;"yes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Select 'yes' when the user asks to switch views or open the Upcoming, Past, or Cancelled bookings tab."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"no"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Select 'no' when this skill is not needed to answer the user's request."&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;"FILTER_BOOKINGS"&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;"yes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Select 'yes' when the user asks to filter bookings by airline, destination city, date range, or passenger name, or clear filters."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"no"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Select 'no' when this skill is not needed to answer the user's request."&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;"REFUND_OR_REBOOK"&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;"yes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Select 'yes' when the user asks to cancel a trip, request a refund, or change their flight date or time."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"no"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Select 'no' when this skill is not needed to answer the user's request."&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sample Response from &lt;code&gt;decision-1&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;In a single call, &lt;code&gt;decision-1&lt;/code&gt; evaluates all four skills in parallel and returns its decisions:&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;"decision-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;"decisions"&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;"SEARCH_BOOKINGS"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"no"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"NAVIGATE_TAB"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"FILTER_BOOKINGS"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"REFUND_OR_REBOOK"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"no"&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;Notice that because each skill is evaluated independently, &lt;code&gt;decision-1&lt;/code&gt; naturally handles &lt;strong&gt;multi-intent queries&lt;/strong&gt;—selecting both &lt;code&gt;NAVIGATE_TAB&lt;/code&gt; and &lt;code&gt;FILTER_BOOKINGS&lt;/code&gt; while excluding &lt;code&gt;SEARCH_BOOKINGS&lt;/code&gt; and &lt;code&gt;REFUND_OR_REBOOK&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Filtering the Prompt and Tools
&lt;/h2&gt;

&lt;p&gt;Once &lt;code&gt;decision-1&lt;/code&gt; returns the map of decisions, we filter both the system prompt sections and the tool definitions before calling the primary LLM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 1. Keep only skills where decision-1 returned "yes"&lt;/span&gt;
&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;BookingSkill&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;selectedSkills&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BookingSkill&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;values&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;skill&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"yes"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equalsIgnoreCase&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;decisions&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getId&lt;/span&gt;&lt;span class="o"&gt;())))&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toList&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// 2. Assemble system prompt with only the selected skill instructions&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;tailoredSystemPrompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;BASE_PROMPT&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"\n\n"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;selectedSkills&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;BookingSkill:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;getInstructions&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Collectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;joining&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"\n\n"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// 3. Expose only the tools belonging to the selected skills&lt;/span&gt;
&lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;allowedToolNames&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;selectedSkills&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;flatMap&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;skill&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getToolNames&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Collectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toSet&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Tool&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tailoredTools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;allTools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;allowedToolNames&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;()))&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toList&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the user’s message is conversational (e.g., &lt;em&gt;"Thanks!"&lt;/em&gt;) and all skills return &lt;code&gt;"no"&lt;/code&gt;, the primary LLM receives only the lightweight base persona prompt with &lt;strong&gt;zero&lt;/strong&gt; tool schemas. And if the Decision Model ever times out or is unreachable, we simply fall back to the full prompt and tool set so the user experience never breaks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Real Impact in Production Logs
&lt;/h2&gt;

&lt;p&gt;To measure the savings, we logged the character count and tool count of the primary LLM input &lt;strong&gt;without Decision-1&lt;/strong&gt; versus &lt;strong&gt;with Decision-1&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INFO BookingSkillRouter : Decision-1 selected skills for thread d34893b3-73d2-466c-949b-c2ddad5161aa in 775 ms: [NAVIGATE_TAB]
INFO BookingSkillRouter : Input size for thread d34893b3-73d2-466c-949b-c2ddad5161aa:
  without Decision-1 = 17567 chars (4 tools),
  with Decision-1    = 7052 chars (1 tools),
  saved              = 10515 chars (-60%)

INFO BookingSkillRouter : Decision-1 selected skills for thread d34893b3-73d2-466c-949b-c2ddad5161aa in 884 ms: [NAVIGATE_TAB]
INFO BookingSkillRouter : Input size for thread d34893b3-73d2-466c-949b-c2ddad5161aa:
  without Decision-1 = 13783 chars (4 tools),
  with Decision-1    = 3268 chars (1 tools),
  saved              = 10515 chars (-76%)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;60% to 76% prompt size reduction:&lt;/strong&gt; By stripping out irrelevant instructions and unused tool schemas, every turn sends a fraction of the tokens to your main LLM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better tool selection by the main LLM:&lt;/strong&gt; When the primary LLM only sees 1 or 2 relevant tools instead of 10+, it makes fewer parameter mistakes and avoids calling the wrong tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy to scale:&lt;/strong&gt; Adding a 10th or 15th skill to your agent no longer bloats every request — each new skill only adds a single 1-sentence question to &lt;code&gt;decision-1&lt;/code&gt;, while the main LLM prompt stays lean.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>java</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
