text: ) -> None:        self.agents = agents        self._step = 0        self.select_next_speaker = selection_function    def reset(self):        for agent in self.agents:            agent.reset()    def inject(self, name: str, message: str):        """        Initiates the conversation with a {message} from {name}        """        for agent in self.agents:            agent.receive(name, message)        # increment time        self._step += 1    def step(self) -> tuple[str, str]:        # 1. choose the next speaker        speaker_idx = self.select_next_speaker(self._step, self.agents)        speaker = self.agents[speaker_idx]        # 2. next speaker sends message        message = speaker.send()        # 3. everyone receives message        for receiver in self.agents:            receiver.receive(speaker.name, message)        # 4. increment time        self._step += 1        return speaker.name, messageDialogueAgentWithTools classâ€‹We define a DialogueAgentWithTools class that augments DialogueAgent to use tools.class DialogueAgentWithTools(DialogueAgent):