Skip to content

Commit 4849dc8

Browse files
zastrowmjsamuel1
authored andcommitted
Refactor event loop to use Agent object rather than individual parameters (strands-agents#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 fcd7cda commit 4849dc8

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
@@ -131,14 +130,7 @@ def caller(
131130
}
132131

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

143135
try:
144136
while True:
@@ -292,7 +284,6 @@ def __init__(
292284
self.load_tools_from_directory = load_tools_from_directory
293285

294286
self.tool_registry = ToolRegistry()
295-
self.tool_handler = AgentToolHandler(tool_registry=self.tool_registry)
296287

297288
# Process tool list if provided
298289
if tools is not None:
@@ -626,14 +617,7 @@ async def _execute_event_loop_cycle(self, kwargs: dict[str, Any]) -> AsyncGenera
626617
try:
627618
# Execute the main event loop cycle
628619
events = event_loop_cycle(
629-
model=self.model,
630-
system_prompt=self.system_prompt,
631-
messages=self.messages, # will be modified by event_loop_cycle
632-
tool_config=self.tool_config,
633-
tool_handler=self.tool_handler,
634-
thread_pool=self.thread_pool,
635-
event_loop_metrics=self.event_loop_metrics,
636-
event_loop_parent_span=self.trace_span,
620+
agent=self,
637621
kwargs=kwargs,
638622
)
639623
async for event in events:

0 commit comments

Comments
 (0)