END-TO-END CONVERSATIONAL AI AGENT BUILDS
Conversational AI & Washington State Ferries
An ongoing experiential project integrating large language models with conversational AI systems, rich multimodal content, and robust seagull management.

introduction
SAAB Story.
Fun fact:
I grew up on Bainbridge Island with my father, a daily walk-on commuter who took the ferry to Downtown Seattle 300 days a year.
Once a year or so, my father would have to run an errand in the city after work, so he’d drive his SAAB onto the ferry and head upstairs. When the ferry arrived in Seattle, he’d fold up his newspaper and walk off the ferry, just like he did the other 299 days a year.
The mortified screams usually came just before lunch: “Oh my God, I LEFT MY CAR ON THE FERRY.”
My father did this — twice.
It’s a weekly occurrence aboard Washington State Ferries, so they’re much more forgiving than say, your own children.
Twenty years later, when my father has difficulty finding a place to park, I still like to ask him “Should we just drive it onto a ferry and leave it there?”
While my father’s mistake was small, harmless, and lifelong fuel for mockery, it proves running on autopilot can sneak up on the best of us. Designers might recycle an inefficient flow, overlook a crucial synonym, or forget to address a critical pain point. And in conversational AI, that means users get stuck, annoyed, and, worst case —they sigh.
To keep my own work out of autopilot, I follow a few rules:
Sighs matter. So do eye rolls. I don’t want either from users, so I obsess about conversational efficiency.
Never ask twice. Don’t repeat information.
Don’t make users do the work an agent can handle.
Ruthlessly optimize the most fluid path from intent to solution. Period. Every time.
Finally, never leave users at a dead end. Always provide options and let the user determine when the conversation ends.

Live Conversational Agents.
google conversational agents
v2. Pure AI Architecture
A cutting-edge agent powered entirely by large language models for intent recognition and conversational routing. Custom Python functions handle complex terminal synonyms and time parsing, while advanced prompt engineering manages the conversational flow.
- Google Conversational Agents
- Multi-Agent Orchestration
- Zero Training Phrase Architecture
- Custom API Integrations
- Advanced Custom Python Functions
- Custom RAG Implementation
- Pincone Vector Database Integration
dialogflow cx + Playbooks
v1. The Rich Media Experience
The full conversational experience – rich content, voice integration, and multimodal output. Showcasing advanced DialogFlow CX & Playbooks capabilities with custom Node.js functions and Google Cloud integration.
- Multi-Agent Orchestration
- Dialogflow Playbooks
- Custom API Integrations
- Custom Python Functions
- Seagull Feeding and Noise Management
- External LLM Integrations (Claude, Gemini)
- Generative Voice Response from Vertex AI
the llm experience
v2. Pure AI Architecture
Upcoming integrations: Google Places API, local recommendations, ferry terminal wait times and traffic cameras.
Before the paint was dry on my first WSF agent build, I realized why Google was transitioning to Conversational Agents: LLMs can handle intents naturally, eliminating the often complex task of training phrase mapping. Why not let AI do the heavy lifting?
V2 runs entirely on large language models with a single orchestration Playbook handling intents. Native entity support wasn’t available yet, so I had Python manage terminal synonyms while micro prompts capture time expressions like ‘now,’ ‘ASAP,’ and ‘first available’.
This approach works well for an experimental build, with room to grow as Google’s conversational tools continue to evlove.
Feel free to interact with the live agent below. To start, try any of these four ways to ask for the exact same ferry going in the same direction. The agent should handle each one smoothly, while a Python function interjects to autocomplete your destination:
“Next Bainbridge ferry ….”
“Next ferry to Seattle …”
“When does the ferry leave Bainbridge?”
“Bainbridge departures.”
(Coming soon! Google Chirp 3 : HD real-time voice integration)
On mobile?
For the best mobile experience with this agent, click here.
dialogflow cx + Playbooks
v1. The Rich Media Experience
v1 showcases the full DialogFlow CX + Playbooks experience, including seagull-themed rich media content, voice integration, and multimodal interactions.
Aside from traditional training phrases, entities, and flows, v1 integrates Google Places API for terminal town services and features a proxy LLM API setup where Claude Sonnet 3.5 generates vessel histories and local recommendations for restaurants and attractions near ferry terminals.

