46 lines
1.2 KiB
Python
46 lines
1.2 KiB
Python
from __future__ import annotations
|
|
|
|
import sys
|
|
from threading import Event
|
|
from typing import Callable
|
|
|
|
from agents import Agent
|
|
from tools import Tool
|
|
|
|
ToolBuilder = Callable[[str], Tool]
|
|
ToolRunner = Callable[[Tool], bool]
|
|
CommandRunner = Callable[[str], None]
|
|
|
|
|
|
def run_agent(
|
|
agent: Agent,
|
|
*,
|
|
build_tool: ToolBuilder,
|
|
run_tool: ToolRunner,
|
|
send_command: CommandRunner,
|
|
stop_event: Event,
|
|
) -> None:
|
|
"""Execute *agent* by wiring it to the tool runtime."""
|
|
|
|
def invoke_tool(spec: str) -> bool:
|
|
name = spec.strip()
|
|
if not name:
|
|
print("[Agent] Ignoring empty tool spec", file=sys.stderr)
|
|
return False
|
|
try:
|
|
tool = build_tool(name)
|
|
except RuntimeError as exc:
|
|
print(f"[Agent] Failed to load tool '{name}': {exc}", file=sys.stderr)
|
|
return False
|
|
print(f"[Agent] Running tool '{name}'")
|
|
return run_tool(tool)
|
|
|
|
try:
|
|
agent.run(
|
|
invoke_tool=invoke_tool,
|
|
send_command=send_command,
|
|
stop_event=stop_event,
|
|
)
|
|
except TypeError:
|
|
# Backwards compatibility for agents that only accept invoke_tool
|
|
agent.run(invoke_tool=invoke_tool, stop_event=stop_event)
|