diff --git a/src/google/adk/agents/base_agent.py b/src/google/adk/agents/base_agent.py index fe3502b9..41efaa29 100644 --- a/src/google/adk/agents/base_agent.py +++ b/src/google/adk/agents/base_agent.py @@ -66,6 +66,15 @@ AfterAgentCallback: TypeAlias = Union[ SelfAgent = TypeVar('SelfAgent', bound='BaseAgent') +@experimental +class BaseAgentState(BaseModel): + """Base class for all agent states.""" + + model_config = ConfigDict( + extra='forbid', + ) + + class BaseAgent(BaseModel): """Base class for all agents in Agent Development Kit.""" diff --git a/src/google/adk/agents/loop_agent.py b/src/google/adk/agents/loop_agent.py index 1313d208..6311945e 100644 --- a/src/google/adk/agents/loop_agent.py +++ b/src/google/adk/agents/loop_agent.py @@ -21,7 +21,6 @@ from typing import AsyncGenerator from typing import ClassVar from typing import Dict from typing import Optional -from typing import Type from typing_extensions import override @@ -30,10 +29,22 @@ from ..events.event import Event from ..utils.context_utils import Aclosing from ..utils.feature_decorator import experimental from .base_agent import BaseAgent +from .base_agent import BaseAgentState from .base_agent_config import BaseAgentConfig from .loop_agent_config import LoopAgentConfig +@experimental +class LoopAgentState(BaseAgentState): + """State for LoopAgent.""" + + current_sub_agent: str = '' + """The name of the current sub-agent to run in the loop.""" + + times_looped: int = 0 + """The number of times the loop agent has looped.""" + + class LoopAgent(BaseAgent): """A shell agent that run its sub-agents in a loop. diff --git a/src/google/adk/agents/sequential_agent.py b/src/google/adk/agents/sequential_agent.py index bed1557f..265ec9c1 100644 --- a/src/google/adk/agents/sequential_agent.py +++ b/src/google/adk/agents/sequential_agent.py @@ -24,13 +24,23 @@ from typing_extensions import override from ..events.event import Event from ..utils.context_utils import Aclosing +from ..utils.feature_decorator import experimental from .base_agent import BaseAgent -from .base_agent import BaseAgentConfig +from .base_agent import BaseAgentState +from .base_agent_config import BaseAgentConfig from .invocation_context import InvocationContext from .llm_agent import LlmAgent from .sequential_agent_config import SequentialAgentConfig +@experimental +class SequentialAgentState(BaseAgentState): + """State for SequentialAgent.""" + + current_sub_agent: str = '' + """The name of the current sub-agent to run.""" + + class SequentialAgent(BaseAgent): """A shell agent that runs its sub-agents in sequence.""" diff --git a/src/google/adk/events/event_actions.py b/src/google/adk/events/event_actions.py index f5eeb749..af3168fe 100644 --- a/src/google/adk/events/event_actions.py +++ b/src/google/adk/events/event_actions.py @@ -14,6 +14,7 @@ from __future__ import annotations +from typing import Any from typing import Optional from google.genai.types import Content @@ -95,3 +96,11 @@ class EventActions(BaseModel): compaction: Optional[EventCompaction] = None """The compaction of the events.""" + + end_of_agent: Optional[bool] = None + """If true, the current agent has finished its current run. Note that there + can be multiple events with end_of_agent=True for the same agent within one + invocation when there is a loop.""" + + agent_state: Optional[dict[str, Any]] = None + """The agent state at the current event."""