<?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: Anannya Roy Chowdhury</title>
    <description>The latest articles on DEV Community by Anannya Roy Chowdhury (@royanannya).</description>
    <link>https://dev.to/royanannya</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3813086%2F9b30135b-af43-4b2d-80ba-cc780071faa5.png</url>
      <title>DEV Community: Anannya Roy Chowdhury</title>
      <link>https://dev.to/royanannya</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/royanannya"/>
    <language>en</language>
    <item>
      <title>Read how Strands SDK can help you build AI Agents with practically low code!</title>
      <dc:creator>Anannya Roy Chowdhury</dc:creator>
      <pubDate>Mon, 01 Jun 2026 11:48:21 +0000</pubDate>
      <link>https://dev.to/royanannya/-4ia8</link>
      <guid>https://dev.to/royanannya/-4ia8</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/royanannya/i-let-an-ai-plan-my-vacation-heres-what-it-built-4b5h" class="crayons-story__hidden-navigation-link"&gt;I Let an AI Plan My Vacation (Here's What It Built)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/royanannya" class="crayons-avatar  crayons-avatar--l  "&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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3813086%2F9b30135b-af43-4b2d-80ba-cc780071faa5.png" alt="royanannya profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/royanannya" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Anannya Roy Chowdhury
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Anannya Roy Chowdhury
                
              
              &lt;div id="story-author-preview-content-3717681" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/royanannya" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3813086%2F9b30135b-af43-4b2d-80ba-cc780071faa5.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Anannya Roy Chowdhury&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/royanannya/i-let-an-ai-plan-my-vacation-heres-what-it-built-4b5h" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 27&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/royanannya/i-let-an-ai-plan-my-vacation-heres-what-it-built-4b5h" id="article-link-3717681"&gt;
          I Let an AI Plan My Vacation (Here's What It Built)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/aws"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;aws&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/machinelearning"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;machinelearning&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/python"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;python&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/royanannya/i-let-an-ai-plan-my-vacation-heres-what-it-built-4b5h" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;7&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/royanannya/i-let-an-ai-plan-my-vacation-heres-what-it-built-4b5h#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            6 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>I Let an AI Plan My Vacation (Here's What It Built)</title>
      <dc:creator>Anannya Roy Chowdhury</dc:creator>
      <pubDate>Wed, 27 May 2026 14:45:00 +0000</pubDate>
      <link>https://dev.to/royanannya/i-let-an-ai-plan-my-vacation-heres-what-it-built-4b5h</link>
      <guid>https://dev.to/royanannya/i-let-an-ai-plan-my-vacation-heres-what-it-built-4b5h</guid>
      <description>&lt;h2&gt;
  
  
  I Had 47 Browser Tabs Open. So I Built an AI Travel Agent with &lt;a href="https://strandsagents.com/" rel="noopener noreferrer"&gt;Strands SDK&lt;/a&gt; + &lt;a href="https://aws.amazon.com/bedrock/?trk=be7b5579-904d-4ab5-808c-91e14f22671e&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Amazon Bedrock&lt;/a&gt; ✈️
&lt;/h2&gt;

&lt;p&gt;Okay, so real talk.&lt;/p&gt;

&lt;p&gt;I had &lt;strong&gt;47 browser tabs&lt;/strong&gt; open.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;47.....&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Flights on a Flights App. Hotels on a Booking website. Weather on some sketchy website that was 40% ads. A spreadsheet I made at 11 PM that somehow had &lt;strong&gt;three separate columns all labeled "maybe hotel??"&lt;/strong&gt; and one row that just said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"check vibes"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;All I wanted was to plan a week-long trip to Thailand.&lt;/p&gt;

