ec2b666284
Continuous Integration / Pre-commit Linter (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.10) (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.11) (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.12) (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.13) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.10) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.11) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.12) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.13) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.14) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.10) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.11) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.12) (push) Has been cancelled
Copybara PR Handler / close-imported-pr (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.13) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.14) (push) Has been cancelled
116 lines
3.4 KiB
Markdown
116 lines
3.4 KiB
Markdown
# ADK Skills Agent Sample
|
|
|
|
## Overview
|
|
|
|
This sample demonstrates how to use **Skills** and the **SkillToolset** in ADK.
|
|
|
|
Skills are specialized folders of instructions, reference materials, assets, and scripts that extend an agent's capabilities. The agent can dynamically search for, load, and run resources/scripts from these skills depending on the user's query.
|
|
|
|
This sample showcases:
|
|
|
|
1. **Programmatic Skills**: Creating a skill directly within Python (`support-hours-skill`).
|
|
1. **Directory-based Skills**: Loading a skill from a directory structure (`weather-skill`).
|
|
1. **Skill Metadata & Additional Tools**: Declaring that a skill requires specific tools, making them dynamically active only when that skill is loaded.
|
|
1. **Script Execution**: Executing a Python script inside a skill using a code executor.
|
|
|
|
## Sample Inputs
|
|
|
|
- `What are the support hours for Tokyo?`
|
|
|
|
*Triggers the support-hours-skill which checks get_timezone and reads support_policy.txt*
|
|
|
|
- `What is the current weather in SF?`
|
|
|
|
*Loads weather-skill and reads weather_info.md reference file*
|
|
|
|
- `Can you fetch the current humidity for Mountain View?`
|
|
|
|
*Executes scripts/get_humidity.py via run_skill_script*
|
|
|
|
- `What is the wind speed in Seattle?`
|
|
|
|
*Loads weather-skill which dynamically activates and calls get_wind_speed*
|
|
|
|
## Graph
|
|
|
|
```mermaid
|
|
graph TD
|
|
Agent[Agent: skills_agent] --> Toolset[SkillToolset]
|
|
Toolset --> Skill1[support-hours-skill]
|
|
Toolset --> Skill2[weather-skill]
|
|
|
|
Skill1 --> Resource1["Resource: support_policy.txt"]
|
|
Skill1 --> Tool1["Dynamic Tool: get_timezone"]
|
|
|
|
Skill2 --> Resource2["Resource: weather_info.md"]
|
|
Skill2 --> Script1["Script: get_humidity.py"]
|
|
Skill2 --> Tool2["Dynamic Tool: get_wind_speed"]
|
|
```
|
|
|
|
## How To
|
|
|
|
### 1. Declaring a Skill Programmatically
|
|
|
|
You can declare a skill in Python code using `models.Skill`:
|
|
|
|
```python
|
|
from google.adk.skills import models
|
|
|
|
support_hours_skill = models.Skill(
|
|
frontmatter=models.Frontmatter(
|
|
name="support-hours-skill",
|
|
description="A skill to check customer support hours...",
|
|
metadata={"adk_additional_tools": ["get_timezone"]},
|
|
),
|
|
instructions="Step 1: Look up the timezone... Step 2: Read 'references/support_policy.txt'...",
|
|
resources=models.Resources(
|
|
references={
|
|
"support_policy.txt": "Customer support is available Monday through Friday...",
|
|
},
|
|
),
|
|
)
|
|
```
|
|
|
|
### 2. Loading a Skill from a Directory
|
|
|
|
Skills can be organized as folders. Each folder must contain a `SKILL.md` file. The folder structure typically looks like:
|
|
|
|
```
|
|
weather-skill/
|
|
├── SKILL.md
|
|
├── references/
|
|
│ └── weather_info.md
|
|
└── scripts/
|
|
└── get_humidity.py
|
|
```
|
|
|
|
To load a skill from a directory:
|
|
|
|
```python
|
|
from google.adk.skills import load_skill_from_dir
|
|
|
|
weather_skill = load_skill_from_dir(
|
|
pathlib.Path(__file__).parent / "skills" / "weather-skill"
|
|
)
|
|
```
|
|
|
|
### 3. Registering a SkillToolset
|
|
|
|
Use `SkillToolset` to bundle all your skills and any dynamic tools. Then pass this toolset to your agent's `tools` list:
|
|
|
|
```python
|
|
from google.adk.tools.skill_toolset import SkillToolset
|
|
from google.adk.code_executors.unsafe_local_code_executor import UnsafeLocalCodeExecutor
|
|
|
|
my_skill_toolset = SkillToolset(
|
|
skills=[support_hours_skill, weather_skill],
|
|
additional_tools=[GetTimezoneTool(), get_wind_speed],
|
|
code_executor=UnsafeLocalCodeExecutor(),
|
|
)
|
|
|
|
root_agent = Agent(
|
|
name="skills_agent",
|
|
tools=[my_skill_toolset],
|
|
)
|
|
```
|