Skip to main content

google-adk

This skill should be used when the user asks to "build an agent with Google ADK", "use the Agent Development Kit", "create a Google ADK agent", "set up ADK tools", or needs guidance on Google's Agent Development Kit best practices, multi-agent systems, or agent evaluation.

Informações da origem

Repositório
the-perfect-developer/the-perfect-opencode
Última atividade na origem
2 de março de 2026 às 17:31
Idioma detectado do SKILL.md
inglês
Estrelas
12
Forks
2

Opções de instalação

Por padrão, está selecionado o prompt que primeiro revisa a origem. Você pode mudar para um comando direto ou baixar uma cópia local.

Revise os arquivos de origem

Leia o SKILL.md e os arquivos complementares exibidos pelo SkillsMP antes de decidir se vai instalar.

Explorador de arquivos
4 arquivos

Exibindo SKILL.md

SKILL.md
Instruções da origem · Visualização somente leitura
name
google-adk
description
This skill should be used when the user asks to "build an agent with Google ADK", "use the Agent Development Kit", "create a Google ADK agent", "set up ADK tools", or needs guidance on Google's Agent Development Kit best practices, multi-agent systems, or agent evaluation.
# Google Agent Development Kit (ADK) Google ADK is a Python framework for building, orchestrating, and evaluating LLM-powered agents. It provides structured patterns for single agents, multi-agent pipelines, custom tools, session state, safety controls, and evaluation. ## Core Concepts ### LLM Agent The fundamental building block is `LlmAgent` (aliased as `Agent`): ```python from google.adk.agents import LlmAgent agent = LlmAgent( name="research_agent", # unique, snake_case model="gemini-2.5-flash", description="Searches and summarizes research papers.", # used for multi-agent routing instruction="You are a research assistant. ...", # most critical field tools=[search_tool, summarize_tool], ) ``` Key fields: | Field | Purpose | |---|---| | `name` | Unique identifier; used for agent transfer | | `description` | Shown to parent agents for routing decisions | | `model` | Gemini model string (e.g. `gemini-2.5-flash`) | | `instruction` | System prompt — the most critical field | | `tools` | List of callable tools or `FunctionTool` instances | | `output_key` | Write agent response to `session.state[key]` | | `output_schema` | Pydantic model for structured JSON output | | `include_contents` | `'default'` or `'none'` (stateless agents) | ### Instructions Instructions are the most important configuration. Write them clearly: - Use markdown formatting (headers, bullets, code blocks) - Provide few-shot examples for complex behaviors - Guide tool selection explicitly: "Use `search_tool` when the user asks about..." - Inject state values with `{state_key}` or artifact values with `{artifact.name}` - Keep instructions specific and task-scoped; avoid generic prompts ```python instruction=""" You are a customer support agent for Acme Corp. ## Behavior - Greet the user by name using {user_name} - For billing questions, always use `lookup_invoice` before responding - Escalate to human if sentiment is negative three times in a row ## Examples User: "What's my balance?" Action: Call lookup_invoice(account_id="{account_id}") """, ``` ### Structured Output Use `output_schema` when a downstream step requires machine-readable JSON: ```python from pydantic import BaseModel class Report(BaseModel): title: str summary: str confidence: float agent = LlmAgent( ..., output_schema=Report, output_key="report", # writes JSON to session.state["report"] ) ``` Avoid combining `output_schema` with `tools` unless using Gemini 3.0+. ## Function Tools Python functions are automatically wrapped as tools. The docstring becomes the tool description — write it carefully. ```python def get_weather(city: str, units: str = "celsius") -> dict: """Get current weather for a city. Args: city: The city name to look up. units: Temperature units, either 'celsius' or 'fahrenheit'. Returns: dict with keys: temperature, condition, humidity. """ # implementation ... return {"temperature": 22, "condition": "sunny", "humidity": 60} ``` Rules: - **Required params**: typed, no default → model must supply them - **Optional params**: typed with default or `Optional[T] = None` - **Return type**: always `dict`; include a `"status"` key (`"success"` / `"error"`) - **`*args` / `**kwargs`**: ignored by ADK schema generation — avoid them - Make return values descriptive; the LLM reads them to decide next steps ### Passing Data Between Tools Use `session.state` with the `temp:` prefix for transient inter-tool data: ```python from google.adk.tools import ToolContext def store_result(data: str, tool_context: ToolContext) -> dict: """Store intermediate result for downstream tools.""" tool_context.state["temp:last_result"] = data return {"status": "success"} def read_result(tool_context: ToolContext) -> dict: """Read the stored intermediate result.""" value = tool_context.state.get("temp:last_result", "") return {"status": "success", "result": value} ``` ### Long-Running and Agent Tools ```python from google.adk.tools import LongRunningFunctionTool, AgentTool # Wrap async/long-running operations slow_tool = LongRunningFunctionTool(func=run_batch_job) # Invoke a sub-agent as an explicit tool call sub_agent_tool = AgentTool(agent=specialist_agent) ``` ## Multi-Agent Systems ### Hierarchy Compose agents using `sub_agents`. Each agent can have only one parent. ```python orchestrator = LlmAgent( name="orchestrator", model="gemini-2.5-flash", instruction="Route tasks to the appropriate specialist.", sub_agents=[research_agent, writer_agent, reviewer_agent], ) ``` ### Sequential Pipeline `SequentialAgent` runs sub-agents in order. Pass data via `output_key` → `{state_key}`: ```python from google.adk.agents import SequentialAgent pipeline = SequentialAgent( name="report_pipeline", sub_agents=[ LlmAgent(name="researcher", ..., output_key="research_notes"), LlmAgent(name="writer", instruction="Write a report based on: {research_notes}", output_key="draft"), LlmAgent(name="reviewer", instruction="Review this draft: {draft}"), ], ) ``` ### Parallel Pipeline `ParallelAgent` runs sub-agents concurrently. Use distinct `output_key` values to avoid race conditions: ```python from google.adk.agents import ParallelAgent parallel = ParallelAgent( name="multi_search", sub_agents=[ LlmAgent(name="web_searcher", ..., output_key="web_results"), LlmAgent(name="doc_searcher", ..., output_key="doc_results"), LlmAgent(name="db_searcher", ..., output_key="db_results"), ], ) ``` ### Loop Pipeline `LoopAgent` repeats until `max_iterations` is reached or a sub-agent raises `escalate=True`: ```python from google.adk.agents import LoopAgent refiner = LoopAgent( name="refinement_loop", max_iterations=5, sub_agents=[draft_agent, critic_agent], ) ``` ### LLM-Driven Transfer An LLM agent can transfer control by calling `transfer_to_agent(agent_name="...")`. For this to work reliably, every agent must have a clear `description` field. ## Session State Session state is a `dict` persisted across turns. Keys follow naming conventions: | Prefix | Scope | Example | |---|---|---| | *(none)* | Persistent across session | `"user_name"` | | `temp:` | Current turn only | `"temp:search_results"` | | `user:` | User-level across sessions | `"user:preferences"` | | `app:` | Application-level global | `"app:config"` | Access state from tools via `ToolContext`, from agents via `{state_key}` in instructions. ## Safety ### In-Tool Guardrails Use `ToolContext` to enforce policies deterministically before the LLM sees results: ```python def sensitive_lookup(query: str, tool_context: ToolContext) -> dict: """Look up sensitive records.""" if not tool_context.state.get("user:verified"): return {"status": "error", "message": "User not verified."} # proceed with lookup ... ``` ### Callbacks Use `before_tool_callback` to validate tool arguments before execution: ```python from google.adk.tools import ToolContext def validate_args(tool_name: str, args: dict, tool_context: ToolContext): if tool_name == "delete_record" and not args.get("confirm"): raise ValueError("delete_record requires confirm=True") agent = LlmAgent(..., before_tool_callback=validate_args) ``` ### Built-in Safety Configure Gemini's content filters via `generate_content_config`: ```python from google.genai.types import GenerateContentConfig, SafetySetting, HarmCategory, HarmBlockThreshold agent = LlmAgent( ..., generate_content_config=GenerateContentConfig( temperature=0.2, max_output_tokens=2048, safety_settings=[ SafetySetting( category=HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE, ) ], ), ) ``` ## Evaluation ADK supports two evaluation file formats: | Format | File | Use | |---|---|---| | Unit tests | `.test.json` | Single-turn, deterministic assertions | | Integration tests | `.evalset.json` | Multi-turn conversation flows | Run evaluations: ```bash # Launch interactive web UI adk web # CLI evaluation adk eval path/to/agent path/to/tests.evalset.json # pytest integration pytest tests/ -k "eval" ``` Key metrics: | Metric | Description | |---|---| | `tool_trajectory_avg_score` | Exact match on tool call sequence | | `response_match_score` | ROUGE-1 similarity to expected response | | `final_response_match_v2` | LLM-based semantic match | | `hallucinations_v1` | Detects fabricated facts | | `safety_v1` | Flags safety violations | ## Quick Reference **Install**: ```bash pip install google-adk ``` **Minimal agent**: ```python from google.adk.agents import LlmAgent agent = LlmAgent( name="my_agent", model="gemini-2.5-flash", instruction="You are a helpful assistant.", ) ``` **Run locally**: ```bash adk web # web UI adk run # CLI interactive adk api_server # REST API server ``` **Planners** (for complex reasoning): - `BuiltInPlanner` — uses Gemini's native thinking capability - `PlanReActPlanner` — plan→act→reason loop for non-thinking models ## Additional Resources - **`references/agent-design.md`** — Detailed LLM agent configuration, multi-agent patterns, and orchestration strategies - **`references/tools-and-sessions.md`** — Function tool patterns, session state management, artifacts, and memory - **`references/safety-and-evaluation.md`** — Safety architecture, guardrail patterns, and evaluation framework details
Ver no GitHub