mirror of
https://github.com/EvolutionAPI/adk-python.git
synced 2025-07-14 01:41:25 -06:00

Add a `task_completed` function to the agent so when a model finished the task, it can send a signal and the program knows it can go to next agent. This cl include: * Implements the `_run_live_impl` in `sequential_agent` so it can handle live case. * Add an example for sequential agent. * Improve error message for unimplemented _run_live_impl in other agents. Note: 1. Compared to non-live case, live agents process a continuous streams of audio or video, so it doesn't have a native way to tell if it's finished and should pass to next agent or not. So we introduce a task_compelted() function so the model can call this function to signal that it's finished the task and we can move on to next agent. 2. live agents doesn't seems to be very useful or natural in parallel or loop agents so we don't implement it for now. If there is user demand, we can implement it easily using similar approach. PiperOrigin-RevId: 758315430
95 lines
3.0 KiB
Python
95 lines
3.0 KiB
Python
# Copyright 2025 Google LLC
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import random
|
|
|
|
from google.adk.agents.llm_agent import LlmAgent
|
|
from google.adk.agents.sequential_agent import SequentialAgent
|
|
from google.genai import types
|
|
|
|
|
|
# --- Roll Die Sub-Agent ---
|
|
def roll_die(sides: int) -> int:
|
|
"""Roll a die and return the rolled result."""
|
|
return random.randint(1, sides)
|
|
|
|
|
|
roll_agent = LlmAgent(
|
|
name="roll_agent",
|
|
description="Handles rolling dice of different sizes.",
|
|
model="gemini-2.0-flash-exp",
|
|
instruction="""
|
|
You are responsible for rolling dice based on the user's request.
|
|
When asked to roll a die, you must call the roll_die tool with the number of sides as an integer.
|
|
""",
|
|
tools=[roll_die],
|
|
generate_content_config=types.GenerateContentConfig(
|
|
safety_settings=[
|
|
types.SafetySetting( # avoid false alarm about rolling dice.
|
|
category=types.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
|
|
threshold=types.HarmBlockThreshold.OFF,
|
|
),
|
|
]
|
|
),
|
|
)
|
|
|
|
|
|
def check_prime(nums: list[int]) -> str:
|
|
"""Check if a given list of numbers are prime."""
|
|
primes = set()
|
|
for number in nums:
|
|
number = int(number)
|
|
if number <= 1:
|
|
continue
|
|
is_prime = True
|
|
for i in range(2, int(number**0.5) + 1):
|
|
if number % i == 0:
|
|
is_prime = False
|
|
break
|
|
if is_prime:
|
|
primes.add(number)
|
|
return (
|
|
"No prime numbers found."
|
|
if not primes
|
|
else f"{', '.join(str(num) for num in primes)} are prime numbers."
|
|
)
|
|
|
|
|
|
prime_agent = LlmAgent(
|
|
name="prime_agent",
|
|
description="Handles checking if numbers are prime.",
|
|
model="gemini-2.0-flash-exp",
|
|
instruction="""
|
|
You are responsible for checking whether numbers are prime.
|
|
When asked to check primes, you must call the check_prime tool with a list of integers.
|
|
Never attempt to determine prime numbers manually.
|
|
Return the prime number results to the root agent.
|
|
""",
|
|
tools=[check_prime],
|
|
generate_content_config=types.GenerateContentConfig(
|
|
safety_settings=[
|
|
types.SafetySetting( # avoid false alarm about rolling dice.
|
|
category=types.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
|
|
threshold=types.HarmBlockThreshold.OFF,
|
|
),
|
|
]
|
|
),
|
|
)
|
|
|
|
root_agent = SequentialAgent(
|
|
name="code_pipeline_agent",
|
|
sub_agents=[roll_agent, prime_agent],
|
|
# The agents will run in the order provided: roll_agent -> prime_agent
|
|
)
|