&lt;p&gt;And then — because I am a developer, and developers solve problems with code even when they absolutely should not — I closed all 47 tabs, opened &lt;a href="https://kiro.dev/?trk=be7b5579-904d-4ab5-808c-91e14f22671e&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Kiro's&lt;/a&gt; spec-driven mode, and said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Fine. I'll build the travel agent myself with Strands SDK."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two hours later, I typed one sentence into my chat window and got back:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flights&lt;/li&gt;
&lt;li&gt;Hotels&lt;/li&gt;
&lt;li&gt;Weather warnings&lt;/li&gt;
&lt;li&gt;A complete 7-day itinerary&lt;/li&gt;
&lt;li&gt;Budget breakdowns&lt;/li&gt;
&lt;li&gt;Packing recommendations&lt;/li&gt;
&lt;li&gt;VISA options&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And honestly?&lt;/p&gt;

&lt;p&gt;I haven’t touched that spreadsheet since.&lt;/p&gt;

&lt;p&gt;So let’s build the thing. 👇&lt;/p&gt;




&lt;h1&gt;
  
  
  Wait… What Even &lt;em&gt;Is&lt;/em&gt; Strands SDK?
&lt;/h1&gt;

&lt;p&gt;Before we dive in:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://strandsagents.com/" rel="noopener noreferrer"&gt;Strands&lt;/a&gt; SDK&lt;/strong&gt; is &lt;a href="https://aws.amazon.com/?trk=be7b5579-904d-4ab5-808c-91e14f22671e&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;AWS’s&lt;/a&gt; open-source Python framework for building AI agents.&lt;/p&gt;

