Two Google ADK Patterns Every Agent Builder Should Know
A single agent with honest, Literal-typed tools, and a SequentialAgent pipeline of six specialists — the workshop that became Nora Labs.

Before Nora Labs had eleven agents, it had two. I built them for a Build with AI workshop to teach Google's Agent Development Kit (ADK) to students who had never written an agent — and they turned out to be the clearest way I know to explain the two patterns that matter most.
| Agent | Pattern | One-line idea |
|---|---|---|
| University Helpdesk | Single agent + function tools | The model decides when to look something up; Python decides what's true |
| Trip Organizer | SequentialAgent pipeline | Six specialists pass work through shared session state |
Pattern 1 — one agent, honest tools
The helpdesk answers questions about courses, exam schedules, registration and campus facilities at a Sri Lankan university. Its rules:
- Four Python function tools look up real data, so the agent never guesses a date.
Literaltype hints constrain every tool argument to valid values. If departments areLiteral["ICT", "BIO", "PHY"], the model physically can't call the tool with"Computer Science". ADK turns the type hint into the function schema Gemini sees.- The prompt makes it ask one clarifying question when a request is ambiguous — "which department are you in?" before looking up an exam schedule — rather than guessing or asking five questions.
Try: "Hi, I'm a second-year IT student. What courses do I have this semester?"
The lesson: most "hallucination" problems in narrow assistants are really tool design problems. Constrain inputs, return facts, and let the model do language.
Pattern 2 — a pipeline of specialists
The trip organiser takes a one-line request and returns a complete Markdown brief: destination research, a day-by-day itinerary, transport and accommodation logistics, a budget and a packing list.
PlaceFinder → DayPlanner → TravelPlanner → CostEstimator → PackingHelper → TripWriterA SequentialAgent runs six LlmAgents in a fixed order. Each writes its result into session state under a known key; the next one's instruction reads it. No sub-agent calls a tool — they reason over what's already in state — which makes the data flow visible and easy to debug: when the budget is wrong, you look at CostEstimator's input and output, not at a 4,000-token monolithic prompt.
Try: "Plan a 5-day trip to Sigiriya and the Cultural Triangle in February for two people."
The honest limitation is in the README: PlaceFinder works from the model's training data. Adding google_search grounding is the documented next step.
From workshop to production
Both patterns went straight into Nora Labs:
- The helpdesk's "tools hold the truth" rule became Nora's design where every ADK agent calls the same Python functions as the deterministic fallback.
- The trip organiser's pipeline of specialists became Nora's orchestrator handing off between
search,itinerary,pricing,otaanddispatch. - The workshop's per-agent
.env.exampleand shared root config became Nora's three-backend switch (Vertex AI, Gemini API, deterministic).
Read the production version: Nora Labs — 11 agents on Cloud Run.
Running the workshop
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # add GOOGLE_API_KEY
adk web # pick helpdesk_agent or trip_organizer_agentPython 3.10+, minimal dependencies, and ADK session data excluded from git. See the case study →
Finished this one?
Progress is saved in this browser.


