From adk-streaming
Use this skill to enable tool calls inside an ADK 2.0 streaming session so an agent can run tools mid-conversation without breaking the audio / video stream. Triggers on: "ADK streaming tools", "tool call during live ADK", "ADK BIDI tools", "real-time tool use ADK", "ADK Live API tools", "streaming tool execution", "function call mid-stream". Generates streaming-aware tool definitions and the BIDI streaming mode wiring.
How this skill is triggered — by the user, by Claude, or both
Slash command
/adk-streaming:bidirectional-tool-streamingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Use tools inside a Gemini Live streaming session so the agent can fetch data, run actions, or call APIs without interrupting the live audio/video stream.
Use tools inside a Gemini Live streaming session so the agent can fetch data, run actions, or call APIs without interrupting the live audio/video stream.
from google.adk.agents import LlmAgent
from google.adk.streaming import StreamingMode
def book_appointment(date: str, time: str, name: str) -> dict:
"""Book an appointment.
Args:
date: ISO date (YYYY-MM-DD).
time: 24-hour time (HH:MM).
name: Patron name.
Returns:
{'confirmation_id': str, 'success': bool}.
"""
return {"confirmation_id": "APT-1234", "success": True}
root_agent = LlmAgent(
name="voice_concierge",
model="gemini-2.5-flash-live",
instruction=(
"Book appointments by voice. Confirm date/time/name verbally before booking. "
"Use the book_appointment tool only after the user confirms."
),
streaming_mode=StreamingMode.BIDI,
response_modalities=["AUDIO"],
tools=[book_appointment],
)
ADK handles streaming tool calls automatically — Gemini Live signals a tool call, ADK executes, returns the result inline, and the agent continues speaking.
For long tools, stream partial results:
from typing import AsyncGenerator
async def deep_search(query: str) -> AsyncGenerator[dict, None]:
"""Search and stream results as they arrive."""
yield {"status": "searching"}
async for hit in search_api.stream(query):
yield {"hit": hit.title, "url": hit.url}
yield {"status": "complete"}
The agent receives each yield and can speak progress updates.
If the user interrupts, ADK cancels in-flight tool calls:
from google.adk.callbacks import on_tool_cancelled
@on_tool_cancelled
async def cleanup(ctx, tool_name, args):
print(f"Tool {tool_name} cancelled mid-execution. Cleaning up.")
Gemini Live can issue multiple tool calls in parallel; ADK runs them concurrently:
LlmAgent(
...,
tools=[get_weather, get_stocks, get_news],
parallel_tool_calls=True,
)
tool-confirmation-hitl to require approval for streaming tool callsaudio-streaming-agent for the underlying voice setupCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub healthcare-ai-consulting-llc/adk-2-toolkit --plugin adk-streaming