Skip to content

Commit bb6a4b6

Browse files
committed
refactor(agents): Revert "Support ADK 2.0 workflow execution in SequentialAgent"
Change-Id: I1ed948f8b79a707ea505c297457dc56e2d155e44
1 parent be2bf68 commit bb6a4b6

3 files changed

Lines changed: 35 additions & 68 deletions

File tree

src/google/adk/agents/sequential_agent.py

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
from .base_agent import BaseAgent
3131
from .base_agent import BaseAgentState
3232
from .base_agent_config import BaseAgentConfig
33-
from .context import Context
3433
from .invocation_context import InvocationContext
3534
from .llm_agent import LlmAgent
3635
from .sequential_agent_config import SequentialAgentConfig
@@ -52,9 +51,6 @@ class SequentialAgent(BaseAgent):
5251
config_type: ClassVar[Type[BaseAgentConfig]] = SequentialAgentConfig
5352
"""The config type for this agent."""
5453

55-
rerun_on_resume: bool = True
56-
"""SequentialAgent needs to rerun on resume to drive its sub-agents."""
57-
5854
@override
5955
async def _run_async_impl(
6056
self, ctx: InvocationContext
@@ -161,23 +157,3 @@ def task_completed():
161157
async with Aclosing(sub_agent.run_live(ctx)) as agen:
162158
async for event in agen:
163159
yield event
164-
165-
@override
166-
async def _run_impl(
167-
self,
168-
*,
169-
ctx: Context,
170-
node_input: Any,
171-
) -> AsyncGenerator[Any, None]:
172-
"""Runs the sequential agent as a node."""
173-
if not self.sub_agents:
174-
return
175-
176-
output = None
177-
for i, sub_agent in enumerate(self.sub_agents):
178-
# Pass initial input to the first agent, and None to the rest to avoid
179-
# duplicate messages in session for agents that rely on session history.
180-
inp = node_input if i == 0 else None
181-
output = await ctx.run_node(sub_agent, node_input=inp)
182-
183-
yield output

tests/unittests/agents/test_sequential_agent.py

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,12 @@
1717
from typing import AsyncGenerator
1818

1919
from google.adk.agents.base_agent import BaseAgent
20-
from google.adk.agents.context import Context
2120
from google.adk.agents.invocation_context import InvocationContext
2221
from google.adk.agents.sequential_agent import SequentialAgent
2322
from google.adk.agents.sequential_agent import SequentialAgentState
2423
from google.adk.apps import ResumabilityConfig
2524
from google.adk.events.event import Event
2625
from google.adk.sessions.in_memory_session_service import InMemorySessionService
27-
from google.adk.sessions.session import Session
2826
from google.genai import types
2927
import pytest
3028
from typing_extensions import override
@@ -203,40 +201,3 @@ async def test_run_live(request: pytest.FixtureRequest):
203201
assert events[1].author == agent_2.name
204202
assert events[0].content.parts[0].text == f'Hello, live {agent_1.name}!'
205203
assert events[1].content.parts[0].text == f'Hello, live {agent_2.name}!'
206-
207-
208-
@pytest.mark.asyncio
209-
async def test_sequential_agent_as_node():
210-
"""Tests that SequentialAgent runs as a node and uses ctx.run_node."""
211-
sub_agent1 = _TestingAgent(name="sub1")
212-
sub_agent2 = _TestingAgent(name="sub2")
213-
seq_agent = SequentialAgent(name="seq_agent", sub_agents=[sub_agent1, sub_agent2])
214-
215-
# Setup minimal context
216-
session = Session(app_name="test", user_id="user", id="session")
217-
session_service = InMemorySessionService()
218-
ic = InvocationContext(
219-
invocation_id="inv",
220-
session=session,
221-
session_service=session_service,
222-
)
223-
ctx = Context(ic, node_path="wf")
224-
225-
# Mock run_node
226-
run_node_calls = []
227-
async def mock_run_node(node, node_input=None, **kwargs):
228-
run_node_calls.append((node, node_input))
229-
return f"output_from_{node.name}"
230-
231-
ctx.run_node = mock_run_node
232-
233-
events = []
234-
async for event in seq_agent.run(ctx=ctx, node_input="initial_input"):
235-
events.append(event)
236-
237-
assert len(run_node_calls) == 2
238-
assert run_node_calls[0] == (sub_agent1, "initial_input")
239-
assert run_node_calls[1] == (sub_agent2, None)
240-
241-
assert len(events) == 1
242-
assert events[0].output == "output_from_sub2"

tests/unittests/flows/llm_flows/test_agent_transfer.py

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -263,11 +263,23 @@ def test_auto_to_sequential(is_resumable: bool):
263263
assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [
264264
('root_agent', transfer_call_part('sub_agent_1')),
265265
('root_agent', TRANSFER_RESPONSE_PART),
266+
(
267+
'sub_agent_1',
268+
SequentialAgentState(current_sub_agent='sub_agent_1_1').model_dump(
269+
mode='json'
270+
),
271+
),
266272
('sub_agent_1_1', 'response1'),
267273
('sub_agent_1_1', END_OF_AGENT),
274+
(
275+
'sub_agent_1',
276+
SequentialAgentState(current_sub_agent='sub_agent_1_2').model_dump(
277+
mode='json'
278+
),
279+
),
268280
('sub_agent_1_2', 'response2'),
269281
('sub_agent_1_2', END_OF_AGENT),
270-
('sub_agent_1', 'response2'),
282+
('sub_agent_1', END_OF_AGENT),
271283
('root_agent', END_OF_AGENT),
272284
]
273285
# Same session, different invocation.
@@ -334,7 +346,7 @@ def test_auto_to_sequential_to_auto(is_resumable: bool):
334346
('sub_agent_1_1', 'response1'),
335347
('sub_agent_1_2', transfer_call_part('sub_agent_1_2_1')),
336348
('sub_agent_1_2', TRANSFER_RESPONSE_PART),
337-
('sub_agent_1_2', 'response2'),
349+
('sub_agent_1_2_1', 'response2'),
338350
('sub_agent_1_3', 'response3'),
339351
]
340352