&lt;p&gt;Think of it like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You write Python functions (&lt;strong&gt;tools&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Add a &lt;code&gt;@tool&lt;/code&gt; decorator&lt;/li&gt;
&lt;li&gt;Connect it to a model on Amazon Bedrock&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The model decides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which tools to call&lt;/li&gt;
&lt;li&gt;in what order&lt;/li&gt;
&lt;li&gt;with what inputs&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;That’s… basically it.&lt;/p&gt;

&lt;p&gt;No YAML facades.&lt;br&gt;
No 400-page orchestration configs.&lt;br&gt;
No dependency graphs that look like a subway map.&lt;/p&gt;

&lt;p&gt;Just Python functions and an LLM smart enough to use them.&lt;/p&gt;

&lt;p&gt;Here’s the mental model that helped me:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your Agent = A Smart Intern
Your Tools = What the Intern Can Do
Your Prompt = The Instructions
Bedrock = The Intern's Brain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Except this intern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;never misses deadlines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;10/10 would hire again.&lt;/p&gt;




&lt;h1&gt;
  
  
  What We’re Building
&lt;/h1&gt;

&lt;p&gt;Our AI travel planner should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✈️ Find flights&lt;/li&gt;
&lt;li&gt;🏨 Find hotels&lt;/li&gt;
&lt;li&gt;🌦️ Check weather&lt;/li&gt;
&lt;li&gt;📋 Check Budgets and Build a full itinerary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One agent.&lt;br&gt;
Four tools.&lt;br&gt;
One prompt.&lt;/p&gt;

&lt;p&gt;Done.&lt;/p&gt;


&lt;h1&gt;
  
  
  Architecture Overview
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ehc38fys22gl8gg0htv.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.amazonaws.com%2Fuploads%2Farticles%2F2ehc38fys22gl8gg0htv.png" alt=" " width="800" height="803"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Stack Used
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://strandsagents.com/" rel="noopener noreferrer"&gt;Strands SDK&lt;/a&gt;&lt;/strong&gt; → Agent framework&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aws.amazon.com/bedrock/?trk=be7b5579-904d-4ab5-808c-91e14f22671e&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Amazon Bedrock&lt;/a&gt;&lt;/strong&gt; → Claude 3.5 Sonnet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aws.amazon.com/lambda/?trk=be7b5579-904d-4ab5-808c-91e14f22671e&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;AWS Lambda&lt;/a&gt;&lt;/strong&gt; → Tool execution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aws.amazon.com/secrets-manager/?trk=be7b5579-904d-4ab5-808c-91e14f22671e&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Secrets Manager&lt;/a&gt;&lt;/strong&gt; → API keys&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aws.amazon.com/s3/?trk=be7b5579-904d-4ab5-808c-91e14f22671e&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;S3&lt;/a&gt;&lt;/strong&gt; → Save itineraries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aws.amazon.com/cloudwatch/?trk=be7b5579-904d-4ab5-808c-91e14f22671e&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;CloudWatch&lt;/a&gt;&lt;/strong&gt; → Logging &amp;amp; observability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yes, this is production-friendly.&lt;/p&gt;

&lt;p&gt;We’ll get there.&lt;/p&gt;


&lt;h1&gt;
  
  
  Step 0 — Setup
&lt;/h1&gt;

&lt;p&gt;Install dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;strands-agents strands-agents-tools boto3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable &lt;strong&gt;Claude 3.5 Sonnet&lt;/strong&gt; inside Amazon Bedrock.&lt;/p&gt;

&lt;p&gt;Takes ~2 minutes.&lt;/p&gt;




&lt;h1&gt;
  
  
  🚨 Please Don’t Hardcode API Keys
&lt;/h1&gt;

&lt;p&gt;I know.&lt;/p&gt;

&lt;p&gt;You’re “just testing.”&lt;/p&gt;

&lt;p&gt;That API key &lt;em&gt;will&lt;/em&gt; end up in a public GitHub repo eventually.&lt;/p&gt;

&lt;p&gt;And then you will land up with a bill that burns your wallet.&lt;/p&gt;

&lt;p&gt;Use &lt;strong&gt;AWS Secrets Manager&lt;/strong&gt; instead.&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;boto3&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_secret&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secret_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Fetch API keys securely from AWS Secrets Manager.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;secretsmanager&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;region_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us-east-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_secret_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;SecretId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;secret_name&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SecretString&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;api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One function call.&lt;br&gt;
Sleep peacefully.&lt;/p&gt;


&lt;h1&gt;
  
  
  Tool #1 — Search Flights ✈️
&lt;/h1&gt;

&lt;p&gt;One thing that blew my mind about Strands:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your docstring is part of the prompt.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not for developers. For the model.&lt;/p&gt;

&lt;p&gt;The LLM reads your tool descriptions to decide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when to call them&lt;/li&gt;
&lt;li&gt;how to call them&lt;/li&gt;
&lt;li&gt;what arguments to pass&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good docstrings = smart agents.&lt;br&gt;
Bad docstrings = chaos.&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;from&lt;/span&gt; &lt;span class="n"&gt;strands&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt;

&lt;span class="nd"&gt;@tool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search_flights&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;departure_date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;return_date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;num_passengers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Search for available flights between cities.

    Returns:
    - airline
    - price
    - duration
    - stops
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_secret&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;travel-agent/flight-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;flights&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;airline&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;Thai Airways&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;price_per_person&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;510&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stops&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vibe&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;Direct. Fancy. Worth it.&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;airline&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;Indigo&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;price_per_person&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;440&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stops&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vibe&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;One stop. Still emotionally stable.&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yes, I added a &lt;code&gt;"vibe"&lt;/code&gt; field.&lt;/p&gt;

&lt;p&gt;No, the model doesn’t need it.&lt;/p&gt;

&lt;p&gt;Yes, it made me happy and my decision making, faster....&lt;/p&gt;




&lt;h1&gt;
  
  
  Tool #2 — Hotels That Aren’t Secretly Hostels 🏨
&lt;/h1&gt;

&lt;p&gt;You know what I hate?&lt;/p&gt;

&lt;p&gt;The hotel listing that says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"$89/night!"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And then somehow becomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$89 base price&lt;/li&gt;
&lt;li&gt;taxes&lt;/li&gt;
&lt;li&gt;resort fee&lt;/li&gt;
&lt;li&gt;“service charge”&lt;/li&gt;
&lt;li&gt;“convenience fee”&lt;/li&gt;
&lt;li&gt;emotional damage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My tool doesn’t do that.&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="nd"&gt;@tool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search_hotels&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;check_in&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;check_out&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;budget_per_night&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Search hotels within budget.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hotels&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&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;Veranda Resort&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;price_per_night&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;155&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;4.8&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;name&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;Pacific Club Hotel&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;price_per_night&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rating&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;4.5&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;note&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;No hidden fees. Unlike some websites.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Tool #3 — Weather Check 🌧️
&lt;/h1&gt;

&lt;p&gt;Because packing goggles for Northern lights was a character-building experience I never want again.&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="nd"&gt;@tool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;travel_month&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Get weather info and packing advice.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;avg_temp_celsius&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;conditions&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;Mild with dry heat&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;packing_must_haves&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;Light coloured t-shirts&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;beach flip flops&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;Umbrella&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;sunscreen&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tiny tool. Massive usefulness.&lt;/p&gt;




&lt;h1&gt;
  
  
  Tool #4 — Build the Itinerary 📋
&lt;/h1&gt;

&lt;p&gt;This is where everything comes together.&lt;/p&gt;

&lt;p&gt;Flights ✅&lt;br&gt;
Hotels ✅&lt;br&gt;
Weather ✅&lt;/p&gt;

&lt;p&gt;Now the agent can finally build a realistic itinerary.&lt;/p&gt;

&lt;p&gt;And yes — we save it to S3.&lt;/p&gt;

&lt;p&gt;Because my Notes app cannot be trusted.&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;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;

&lt;span class="nd"&gt;@tool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build_itinerary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration_days&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;interests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;budget_remaining&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Build a day-by-day itinerary.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="n"&gt;itinerary&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;destination&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;duration_days&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;interests&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;interests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;daily_plan&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;day&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;theme&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;Land and Eat Immediately&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;day&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;theme&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;Markets and Sunset Beach Walks&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="n"&gt;s3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;s3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put_object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;Bucket&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;travel-itineraries&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;thai-trip.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;itinerary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;itinerary&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Assemble the Agent
&lt;/h1&gt;

&lt;p&gt;Now the fun part.&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;from&lt;/span&gt; &lt;span class="n"&gt;strands&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;strands.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BedrockModel&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BedrockModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anthropic.claude-3-5-sonnet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;region_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us-east-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;SYSTEM_PROMPT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
You are a smart AI travel planner.

Always:
1. Search flights first
2. Search hotels second
3. Check weather
4. Build itinerary for given budget last
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="n"&gt;travel_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;system_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SYSTEM_PROMPT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="n"&gt;search_flights&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;search_hotels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;build_itinerary&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;travel_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Plan a 5-day Thailand trip for 2 people under $3000.
    &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;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Terminal Output
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Tool Call] search_flights
✓ Thai Airways selected

