Galle, LK--:--5/6 sites live

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.

29 May 20264 min read#Google ADK#Agents#Gemini#Workshop
Two Google ADK Patterns Every Agent Builder Should Know

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.

AgentPatternOne-line idea
University HelpdeskSingle agent + function toolsThe model decides when to look something up; Python decides what's true
Trip OrganizerSequentialAgent pipelineSix 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.
  • Literal type hints constrain every tool argument to valid values. If departments are Literal["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.

Output
PlaceFinder → DayPlanner → TravelPlanner → CostEstimator → PackingHelper → TripWriter

A 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, ota and dispatch.
  • The workshop's per-agent .env.example and 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

ExampleShell
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_agent

Python 3.10+, minimal dependencies, and ADK session data excluded from git. See the case study →