def instrument_create_or_get_executor(agent: Agent, *, instrumentator: Callable[[Agent], Agent]) -> Agent:
# Instrument `_create_or_get_executor` to auto-instrument dynamically created executors
if hasattr(agent, "_create_or_get_executor") and not hasattr(agent._create_or_get_executor, "__otel_wrapped__"):
old_create_or_get_executor = agent._create_or_get_executor
@contextmanager
def create_or_get_executor_traced(
executor_kwargs: dict[str, Any] | None = None,
tools: Any = None,
agent_name: str = "executor",
agent_human_input_mode: str = "NEVER",
) -> Generator[Agent, None, None]:
with old_create_or_get_executor(
executor_kwargs=executor_kwargs,
tools=tools,
agent_name=agent_name,
agent_human_input_mode=agent_human_input_mode,
) as executor:
# Instrument the dynamically created executor
instrumentator(executor)
yield executor
create_or_get_executor_traced.__otel_wrapped__ = True
agent._create_or_get_executor = create_or_get_executor_traced
return agent