Skip to content

Commit 46f66be

Browse files
authored
Refactor event loop to use Agent object rather than individual parameters (#359)
Update the event_loop_cycle function to accept the agent directly instead of the separate parameters that were coming directly from the agent. This simplifies + clarifies exactly what the event loop is doing with the agent. Long-term this sets us up for more easily access other agent capabilities like hooks. There is a downside here of tighter coupling between the agent & the event_loop - an alternative implementation of this would be to abstract the object being passed - maybe something like `EventLoopContext`. I originally started implementing this approach before revisiting it as it seemed like an unnecessary abstraction.
1 parent dff627d commit 46f66be

File tree

8 files changed

+211
-621
lines changed

8 files changed

+211
-621
lines changed

src/strands/agent/agent.py

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,9 @@
2020
from opentelemetry import trace
2121
from pydantic import BaseModel
2222

23-
from ..event_loop.event_loop import event_loop_cycle
23+
from ..event_loop.event_loop import event_loop_cycle, run_tool
2424
from ..experimental.hooks import AgentInitializedEvent, EndRequestEvent, HookRegistry, StartRequestEvent
2525
from ..handlers.callback_handler import PrintingCallbackHandler, null_callback_handler
26-
from ..handlers.tool_handler import AgentToolHandler
2726
from ..models.bedrock import BedrockModel
2827
from ..telemetry.metrics import EventLoopMetrics
2928
from ..telemetry.tracer import get_tracer
@@ -130,14 +129,7 @@ def caller(
130129
}
131130

132131
# Execute the tool
133-
events = self._agent.tool_handler.process(
134-
tool=tool_use,
135-
model=self._agent.model,
136-
system_prompt=self._agent.system_prompt,
137-
messages=self._agent.messages,
138-
tool_config=self._agent.tool_config,
139-
kwargs=kwargs,
140-
)
132+
events = run_tool(agent=self._agent, tool=tool_use, kwargs=kwargs)
141133

142134
try:
143135
while True:
@@ -283,7 +275,6 @@ def __init__(
283275
self.load_tools_from_directory = load_tools_from_directory
284276

285277
self.tool_registry = ToolRegistry()
286-
self.tool_handler = AgentToolHandler(tool_registry=self.tool_registry)
287278

288279
# Process tool list if provided
289280
if tools is not None:
@@ -563,14 +554,7 @@ async def _execute_event_loop_cycle(self, kwargs: dict[str, Any]) -> AsyncGenera
563554
try:
564555
# Execute the main event loop cycle
565556
events = event_loop_cycle(
566-
model=self.model,
567-
system_prompt=self.system_prompt,
568-
messages=self.messages, # will be modified by event_loop_cycle
569-
tool_config=self.tool_config,
570-
tool_handler=self.tool_handler,
571-
thread_pool=self.thread_pool,
572-
event_loop_metrics=self.event_loop_metrics,
573-
event_loop_parent_span=self.trace_span,
557+
agent=self,
574558
kwargs=kwargs,
575559
)
576560
async for event in events:

0 commit comments

Comments
 (0)