From 70cb36852a507810f8b66baa16de5c09de06587e Mon Sep 17 00:00:00 2001 From: "a.bolonin" Date: Mon, 2 Nov 2026 10:03:22 +0300 Subject: [PATCH] Avoid repeated array merges in prompt formatting --- .../Formatter/PromptResultFormatter.php | 8 +++++++- .../Formatter/PromptResultFormatterTest.php | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/Capability/Formatter/PromptResultFormatter.php b/src/Capability/Formatter/PromptResultFormatter.php index 207c7e26a..ad5356e4e 100644 --- a/src/Capability/Formatter/PromptResultFormatter.php +++ b/src/Capability/Formatter/PromptResultFormatter.php @@ -74,7 +74,13 @@ public function format(mixed $promptGenerationResult): array if ($item instanceof PromptMessage) { $result[] = $item; } else { - $result = array_merge($result, $this->format($item)); + foreach ($this->format($item) as $key => $message) { + if (\is_int($key)) { + $result[] = $message; + } else { + $result[$key] = $message; + } + } } } diff --git a/tests/Unit/Capability/Formatter/PromptResultFormatterTest.php b/tests/Unit/Capability/Formatter/PromptResultFormatterTest.php index 6a57c9907..6ac3a40fc 100644 --- a/tests/Unit/Capability/Formatter/PromptResultFormatterTest.php +++ b/tests/Unit/Capability/Formatter/PromptResultFormatterTest.php @@ -24,6 +24,25 @@ class PromptResultFormatterTest extends TestCase { + public function testMixedMessagesPreserveNestedKeysAndOrder(): void + { + $first = new PromptMessage(Role::User, new TextContent('first')); + $second = new PromptMessage(Role::Assistant, new TextContent('second')); + $third = new PromptMessage(Role::User, new TextContent('third')); + + $result = (new PromptResultFormatter())->format([ + $first, + ['named' => $second, 8 => $first], + ['named' => $third, 5 => $second], + ]); + + $this->assertSame([0, 'named', 1, 2], array_keys($result)); + $this->assertSame($first, $result[0]); + $this->assertSame($third, $result['named']); + $this->assertSame($first, $result[1]); + $this->assertSame($second, $result[2]); + } + public function testFormatPromptMessage(): void { $message = new PromptMessage(Role::User, new TextContent('hello'));