[Tool Call] search_hotels
✓ Veranda Resort selected

[Tool Call] get_weather
✓ Mild weather detected

[Tool Call] build_itinerary
✓ Saved to S3

━━━━━━━━━━━━━━━━━━
YOUR THAILAND TRIP
━━━━━━━━━━━━━━━━━━

Flights:   $1020
Hotel:     $775
Activities: $1200

TOTAL:     $2995 ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That &lt;code&gt;✅ Under budget&lt;/code&gt; hit different.&lt;/p&gt;




&lt;h1&gt;
  
  
  Production Lessons (Learned the Hard Way)
&lt;/h1&gt;

&lt;p&gt;Here’s the honest truth:&lt;/p&gt;

&lt;p&gt;Your local demo is &lt;strong&gt;not&lt;/strong&gt; your production system.&lt;/p&gt;

&lt;p&gt;Things that &lt;em&gt;will&lt;/em&gt; hurt you eventually:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hardcoded keys&lt;/td&gt;
&lt;td&gt;Secrets Manager&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infinite tool loops&lt;/td&gt;
&lt;td&gt;Max tool-call limits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No observability&lt;/td&gt;
&lt;td&gt;CloudWatch logging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Surprise Bedrock bill&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;max_tokens&lt;/code&gt; + alarms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero error handling&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;try/except&lt;/code&gt; everywhere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unsafe prompts&lt;/td&gt;
&lt;td&gt;Bedrock Guardrails&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  Add Logging with CloudWatch
&lt;/h1&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;logging&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;strands.handlers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CallbackHandler&lt;/span&gt;

