<?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: Barmaley26</title>
    <description>The latest articles on DEV Community by Barmaley26 (@barmaley26).</description>
    <link>https://dev.to/barmaley26</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%2F4078814%2F2631025e-0643-447f-9249-30ccf934b338.png</url>
      <title>DEV Community: Barmaley26</title>
      <link>https://dev.to/barmaley26</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/barmaley26"/>
    <language>en</language>
    <item>
      <title>I built an AI agent that answers my villa booking emails — Gemini + Google ADK</title>
      <dc:creator>Barmaley26</dc:creator>
      <pubDate>Sat, 15 Aug 2026 10:44:04 +0000</pubDate>
      <link>https://dev.to/barmaley26/i-built-an-ai-agent-that-answers-my-villa-booking-emails-gemini-google-adk-4p98</link>
      <guid>https://dev.to/barmaley26/i-built-an-ai-agent-that-answers-my-villa-booking-emails-gemini-google-adk-4p98</guid>
      <description>&lt;p&gt;I host villas in Phuket. So I built an AI agent that answers my booking emails — with Gemini and Google ADK&lt;br&gt;
published: true&lt;/p&gt;

&lt;h2&gt;
  
  
  tags: googlecloud, ai, agents, gemini
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;This article was created for the purposes of entering the **All Things Agentic Hackathon&lt;/em&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The chore
&lt;/h2&gt;

&lt;p&gt;I'm a vacation-rental host in Phuket. Every week the same chain eats my hours:&lt;/p&gt;

&lt;p&gt;read a guest email → decode vague dates ("around Christmas", "del 29 de diciembre al 5 de enero") → check the calendar → do seasonal price math with discounts → write a warm reply → remember to place a hold → follow up.&lt;/p&gt;

&lt;p&gt;Every step is trivial. The chain is not. And one missed email is a lost $3,000+ booking.&lt;/p&gt;

&lt;p&gt;That's exactly the "messy, multi-step chore" the hackathon's Taskmaster track describes. So I built the agent I needed myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What HostPilot does
&lt;/h2&gt;

&lt;p&gt;A raw guest inquiry goes in — email or chat text, &lt;strong&gt;any language&lt;/strong&gt; — and the agent handles it end-to-end:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Extracts dates (including cross-year stays like Dec 29 → Jan 5), party size, guest name.&lt;/li&gt;
&lt;li&gt;Checks real availability against the bookings store.&lt;/li&gt;
&lt;li&gt;Builds a quote: high/low season rates, 10% long-stay discount, cleaning fee, min-stay and capacity validation.&lt;/li&gt;
&lt;li&gt;If the guest clearly wants to book — &lt;strong&gt;places a 48-hour hold in Firestore&lt;/strong&gt;. A real state change, not just text.&lt;/li&gt;
&lt;li&gt;Replies in the guest's own language (English, Spanish, Chinese in the demo) with a full price breakdown.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;My favorite moment: when requested dates conflict with an existing booking, the agent doesn't just say "unavailable" — it inspects the calendar, finds the nearest free windows on both sides, verifies and prices each one, and offers the guest two concrete alternatives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://hostpilot-406193234542.asia-southeast1.run.app" rel="noopener noreferrer"&gt;https://hostpilot-406193234542.asia-southeast1.run.app&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Code:&lt;/strong&gt; &lt;a href="https://github.com/Barmaley26/hostpilot" rel="noopener noreferrer"&gt;https://github.com/Barmaley26/hostpilot&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Video:&lt;/strong&gt; &lt;a href="https://youtu.be/LGkHqfLt3mY" rel="noopener noreferrer"&gt;https://youtu.be/LGkHqfLt3mY&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google ADK 2.6&lt;/strong&gt; defines the agent: one &lt;code&gt;Agent&lt;/code&gt;, five plain-Python tools (&lt;code&gt;get_property_info&lt;/code&gt;, &lt;code&gt;check_availability&lt;/code&gt;, &lt;code&gt;quote_price&lt;/code&gt;, &lt;code&gt;create_booking&lt;/code&gt;, &lt;code&gt;list_bookings&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 3.5 Flash&lt;/strong&gt; (via Vertex AI) does the reasoning, multilingual parsing and reply generation through function calling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Run&lt;/strong&gt; hosts the whole app (FastAPI + a one-screen "host inbox" UI), deployed straight from source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firestore&lt;/strong&gt; persists bookings across instances and restarts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;guest text → FastAPI → ADK Agent (gemini-3.5-flash)&lt;br&gt;
                         ├─ get_property_info&lt;br&gt;
                         ├─ check_availability ──► Firestore&lt;br&gt;
                         ├─ quote_price&lt;br&gt;
                         └─ create_booking (48h hold) ──► Firestore&lt;br&gt;
           ← reply in guest's language + full action log&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things that bit me
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. The model has no clock.&lt;/strong&gt; "December 20" was parsed as 2024. One line fixed year resolution, including cross-year stays:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
instruction = f"Today's date is {date.today().isoformat()}. ..."

2. Free tiers are not for agents. One agent turn = 5–6 generations (planning + tool calls + final reply). The Gemini API free tier (20 requests/day) died mid-testing. Switching to Vertex AI with ADC on Cloud Run solved it properly: no API keys in the container at all, billing through the project.

3. Autonomy needs guardrails in code, not in prompts. Every tool returns explicit ok/reason dicts; create_booking re-validates availability server-side. The model physically cannot double-book, no matter what it decides.

The lesson

Agents become reliable when the LLM plans and the tools decide. Everything that must be true — availability, price, capacity — is enforced in deterministic, testable Python. Everything that must be human — tone, language, judgment about intent — is left to Gemini.

The result: a guest writing in Chinese gets a correct, warm, fully-priced booking hold in Chinese — while the host sleeps.

Built solo with Gemini 3.5 Flash, Google ADK, Cloud Run and Firestore for the All Things Agentic Hackathon.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>automation</category>
      <category>gemini</category>
    </item>
  </channel>
</rss>