@@ -347,16 +359,34 @@ def test_auto_to_sequential_to_auto(is_resumable: bool):
347359
assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [
348360
('root_agent', transfer_call_part('sub_agent_1')),
349361
('root_agent', TRANSFER_RESPONSE_PART),
362+
(
363+
'sub_agent_1',
364+
SequentialAgentState(current_sub_agent='sub_agent_1_1').model_dump(
365+
mode='json'
366+
),
367+
),
350368
('sub_agent_1_1', 'response1'),
351369
('sub_agent_1_1', END_OF_AGENT),
370+
(
371+
'sub_agent_1',
372+
SequentialAgentState(current_sub_agent='sub_agent_1_2').model_dump(
373+
mode='json'
374+
),
375+
),
352376
('sub_agent_1_2', transfer_call_part('sub_agent_1_2_1')),
353377
('sub_agent_1_2', TRANSFER_RESPONSE_PART),
354-
('sub_agent_1_2', 'response2'),
355-
('sub_agent_1_2', END_OF_AGENT),
378+
('sub_agent_1_2_1', 'response2'),
379+
('sub_agent_1_2_1', END_OF_AGENT),
356380
('sub_agent_1_2', END_OF_AGENT),
381+
(
382+
'sub_agent_1',
383+
SequentialAgentState(current_sub_agent='sub_agent_1_3').model_dump(
384+
mode='json'
385+
),
386+
),
357387
('sub_agent_1_3', 'response3'),
358388
('sub_agent_1_3', END_OF_AGENT),
359-
('sub_agent_1', 'response3'),
389+
('sub_agent_1', END_OF_AGENT),
360390
('root_agent', END_OF_AGENT),
361391
]
362392
# Same session, different invocation.

0 commit comments

Comments
 (0)