&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;travel-agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LoggingHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CallbackHandler&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_tool_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;tool_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;tool_input&lt;/span&gt;
    &lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&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;Calling &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tool_name&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the difference between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“cool demo”&lt;/li&gt;
&lt;li&gt;and “actual software”&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  My Biggest Takeaways
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Your Docstrings Matter More Than You Think
&lt;/h2&gt;

&lt;p&gt;The model uses them as instructions.&lt;/p&gt;

&lt;p&gt;Treat them seriously.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Tool Order Matters
&lt;/h2&gt;

&lt;p&gt;Without ordering rules, my agent built itineraries before knowing hotel costs.&lt;/p&gt;

&lt;p&gt;Beautiful plans. Completely wrong budget.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Lower Temperature = Better Planning
&lt;/h2&gt;

&lt;p&gt;High temperature is great for creativity.&lt;/p&gt;

&lt;p&gt;Not for budgeting.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Persist Everything
&lt;/h2&gt;

&lt;p&gt;S3. DynamoDB. Databases.&lt;/p&gt;

&lt;p&gt;Conversation memory disappears eventually.&lt;/p&gt;

&lt;p&gt;Your data shouldn’t.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. The Demo → Production Gap Is Real
&lt;/h2&gt;

&lt;p&gt;Prototypes and demos are magical.&lt;/p&gt;

&lt;p&gt;Production systems are where reality shows up with a baseball bat.&lt;/p&gt;

&lt;p&gt;Build responsibly.&lt;/p&gt;




&lt;h1&gt;
  
  
  FAQ
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Do I Need a Strands Certification?
&lt;/h2&gt;

&lt;p&gt;Nope.&lt;/p&gt;

&lt;p&gt;Just:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Bedrock access&lt;/li&gt;
&lt;li&gt;Functions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s enough to start.&lt;/p&gt;




&lt;h2&gt;
  
  
  Can I Use Other Models?
&lt;/h2&gt;

&lt;p&gt;Absolutely.&lt;/p&gt;

&lt;p&gt;Swap Claude for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Llama&lt;/li&gt;
&lt;li&gt;Mistral&lt;/li&gt;
&lt;li&gt;Titan&lt;/li&gt;
&lt;li&gt;Anything available on Bedrock&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  My Agent Calls Tools in Weird Orders
&lt;/h2&gt;

&lt;p&gt;Fix your system prompt.&lt;/p&gt;

&lt;p&gt;Be explicit.&lt;/p&gt;

&lt;p&gt;LLMs love explicit instructions.&lt;/p&gt;




&lt;h1&gt;
  
  
  What’s Next?
&lt;/h1&gt;

&lt;p&gt;You can extend this into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 Memory with &lt;a href="https://aws.amazon.com/dynamodb/?trk=be7b5579-904d-4ab5-808c-91e14f22671e&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;DynamoDB&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 Slack bots&lt;/li&gt;
&lt;li&gt;🤖 Multi-agent orchestration&lt;/li&gt;
&lt;li&gt;🏭 &lt;a href="https://aws.amazon.com/bedrock/agentcore/?trk=be7b5579-904d-4ab5-808c-91e14f22671e&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Bedrock AgentCore&lt;/a&gt; deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s where things get really interesting.&lt;/p&gt;




&lt;p&gt;I started this journey with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;47 browser tabs&lt;/li&gt;
&lt;li&gt;one broken spreadsheet&lt;/li&gt;
&lt;li&gt;and travel-planning rage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I ended it with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a functioning AI travel agent&lt;/li&gt;
&lt;li&gt;a Thailand itinerary&lt;/li&gt;
&lt;li&gt;and a permanently closed spreadsheet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Honestly?&lt;/p&gt;

&lt;p&gt;Worth it.&lt;/p&gt;




&lt;p&gt;If you enjoyed this post:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❤️ Drop a reaction&lt;/li&gt;
&lt;li&gt;🔁 Share it with another developer&lt;/li&gt;
&lt;li&gt;👀 Follow for more AI agent tutorials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And if you build something cool with Strands SDK — I genuinely want to see it. Hit the comments box or reach out over &lt;a href="https://www.linkedin.com/in/royanannya/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;. I work for AWS and love building and exchanging views on AI!&lt;/p&gt;

