From d6b873e57fe24fd72335bb2c0e8f70554b50ba58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Pineau?= Date: Thu, 27 Nov 2025 18:05:51 +0100 Subject: [PATCH] [Agent] Code groming arround tall call --- src/agent/src/Toolbox/AgentProcessor.php | 59 ++++++++++--------- .../Toolbox/ToolFactory/MemoryToolFactory.php | 12 ++-- src/agent/src/Toolbox/Toolbox.php | 12 ++-- .../src/Bridge/OpenAi/Gpt/ResultConverter.php | 2 +- 4 files changed, 43 insertions(+), 42 deletions(-) diff --git a/src/agent/src/Toolbox/AgentProcessor.php b/src/agent/src/Toolbox/AgentProcessor.php index e3b029b60..213783de2 100644 --- a/src/agent/src/Toolbox/AgentProcessor.php +++ b/src/agent/src/Toolbox/AgentProcessor.php @@ -80,7 +80,10 @@ public function processOutput(Output $output): void if ($result instanceof GenericStreamResponse) { $output->setResult( - new ToolboxStreamResponse($result->getContent(), $this->handleToolCallsCallback($output)) + new ToolboxStreamResponse( + $result->getContent(), + fn (ToolCallResult $result, ?AssistantMessage $streamedAssistantResponse = null) => $this->handleToolCallsCallback($output, $result, $streamedAssistantResponse) + ) ); return; @@ -90,7 +93,7 @@ public function processOutput(Output $output): void return; } - $output->setResult($this->handleToolCallsCallback($output)($result)); + $output->setResult($this->handleToolCallsCallback($output, $result)); } /** @@ -101,40 +104,38 @@ private function isFlatStringArray(array $tools): bool return array_reduce($tools, fn (bool $carry, mixed $item) => $carry && \is_string($item), true); } - private function handleToolCallsCallback(Output $output): \Closure + private function handleToolCallsCallback(Output $output, ToolCallResult $result, ?AssistantMessage $streamedAssistantResponse = null): ResultInterface { - return function (ToolCallResult $result, ?AssistantMessage $streamedAssistantResponse = null) use ($output): ResultInterface { - ++$this->nestingLevel; - $messages = $this->keepToolMessages ? $output->getMessageBag() : clone $output->getMessageBag(); + ++$this->nestingLevel; + $messages = $this->keepToolMessages ? $output->getMessageBag() : clone $output->getMessageBag(); - if (null !== $streamedAssistantResponse && '' !== $streamedAssistantResponse->getContent()) { - $messages->add($streamedAssistantResponse); - } + if (null !== $streamedAssistantResponse && '' !== $streamedAssistantResponse->getContent()) { + $messages->add($streamedAssistantResponse); + } - do { - $toolCalls = $result->getContent(); - $messages->add(Message::ofAssistant(toolCalls: $toolCalls)); + do { + $toolCalls = $result->getContent(); + $messages->add(Message::ofAssistant(toolCalls: $toolCalls)); - $results = []; - foreach ($toolCalls as $toolCall) { - $results[] = $toolResult = $this->toolbox->execute($toolCall); - $messages->add(Message::ofToolCall($toolCall, $this->resultConverter->convert($toolResult))); - array_push($this->sources, ...$toolResult->getSources()); - } + $results = []; + foreach ($toolCalls as $toolCall) { + $results[] = $toolResult = $this->toolbox->execute($toolCall); + $messages->add(Message::ofToolCall($toolCall, $this->resultConverter->convert($toolResult))); + array_push($this->sources, ...$toolResult->getSources()); + } - $event = new ToolCallsExecuted(...$results); - $this->eventDispatcher?->dispatch($event); + $event = new ToolCallsExecuted(...$results); + $this->eventDispatcher?->dispatch($event); - $result = $event->hasResult() ? $event->getResult() : $this->agent->call($messages, $output->getOptions()); - } while ($result instanceof ToolCallResult); + $result = $event->hasResult() ? $event->getResult() : $this->agent->call($messages, $output->getOptions()); + } while ($result instanceof ToolCallResult); - --$this->nestingLevel; - if ($this->includeSources && 0 === $this->nestingLevel) { - $result->getMetadata()->add('sources', $this->sources); - $this->sources = []; - } + --$this->nestingLevel; + if ($this->includeSources && 0 === $this->nestingLevel) { + $result->getMetadata()->add('sources', $this->sources); + $this->sources = []; + } - return $result; - }; + return $result; } } diff --git a/src/agent/src/Toolbox/ToolFactory/MemoryToolFactory.php b/src/agent/src/Toolbox/ToolFactory/MemoryToolFactory.php index 80846d96d..45bab2d07 100644 --- a/src/agent/src/Toolbox/ToolFactory/MemoryToolFactory.php +++ b/src/agent/src/Toolbox/ToolFactory/MemoryToolFactory.php @@ -33,16 +33,16 @@ public function addTool(string|object $class, string $name, string $description, } /** - * @param class-string $reference + * @param class-string $className */ - public function getTool(string $reference): iterable + public function getTool(string $className): iterable { - if (!isset($this->tools[$reference])) { - throw ToolException::invalidReference($reference); + if (!isset($this->tools[$className])) { + throw ToolException::invalidReference($className); } - foreach ($this->tools[$reference] as $tool) { - yield $this->convertAttribute($reference, $tool); + foreach ($this->tools[$className] as $tool) { + yield $this->convertAttribute($className, $tool); } } } diff --git a/src/agent/src/Toolbox/Toolbox.php b/src/agent/src/Toolbox/Toolbox.php index 508ea4a38..bca16cc82 100644 --- a/src/agent/src/Toolbox/Toolbox.php +++ b/src/agent/src/Toolbox/Toolbox.php @@ -43,7 +43,7 @@ final class Toolbox implements ToolboxInterface * * @var Tool[] */ - private array $map; + private array $toolsMetadata; /** * @param iterable $tools @@ -60,18 +60,18 @@ public function __construct( public function getTools(): array { - if (isset($this->map)) { - return $this->map; + if (isset($this->toolsMetadata)) { + return $this->toolsMetadata; } - $map = []; + $toolsMetadata = []; foreach ($this->tools as $tool) { foreach ($this->toolFactory->getTool($tool::class) as $metadata) { - $map[] = $metadata; + $toolsMetadata[] = $metadata; } } - return $this->map = $map; + return $this->toolsMetadata = $toolsMetadata; } public function execute(ToolCall $toolCall): ToolResult diff --git a/src/platform/src/Bridge/OpenAi/Gpt/ResultConverter.php b/src/platform/src/Bridge/OpenAi/Gpt/ResultConverter.php index a4d96dd2c..98b845668 100644 --- a/src/platform/src/Bridge/OpenAi/Gpt/ResultConverter.php +++ b/src/platform/src/Bridge/OpenAi/Gpt/ResultConverter.php @@ -173,7 +173,7 @@ private function isToolCallsStreamFinished(array $data): bool private function convertChoice(array $choice): ToolCallResult|TextResult { if ('tool_calls' === $choice['finish_reason']) { - return new ToolCallResult(...array_map([$this, 'convertToolCall'], $choice['message']['tool_calls'])); + return new ToolCallResult(...array_map($this->convertToolCall(...), $choice['message']['tool_calls'])); } if (\in_array($choice['finish_reason'], ['stop', 'length'], true)) {