Click the chat icon to explore v1!
THIS SEAGULL DARES YOU.
(Want sound? Click the speaker and refresh the agent!)
WASHINGTON STATE FERRIES
Surface Level Conversational Challenges.
Some challenges you can identify from day one. Others blindside you mid-build.
A constant mindset of “how can I make this more thoughtful and efficient” requires tackling unexpected challenges as they surface.
Challenges #1 and #2 below I planned before the build. Challenges #3 and #4 required creative pivots I hadn’t anticipated.
challenge #1: you say potato
There's a million ways to ask for the same ferry.
CHALLENGE
Users can refer to the exact same ferry departure in a dozen different ways (“ferry leaving Bainbridge” vs “ferry to Seattle” vs “Winslow to Downtown” – all referring to the same boat), creating complex NLU challenges and potential disambiguation loops.
SOLUTION
- Built extensive NLU training data to capture linguistic variations
- Evolved to strategic rich content chip placement for common requests
- Maintained conversational feel while guiding user input
RESULT
- Eliminated disambiguation loops and clarification exchanges
- Reduced conversation length for faster task completion
- Users reach information through guided selection vs. guessing correct phrasing
challenge #2: auto slot filling
Don't ask if you don't need to.
CHALLENGE
50% of Washington State ferry routes link single-destination terminals. If a user asks for single destination terminal schedule, how do I eliminate the need to ask for the opposite terminal?
SOLUTION
- Built intelligent slot-filling function that analyzes terminal type upon user input
- Auto-populates the destination for single-route terminals
- Dynamically generates contextual follow-up questions for multi-destination routes
- Function determines departure vs. arrival input, then only asks for missing information when appropriate
RESULT
- Eliminates unnecessary questions for obvious routes
- Helps tourists discover destination options they didn’t know existed
- Context-aware conversations that adapt to actual user needs
- Faster task completion through conditional logic
challenge #3: anticipate user needs
There's no place like home.
CHALLENGE
85% of ferry riders are commuters making same-day round trips, but requesting their return leg would require the user to re-enter their terminal information and sift through irrelevant departure times to build their return journey.
SOLUTION
- Created “Return Trip” function that auto switches terminal parameters and repeats API call for return options
- Built intelligent time filtering returning only departures after estimated arrival time
- Organized results into morning/afternoon/evening rich content accordian dropdowns for easier scanning
RESULT
- Transformed multi-step re-entry process into single click
- Eliminated cognitive load of filtering impossible departure times
- Optimized for the 85% use case while serving all users.
challenge #4: less is more
Trim the fat.
CHALLENGE
Washington State Ferry APIs return massive datasets, but conversational interfaces offer limited screen real estate. Dumping raw data can overwhelm users and kill engagement.
SOLUTION
- Prioritized display shows next 3 departures on same-day requests with countdown timer to nearest departure.
- Dynamic safety warnings for departures under 5 minutes to prevent speeding accidents
- Progressive disclosure using accordion dropdowns for additional options
- Context-sensitive organization: same-day by priority, future dates by time periods
- Applied same accordion approach to complex fare structures
RESULT
- Users see what they most likely need immediately
- Reduced cognitive load while preserving all options
- Built-in safety considerations for real-world usage
- Faster task completion for majority of users
Tech Stacks.
v1 Featuring:
Dialogflow CX + Playbooks, Google Cloud Platform, Gemini 2.5, Anthropic Sonnet 3.5, Vertex AI Text-to-Speech w/ SSML, Node.js, Imagen, Veo3, Google Places API
v2 Featuring:
Dialogflow CX + Playbooks (now Google Conversational Agents), Google Cloud Platform, Gemini 2.5, Anthropic Sonnet 3.5, Python, Pinecone, Github, Node.js, Imagen, Veo3, Google Places API