&lt;p&gt;Happy building. ✈️&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aws</category>
      <category>machinelearning</category>
      <category>python</category>
    </item>
    <item>
      <title>Why your Production Retreival-Augmented-Generation (RAG) is failing and how to fix it?</title>
      <dc:creator>Anannya Roy Chowdhury</dc:creator>
      <pubDate>Tue, 17 Mar 2026 05:41:19 +0000</pubDate>
      <link>https://dev.to/royanannya/is-your-production-rag-giving-up-too-3pi0</link>
      <guid>https://dev.to/royanannya/is-your-production-rag-giving-up-too-3pi0</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.amazonaws.com%2Fuploads%2Farticles%2Fegdz58rmxrntau29fp1v.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.amazonaws.com%2Fuploads%2Farticles%2Fegdz58rmxrntau29fp1v.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why Most RAG Systems Fail in Production — and How Developers Can Fix It&lt;/p&gt;

&lt;p&gt;Over the past 2-3 years, many developers have built Retrieval-Augmented Generation (RAG) applications.&lt;/p&gt;

&lt;p&gt;The typical journey looks something like this:&lt;/p&gt;

&lt;p&gt;Step 1 - Connect a Vector Database&lt;br&gt;
Step 2 - Index documents&lt;br&gt;
Step 3 - Send retrieved context to an LLM&lt;br&gt;
Step 4 - Ship a chatbot&lt;/p&gt;

&lt;p&gt;At first, everything works. But once the system reaches real users, the issues start appearing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The assistant retrieves irrelevant documents&lt;/li&gt;
&lt;li&gt;Answers sometimes hallucinate&lt;/li&gt;
&lt;li&gt;Latency increases as the knowledge base grows&lt;/li&gt;
&lt;li&gt;The system becomes expensive to run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this sounds familiar, you’re not alone. Many RAG systems struggle when they move from &lt;strong&gt;prototype to production&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The interesting part is that the problem usually isn’t the language model. It’s the retrieval architecture. Let’s break down what’s actually happening and how you can improve it.&lt;/p&gt;


&lt;h1&gt;
  
  
  The “Simple” RAG Architecture
&lt;/h1&gt;

&lt;p&gt;Most tutorials introduce RAG using a simple pipeline.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Query
   ↓
Vector Search
   ↓
Top n Documents
   ↓
LLM Prompt
   ↓
Generated Answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach is great for learning the concept. But production workloads quickly expose some weaknesses.&lt;/p&gt;




&lt;h1&gt;
  
  
  Problem 1: Vector Search Isn’t Always Enough
&lt;/h1&gt;

&lt;p&gt;Vector similarity works well for semantic matching, but real-world queries are messy. A developer might ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“How do I rotate API credentials without downtime?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A pure vector search might retrieve documents related to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API authentication&lt;/li&gt;
&lt;li&gt;security guidelines&lt;/li&gt;
&lt;li&gt;credential policies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of them sound relevant. But none of them may actually contain the exact steps needed to answer the question.&lt;/p&gt;

&lt;p&gt;The result? The LLM tries to generate an answer anyway. This is where &lt;strong&gt;hallucinations&lt;/strong&gt; often begin.&lt;/p&gt;




&lt;h1&gt;
  
  
  Problem 2: Document Chunking Breaks Meaning
&lt;/h1&gt;

&lt;p&gt;Another hidden challenge is &lt;strong&gt;how documents are split before indexing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Many pipelines use fixed chunk sizes, such as 500 or 1000 tokens. But technical documentation often contains structured sections such as setup instructions, configuration steps, troubleshooting guides, Dos and Don'ts. When these sections are split incorrectly, the retrieval system might return &lt;strong&gt;only part of the information needed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Chunk A → explains the problem
Chunk B → shows the fix
Chunk C → provides the command
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the model receives only Chunk A, it lacks the context needed to answer correctly.&lt;/p&gt;




