Commit 7c79230
fix: prevent empty responses after load_skill
Merge #6226
# fix(skills): prevent empty responses after `load_skill`
Fixes #6225
## Problem
When an agent uses the skill tools, ADK appends a skill system instruction to the
prompt (`_build_skill_system_instruction` in
`src/google/adk/tools/skill_toolset.py`). The instruction does not tell the model
what to do *after* a `load_skill` call returns. With Gemini models we observed a
significant rate of **empty model responses** right after a `load_skill` call — the
model loads the skill and ends its turn with no visible output.
We saw this as a spike in empty responses in a Verizon production environment running
ADK + Gemini, most acutely for tool-heavy skills whose next correct action after
loading is to call more tools rather than reply.
## Change
`_build_skill_system_instruction` only — covers both `DEFAULT_SKILL_SYSTEM_INSTRUCTION`
and the per-toolset prefixed variant.
**Add rule 7** (continue-after-load guard), appended after the existing rule 6:
> 7. Loading a skill only retrieves its instructions; it does NOT complete your turn.
> After a `load_skill` call returns, continue in the SAME turn: call whatever tools
> the skill's steps require (search, data retrieval, render), then write your reply.
> Never end your turn with an empty response right after loading a skill.
No other rule is modified — rules 1–6 are left exactly as-is. The new rule uses the
`{prefix}` substitution like the other rules (`{p}load_skill`), so the prefixed system
instruction carries it too.
## Result
This is the exact change we validated in production: appending rule 7 (rules 1–6
unchanged) dropped the empty-response rate for Gemini after skill loading
substantially.
## Tests
Adds focused tests in `tests/unittests/tools/test_skill_toolset.py`:
- `test_system_instruction_marks_load_skill_as_non_terminal` — rule 7 present in the
default instruction.
- `test_prefixed_system_instruction_includes_continue_after_load_rule` — prefixed
variant carries rule 7 with the prefix.
Existing tests reference `DEFAULT_SKILL_SYSTEM_INSTRUCTION` by constant (not hardcoded
text), so they are unaffected.
## Backwards compatibility
Prompt-text-only, strictly additive change. No public API, signature, or existing-rule
change.
Co-authored-by: Yifan Wang <wanyif@google.com>
COPYBARA_INTEGRATE_REVIEW=#6226 from lwangverizon:fix/skill-load-empty-response 663b28b
PiperOrigin-RevId: 9405506041 parent 8c7fcd1 commit 7c79230
2 files changed
Lines changed: 23 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
97 | 97 | | |
98 | 98 | | |
99 | 99 | | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
100 | 105 | | |
101 | 106 | | |
102 | 107 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1758 | 1758 | | |
1759 | 1759 | | |
1760 | 1760 | | |
| 1761 | + | |
| 1762 | + | |
| 1763 | + | |
| 1764 | + | |
| 1765 | + | |
| 1766 | + | |
| 1767 | + | |
| 1768 | + | |
| 1769 | + | |
| 1770 | + | |
| 1771 | + | |
| 1772 | + | |
| 1773 | + | |
| 1774 | + | |
| 1775 | + | |
| 1776 | + | |
| 1777 | + | |
| 1778 | + | |
1761 | 1779 | | |
1762 | 1780 | | |
1763 | 1781 | | |
| |||
0 commit comments