Skip to content

Commit 61e41da

Browse files
authored
multiagents - temporarily raise exception when interrupted (strands-agents#1038)
1 parent dbf6200 commit 61e41da

File tree

3 files changed

+20
-3
lines changed

3 files changed

+20
-3
lines changed

src/strands/hooks/registry.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
via hook provider objects.
88
"""
99

10+
import logging
1011
from dataclasses import dataclass
1112
from typing import TYPE_CHECKING, Any, Generator, Generic, Protocol, Type, TypeVar
1213

@@ -15,6 +16,8 @@
1516
if TYPE_CHECKING:
1617
from ..agent import Agent
1718

19+
logger = logging.getLogger(__name__)
20+
1821

1922
@dataclass
2023
class BaseHookEvent:
@@ -219,9 +222,9 @@ def invoke_callbacks(self, event: TInvokeEvent) -> tuple[TInvokeEvent, list[Inte
219222
except InterruptException as exception:
220223
interrupt = exception.interrupt
221224
if interrupt.name in interrupts:
222-
raise ValueError(
223-
f"interrupt_name=<{interrupt.name}> | interrupt name used more than once"
224-
) from exception
225+
message = f"interrupt_name=<{interrupt.name}> | interrupt name used more than once"
226+
logger.error(message)
227+
raise ValueError(message) from exception
225228

226229
# Each callback is allowed to raise their own interrupt.
227230
interrupts[interrupt.name] = interrupt

src/strands/multiagent/graph.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,14 @@ async def _execute_node(self, node: GraphNode, invocation_state: dict[str, Any])
578578
else:
579579
agent_response = await node.executor.invoke_async(node_input, invocation_state=invocation_state)
580580

581+
if agent_response.stop_reason == "interrupt":
582+
node.executor.messages.pop() # remove interrupted tool use message
583+
node.executor._interrupt_state.deactivate()
584+
585+
raise RuntimeError(
586+
"user raised interrupt from agent | interrupts are not yet supported in graphs"
587+
)
588+
581589
# Extract metrics from agent response
582590
usage = Usage(inputTokens=0, outputTokens=0, totalTokens=0)
583591
metrics = Metrics(latencyMs=0)

src/strands/multiagent/swarm.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,12 @@ async def _execute_node(
637637
node.reset_executor_state()
638638
result = await node.executor.invoke_async(node_input, invocation_state=invocation_state)
639639

640+
if result.stop_reason == "interrupt":
641+
node.executor.messages.pop() # remove interrupted tool use message
642+
node.executor._interrupt_state.deactivate()
643+
644+
raise RuntimeError("user raised interrupt from agent | interrupts are not yet supported in swarms")
645+
640646
execution_time = round((time.time() - start_time) * 1000)
641647

642648
# Create NodeResult

0 commit comments

Comments
 (0)