- ADK skills use progressive disclosure and clear design patterns to load domain knowledge only when needed while keeping prompts lean.
- Multi-agent architectures with Router, Sequential, Loop and Parallel workflows let specialized agents collaborate on complex tasks.
- Real-world stacks like AgentKit 2.0 and community skills enable modular, secure and auditable AI systems across the software lifecycle.
- Local ADK web setups on macOS, Linux and Windows make it easy to prototype, test and refine skilled agents against real APIs and data.

Intelligent agents built with an Agent Development Kit (ADK) are quickly becoming the backbone of modern AI-powered applications, going far beyond single-shot chatbots that just answer questions. With the right skills system, these agents can reason, plan, call tools, collaborate with other agents and even refine their own work in loops, all while keeping token usage and latency under control thanks to progressive disclosure techniques.
In this in-depth guide you’ll walk through how to design, structure and orchestrate ADK agents with skills, from the basic single agent up to multi-agent workflows running in sequence, in loops and in parallel. You’ll also see how real-world stacks like Google’s ADK codelabs, community skills, and orchestration frameworks such as AgentKit 2.0 use patterns like Router, SequentialAgent, LoopAgent and ParallelAgent, plus how companies like Q2BSTUDIO combine this with cloud platforms and cybersecurity to ship production-ready systems.
Why ADK agents with skills matter for modern software teams
The explosion of AI in software development has pushed teams to look for ways to encapsulate expertise and workflows into reusable, composable units. ADKs answer this need by letting you package behavior, domain rules and tools into agents that can be reused across projects, teams and even products.
At the heart of this approach are Agent Skills, which are self-contained knowledge modules that an agent can load on demand. Instead of dumping every guideline and rule into a single massive prompt, skills apply a progressive disclosure architecture: instructions, assets and scripts are revealed only when needed, which keeps context lean and performance high even when you have hundreds of skills installed.
This efficiency is crucial in a world where token budgets, latency and compute costs are real constraints. Loading every style guide, API spec and operating rule into a single prompt doesn’t scale. Skills let you keep “cold” knowledge on disk (or in repositories) and pull it into the agent’s context only when a particular capability is relevant.
Companies like Q2BSTUDIO leverage this model to build tailored AI systems for enterprises, weaving together business intelligence, domain knowledge and modern cybersecurity practices. That way, agents are not only capable and context-aware, but also hardened against common attack vectors in today’s threat landscape.
Understanding the progressive disclosure architecture of ADK skills
ADK-style skills typically follow a three-tier loading model that keeps agent context focused while still allowing deep domain specialization whenever required. You can think of it as a staged pipeline for knowledge:
Level 1 – Discovery: when a conversation starts, the agent only sees a catalog of available skills: their names and short descriptions. Nothing heavy is loaded yet. This is enough for the agent to decide which skill might be relevant to the user’s request.
Level 2 – Instructions: once a skill is deemed a match, the agent reads its SKILL.md or equivalent instruction file. This document provides detailed guidance, patterns and rules for that skill, and is pulled into the model context only when necessary.
Level 3 – Resources: bulky assets such as large schemas, long checklists, scripts or extended docs remain on the filesystem as references
and are retrieved on demand only if the skill specifically points to them. The agent reads or executes these resources as needed, rather than having them always in the main prompt.
This pattern is central to frameworks like AgentKit 2.0 and Antigravity-based setups. You can install skills directly into compatible agents (Claude Code, Cursor, Antigravity and others) using commands such as npx add-skill vercel-labs/agent-skills, which clone the skill repositories, place them into the correct directories and make them discoverable without manually editing prompts.
Design patterns for structuring ADK skills
Writing a new skill from scratch is often less about tooling and more about content design. The ADK spec usually tells you how to structure the package (frontmatter in YAML, references/, assets/, scripts/ directories and so on), but it doesn’t tell you how to write the actual instructions. That’s where reusable design patterns come into play.
Practitioners who have built dozens of skills report that a handful of structural patterns cover most real-world use cases. Five of the most useful ones are:
Tool Wrapper: this pattern encapsulates the conventions and best practices of a given library or platform into a skill. The instructions describe the rules to follow, while references/ holds the official documentation. There are usually no templates or scripts; the point is to give the agent a “mental model” of a tool like FastAPI, React or Postgres.
Generator: here, the skill produces a consistent structured output using templates stored in assets/. Examples include API docs, commit messages, technical reports or changelogs. Instructions define quality rules, while templates define the shape of the output, so you get repeatable formats with different content each time.
Reviewer: this pattern separates what to check from how to check it. A checklist file in references/ lays out the items to verify (security, style, architecture, etc.), while the instructions define the review protocol: grouping findings by severity, demanding justification, suggesting fixes. Swap the checklist file and you effectively get a whole new reviewer without rewriting the skill.
Interview (Inversion): instead of acting immediately, the skill first interviews the user through structured questions in phases, with gates like “do not start building until all phases are complete”. This prevents the agent from making big assumptions and forces it to clarify goals and constraints before generating detailed outputs.
Pipeline: this pattern encodes multi-step workflows with explicit gates across steps, such as “do not proceed to step 3 until the user confirms”. It’s more complex than the others, but it’s the only one that reliably prevents agents from skipping validation stages. Pipeline skills can incorporate Reviewer steps, Generator outputs or Interview phases inside the same flow.
Real-world skills from Google, Vercel and Supabase often combine two or more of these patterns per skill. For instance, a governance skill might interview the user about project constraints, then run a review pipeline using distinct checklists and generate a governance report with a template-driven Generator.
From single agents to multi-agent systems with ADK
Once you understand how skills package knowledge, the next step is to see how ADK agents orchestrate that knowledge in workflows. Google’s official ADK codelabs are an excellent reference: they walk you from a basic single agent through tools, memory and multi-agent coordination, all in practical Colab notebooks.
The journey starts with your first agent built with a Runner. In the codelab, you define a day_trip_agent whose mission is to craft a one-day travel itinerary honoring user preferences and budget. Three components illustrate the general ADK interaction model:
The Agent is the “brain” defined by its instructions, the underlying model (for example Gemini) and the tools it can call. In the example, the agent has detailed guidelines plus access to Google Search.
The Session functions as the conversational memory store, holding the full history of user messages and agent responses. Reusing the same session object keeps context alive across turns.
The Runner coordinates execution by taking an agent and a session, processing each user query and returning the answer
while updating the session along the way. Utility helpers like run_agent_query() encapsulate this loop so you can easily trigger agents through tests or UI integrations.
Reading through this first example shows how good instructions connect directly to user prompts. A test query might ask for a “budget-friendly” and “relaxing” day trip, and because the instructions emphasize being cost-conscious, the agent reliably weaves budget considerations into its answers.
Connecting custom tools to your ADK agents
Agents become truly powerful once they can call your own APIs and internal services rather than just generic tools like web search. ADKs make this straightforward by turning normal functions into tools based on their signatures and documentation strings.
In the codelabs, a simple example uses a Python function that calls a real-time weather API. A function like get_live_weather_forecast(location: str) fetches current data from a public weather service and returns structured information, say temperature and conditions in a dictionary.
The crucial part is the docstring. The ADK parses the function’s documentation string to understand what the tool does, what arguments it takes and what it returns. The language model reads that description and decides when and how to call the tool during reasoning.
To wire the tool into an agent, you simply pass it as part of the tools list during initialization, for example tools=[get_live_weather_forecast]. The instructions of the weather_agent can then explicitly tell the model to call this tool before proposing outdoor activities.
During tests, prompts like “I want to hike near Lake Tahoe, what’s the weather like?” directly trigger the tool, because the agent’s mission and instructions insist on using the live forecast before recommending a plan. This pattern generalizes to your own APIs: inventory, pricing, CRM, analytics or any backend you can wrap as a function.
The Agent-as-a-Tool pattern: building teams of specialists
Instead of stuffing every responsibility into a single monolithic agent, ADK encourages you to create a team of smaller experts. The key is the Agent-as-a-Tool pattern, where one agent can call another agent as if it were just another tool.
A typical demonstration in the codelabs builds a layered travel planning system:
Specialist agents handle narrow domains: a food_critic_agent that only suggests restaurants, a db_agent that queries hotel data, and a concierge_agent that acts as a polite assistant for user-facing interactions.
The concierge itself treats the food critic as a tool, delegating restaurant selection to the critic and then rephrasing the result in more user-friendly language.
At the top sits an orchestrator agent, such as trip_data_concierge_agent, whose job is to understand the user’s overall request and decide which specialist to invoke through dedicated wrapper functions like call_db_agent and call_concierge_agent.
When you run a query like “find me a hotel and a nearby restaurant”, logs from the tools show a chain of delegation: the orchestrator calls the DB agent for hotels, then the concierge agent for restaurant advice, and the concierge in turn calls the food critic. Each agent stays focused on its own domain while the orchestrator handles composition.
This approach aligns closely with how AgentKit 2.0 structures its 16 specialized agents across frontend, backend, security, testing and infrastructure. Each agent ships with domain-specific skills (React best practices, database setup, security audits, deployment flows and more), and an orchestrator composes them to achieve larger goals like “build and deploy a user authentication module”.
Giving agents memory: sessions and adaptive planning
To feel truly intelligent, an agent has to remember context across multiple turns, adapting plans in response to feedback instead of treating every message as a fresh start. This is where sessions and memory management come in.
In the ADK codelab, a multi-day trip planner agent illustrates the difference between proper and broken memory. A function like create_multi_day_trip_agent() sets up an agent whose instructions emphasize gradual planning, remembering choices and responding thoughtfully to corrections.
An adaptive demo reuses a single session object for several turns:
Turn 1: the user asks for a two-day trip plan and the agent proposes day 1 activities.
Turn 2: the user says they’re not into castles. Because the session holds the earlier itinerary, the agent knows which part to adjust and proposes an alternative for that segment while keeping other details intact.
Turn 3: the user confirms the change and asks for the next steps, so the agent continues with day 2 planning aware of all previous context.
A contrasting “failure” demo creates a fresh session for each turn. The agent answers the first question correctly, but when the user later refers to “day 2”, the new session has no history and the agent essentially has amnesia, unable to tie the request back to the earlier plan.
The takeaway is simple but fundamental: continuous conversations demand continuous sessions. For production systems, you need to persist and retrieve session state across API calls, devices and sometimes even users, especially when workflows span days or weeks.
The Router agent: directing queries to the right specialist
As your catalog of agents and skills grows, you need a mechanism to dispatch each incoming request to the right expert. That’s the job of a Router agent, a small but crucial component in multi-agent architectures.
A router’s main responsibility is classification rather than answering user questions directly. Its instructions usually tell it to read a user query and output only the name of the best-suited agent (or workflow) for that job.
In the multi-agent sections of the codelab, the router chooses between various domain agents such as a day trip planner, a foodie agent or a transportation agent. The execution function first asks the router for a route, then uses simple conditional logic to invoke the correct specialist based on the router’s answer.
This pattern aligns with how multi-agent orchestration is described in AgentKit 2.0. There, an orchestrator agent receives a high-level goal, delegates schema design to a database agent, form scaffolding to a frontend agent, runs a security review, then hands off to a deployment agent and finally aggregates diffs and URLs into a coherent summary for the user.
SequentialAgent: orchestrating ordered multi-step workflows
Some tasks naturally break down into ordered stages where output from one step feeds into the next. For example, “find the best sushi in Palo Alto, then tell me how to get there” clearly requires first a discovery step and then a navigation step.
ADKs offer a specialized workflow agent, often called SequentialAgent, to manage these chains cleanly. Instead of writing manual orchestration logic, you define a list of sub-agents and shared state keys, and the framework takes care of sequencing and data passing.
In the codelab example, the foodie agent is refactored to emit its result under an output_key like "destination". The transportation agent’s instructions then include a placeholder such as {destination} which the ADK automatically fills with the stored value from shared state.
The overall workflow agent, say find_and_navigate_agent, is configured as a SequentialAgent with sub-agents in a fixed order like [foodie_agent, transportation_agent]. When invoked, it behaves like a single agent from the caller’s perspective while internally coordinating the two steps and managing the shared state.
This approach drastically simplifies orchestration code. Conditional trees and ad-hoc data wiring disappear, replaced by declarative definitions of sub-agents and keys. It also makes workflows easier to test and extend, since each sub-agent remains modular and can be reused in other chains.
LoopAgent: iterative refinement with planner, critic and refiner
Many real-world problems benefit from iterative improvement rather than single-shot answers. Think of drafting a plan, critiquing it, refining it and repeating until some quality bar is met. Looping workflows address this need.
ADKs capture this pattern with a LoopAgent, a workflow agent that repeatedly runs a sequence of sub-agents until an exit condition is triggered. This is ideal for “perfectionist” agents that need to self-review and fix their own outputs based on formal criteria.
A classic loop setup includes three roles: a planner agent that produces an initial plan, a critic agent that evaluates the plan against constraints and a refiner agent that edits or rewrites the plan based on the critic’s feedback.
The loop definition wires these roles into a cycle with a maximum number of iterations to avoid infinite loops, for example max_iterations=3. Each pass, the critic decides whether the plan is acceptable; if not, the refiner generates a revised version and the loop continues.
Exiting the loop usually involves a specialized tool, such as exit_loop, that the refiner calls when the critic’s evaluation becomes positive. At that point, the final validated plan is returned to the user or passed to downstream agents.
This pattern is particularly useful in domains like architecture design, security review or content creation, where one-shot answers are rarely good enough and built-in critique cycles can lift average quality substantially.
ParallelAgent: speeding up work with concurrent sub-agents
When different parts of a user’s request are independent, running them sequentially wastes time. For example, “find a museum, a concert and a great restaurant for tonight” doesn’t require each search to wait for the others.
Parallel workflows solve this by launching multiple specialists at the same time. In ADKs, a ParallelAgent runs a list of sub-agents concurrently, then merges their results through shared state and a final synthesis step.
A typical setup defines three domain-specific agents like museum_finder, concert_finder and restaurant_finder, each with its own output_key in the shared state. The parallel agent executes all three in parallel, so the total time is close to the slowest single agent rather than the sum of all three.
After these agents complete, a synthesis agent reads placeholders such as {museum_result}, {concert_result} and {restaurant_result} from the shared state, then crafts a coherent, user-friendly answer blending all three tracks of information.
This pattern mirrors the “parallel execution” benefits described in AgentKit 2.0’s orchestration flows. Independent sub-agents deliver their work concurrently, isolated by their own skills so they don’t contaminate each other’s context, while the orchestrator maintains overall fault tolerance and auditability.
AgentKit 2.0, community skills and modular agent orchestration
AgentKit 2.0 showcases what a mature ecosystem of ADK skills and agents looks like in practice. It ships with 16 specialized agents spanning frontend, backend, security, testing and infrastructure, each pre-equipped with domain skills so they can operate autonomously on complex subtasks.
More than 40 domain-focused skills are bundled out of the box, covering recurring areas such as authentication flows, database configuration, real-time deployments and performance monitoring. These are precisely the parts of modern stacks that usually demand the most engineering time.
On top of that, the wider community contributes more than 1,000 maintained skills. Together with frameworks like Agent MD, these skills let agents interpret detailed operational rules and apply them consistently across large, intricate codebases and multi-layer deployments.
The core philosophy is modular, agent-driven development: instead of one mega-agent trying to do everything, you assemble a team of narrow specialists and orchestrate them. Each agent only loads the skills it needs for its domain, matching the same progressive disclosure model used at the skill level.
Typical orchestration flows follow a clear pattern: an orchestrator agent receives a top-level goal, hands off database design to a DB agent (using a schema skill), sends UI scaffolding to a frontend agent (with React best practices skills), runs a security agent for audits and finally asks a deployment agent to push to infrastructure like InForge. Throughout the process, the orchestrator collects results, retries failing steps when necessary and logs interactions for audit.
This architecture not only improves performance and reliability, it also scales as community skills grow into the thousands. You no longer need a single “know-it-all” agent; instead, you rely on a composed team where each member stays sharp within its own skill set.
Hands-on: running ADK web agents locally on macOS, Linux and Windows
All these concepts become much clearer when you spin up a real ADK-powered agent on your own machine. The ADK Web setup provided in example repositories allows you to run a day-trip planning agent locally with a simple web interface.
Before starting, you’ll need a few prerequisites: Python 3.8 or later (3.9+ is recommended), a Google AI Studio API key and an internet connection. For recent Python versions you can install google-adk==1.5.0, while Python 3.8 users should use a compatible version like google-adk==0.3.0.
The basic flow for macOS and Linux begins by cloning the repository and setting up a virtual environment. After running git clone and cd into the project, you can either execute an automatic script like ./setup_venv.sh (after granting execute permissions) or manually create and activate a virtual environment with python3 -m venv .adk_env and source .adk_env/bin/activate, followed by pip install -r requirements.txt.
An important step is setting environment variables via a .env file in the agent/ directory. You create this file, open it in an editor and add lines such as GOOGLE_GENAI_USE_VERTEXAI=FALSE and GOOGLE_API_KEY=your_actual_api_key_here, replacing the placeholder with your real API key. Skipping this step will prevent the agent from calling the underlying models.
Once the environment is active, you simply run adk web to start the local web interface. The terminal shows a URL, usually http://localhost:8000, where you can open your browser, pick the agent option from a dropdown and start chatting with the day-trip planner. When finished, you deactivate the virtual environment with the deactivate command.
Windows users follow a very similar pattern using Command Prompt or PowerShell. After cloning the repository and changing into it, you can run a convenience script like setup_venv.bat or create a venv manually with python -m venv .adk_env and activate it via .adk_env\Scripts\activate in Command Prompt or .adk_env\Scripts\Activate.ps1 in PowerShell.
The .env file on Windows lives in the same agent\ directory, created for example with type nul > agent\.env and edited using Notepad. You then add the same key-value pairs to configure Google AI access. If you hit execution policy issues in PowerShell, a command like Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser resolves them for local scripts.
After installing dependencies and configuring your environment variables, running adk web gives you the same browser-based agent experience on Windows as on macOS or Linux, with the ability to deactivate the environment at any time using deactivate.
Putting everything together, ADK agents with skills, progressive disclosure and multi-agent orchestration offer a powerful way to build scalable, secure and highly specialized AI systems that align with real software workflows. By structuring skills with solid design patterns, wiring agents to your own tools and APIs, leveraging Router, Sequential, Loop and Parallel agents and running setups locally or in the cloud, teams can move from simple chatbots to robust AI collaborators that work alongside developers, analysts and operators in day-to-day work.