&lt;h1&gt;
  
  
  Problem 3: Real Questions Require Multiple Documents
&lt;/h1&gt;

&lt;p&gt;Users often ask questions that require combining information from several sources.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Does this authentication method support multi-region failover?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer may exist across multiple documents - authentication documentation, networking architecture guides, availability recommendations&lt;/p&gt;

&lt;p&gt;A simple RAG pipeline retrieves only a few chunks, which may not capture the full picture. This makes it difficult for the LLM to produce a reliable answer.&lt;/p&gt;




&lt;h1&gt;
  
  
  What Production RAG Systems Do Differently
&lt;/h1&gt;

&lt;p&gt;When teams build reliable RAG systems, they usually add additional layers to the retrieval pipeline. Instead of relying on a single search method, they combine multiple techniques.&lt;/p&gt;

&lt;p&gt;A more robust architecture might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Query
   ↓
Query Understanding
   ↓
Hybrid Retrieval (Vector + Keyword)
   ↓
Reranking
   ↓
Context Assembly
   ↓
LLM Generation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each layer helps solve a specific problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query understanding&lt;/strong&gt; improves recall by rewriting or expanding queries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hybrid retrieval&lt;/strong&gt; combines semantic similarity with keyword matching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reranking&lt;/strong&gt; ensures the most relevant documents appear at the top.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context assembly&lt;/strong&gt; structures the prompt so the LLM receives coherent information.&lt;/p&gt;

&lt;p&gt;Together, these improvements dramatically increase answer reliability.&lt;/p&gt;




&lt;h1&gt;
  
  
  How Developers Can Build Better RAG Systems
&lt;/h1&gt;

&lt;p&gt;Once your RAG system starts handling real workloads, infrastructure becomes just as important as model choice. Production applications must handle - large document collections, high query volumes, strict latency requirements.&lt;/p&gt;

&lt;p&gt;This is where services from &lt;strong&gt;Amazon Web Services&lt;/strong&gt; can simplify the architecture.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon OpenSearch Service&lt;/strong&gt; - Supports hybrid search, allowing you to combine vector similarity with keyword search in the same system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon Bedrock&lt;/strong&gt; - Provides access to foundation models without managing infrastructure, making it easier to experiment with different models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Lambda&lt;/strong&gt; - Helps orchestrate lightweight retrieval pipelines, enabling query preprocessing and reranking logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon S3&lt;/strong&gt; - Acts as a scalable document store for large knowledge bases and embedding pipelines.&lt;/p&gt;

&lt;p&gt;By combining these services, developers can focus on &lt;strong&gt;improving retrieval logic instead of managing infrastructure&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Key Takeaways for Developers
&lt;/h1&gt;

&lt;p&gt;If you’re building a RAG application, here are a few practical lessons that can save time:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Don’t rely on vector search alone&lt;/strong&gt; — combine semantic and keyword retrieval.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chunk documents intelligently&lt;/strong&gt; — align chunks with semantic structure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Introduce reranking&lt;/strong&gt; — it often improves answer accuracy significantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat RAG as a search problem&lt;/strong&gt; — not just an LLM problem.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most importantly, remember that a reliable GenAI system is built across multiple layers: retrieval, augmentation, orchestration, and generation.&lt;/p&gt;




&lt;h1&gt;
  
  
  What We’ll Explore Next
&lt;/h1&gt;

&lt;p&gt;In this post, we looked at &lt;strong&gt;why many RAG systems fail when deployed in production&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In the next article, we’ll walk through a &lt;strong&gt;step-by-step architecture for building a production-grade RAG system on AWS&lt;/strong&gt;, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hybrid retrieval pipelines&lt;/li&gt;
&lt;li&gt;document reranking strategies&lt;/li&gt;
&lt;li&gt;latency optimization techniques&lt;/li&gt;
&lt;li&gt;cost-efficient GenAI architectures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building GenAI applications today, understanding these patterns can make the difference between a prototype and a system that developers actually trust.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>systemdesign</category>
      <category>rag</category>
      <category>aws</category>
    </item>
  </channel>
</rss>
