Skip to content

Commit 3c48f5a

Browse files
authoredDec 28, 2024
refactor: MessageBag not depend on \ArrayObject anymore (#174)
Follows * https://github.com/php-llm/llm-chain/pull/166/files#r1898145794 BREAKING CHANGE: MessageBag is not an instance of ArrayObject anymore and therefore array access and iteration not possible anymore. Use `getMessages()` instead.
·
0.24.10.11
1 parent f7d8aa0 commit 3c48f5a

File tree

5 files changed

+45
-27
lines changed

5 files changed

+45
-27
lines changed
 

‎src/Bridge/Meta/LlamaPromptConverter.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public function convertToPrompt(MessageBag $messageBag): string
1919
$messages = [];
2020

2121
/** @var UserMessage|SystemMessage|AssistantMessage $message */
22-
foreach ($messageBag->getIterator() as $message) {
22+
foreach ($messageBag->getMessages() as $message) {
2323
$messages[] = self::convertMessage($message);
2424
}
2525

‎src/Chain/ToolBox/ChainProcessor.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ public function processOutput(Output $output): void
4545

4646
while ($output->response instanceof ToolCallResponse) {
4747
$toolCalls = $output->response->getContent();
48-
$messages[] = Message::ofAssistant(toolCalls: $toolCalls);
48+
$messages->add(Message::ofAssistant(toolCalls: $toolCalls));
4949

5050
foreach ($toolCalls as $toolCall) {
5151
$result = $this->toolBox->execute($toolCall);
52-
$messages[] = Message::ofToolCall($toolCall, $result);
52+
$messages->add(Message::ofToolCall($toolCall, $result));
5353
}
5454

5555
$output->response = $this->chain->call($messages, $output->options);

‎src/Model/Message/MessageBag.php

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,34 @@
44

55
namespace PhpLlm\LlmChain\Model\Message;
66

7-
/**
8-
* @template-extends \ArrayObject<int, MessageInterface>
9-
*/
10-
final class MessageBag extends \ArrayObject implements \JsonSerializable
7+
final class MessageBag implements \Countable, \JsonSerializable
118
{
9+
/**
10+
* @var MessageInterface[]
11+
*/
12+
private array $messages;
13+
1214
public function __construct(MessageInterface ...$messages)
1315
{
14-
parent::__construct(array_values($messages));
16+
$this->messages = array_values($messages);
17+
}
18+
19+
public function add(MessageInterface $message): void
20+
{
21+
$this->messages[] = $message;
22+
}
23+
24+
/**
25+
* @return MessageInterface[]
26+
*/
27+
public function getMessages(): array
28+
{
29+
return $this->messages;
1530
}
1631

1732
public function getSystemMessage(): ?SystemMessage
1833
{
19-
foreach ($this as $message) {
34+
foreach ($this->messages as $message) {
2035
if ($message instanceof SystemMessage) {
2136
return $message;
2237
}
@@ -28,43 +43,41 @@ public function getSystemMessage(): ?SystemMessage
2843
public function with(MessageInterface $message): self
2944
{
3045
$messages = clone $this;
31-
$messages->append($message);
46+
$messages->add($message);
3247

3348
return $messages;
3449
}
3550

3651
public function merge(MessageBag $messageBag): self
3752
{
3853
$messages = clone $this;
39-
$messages->exchangeArray(array_merge($messages->getArrayCopy(), $messageBag->getArrayCopy()));
54+
$messages->messages = array_merge($messages->messages, $messageBag->messages);
4055

4156
return $messages;
4257
}
4358

4459
public function withoutSystemMessage(): self
4560
{
4661
$messages = clone $this;
47-
$messages->exchangeArray(
48-
array_values(array_filter(
49-
$messages->getArrayCopy(),
50-
static fn (MessageInterface $message) => !$message instanceof SystemMessage,
51-
))
52-
);
62+
$messages->messages = array_values(array_filter(
63+
$messages->messages,
64+
static fn (MessageInterface $message) => !$message instanceof SystemMessage,
65+
));
5366

5467
return $messages;
5568
}
5669

5770
public function prepend(MessageInterface $message): self
5871
{
5972
$messages = clone $this;
60-
$messages->exchangeArray(array_merge([$message], $messages->getArrayCopy()));
73+
$messages->messages = array_merge([$message], $messages->messages);
6174

6275
return $messages;
6376
}
6477

6578
public function containsImage(): bool
6679
{
67-
foreach ($this as $message) {
80+
foreach ($this->messages as $message) {
6881
if ($message instanceof UserMessage && $message->hasImageContent()) {
6982
return true;
7083
}
@@ -73,11 +86,16 @@ public function containsImage(): bool
7386
return false;
7487
}
7588

89+
public function count(): int
90+
{
91+
return count($this->messages);
92+
}
93+
7694
/**
7795
* @return MessageInterface[]
7896
*/
7997
public function jsonSerialize(): array
8098
{
81-
return $this->getArrayCopy();
99+
return $this->messages;
82100
}
83101
}

‎tests/Bridge/Meta/LlamaPromptConverterTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public function convertMessages(): void
2626
{
2727
$messageBag = new MessageBag();
2828
foreach (self::provideMessages() as $message) {
29-
$messageBag->append($message[1]);
29+
$messageBag->add($message[1]);
3030
}
3131

3232
self::assertSame(<<<EXPECTED

‎tests/Model/Message/MessageBagTest.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public function with(): void
7070
self::assertCount(3, $messageBag);
7171
self::assertCount(4, $newMessageBag);
7272

73-
$newMessageFromBag = $newMessageBag[3];
73+
$newMessageFromBag = $newMessageBag->getMessages()[3];
7474

7575
self::assertInstanceOf(AssistantMessage::class, $newMessageFromBag);
7676
self::assertSame('It is time to wake up.', $newMessageFromBag->content);
@@ -91,7 +91,7 @@ public function merge(): void
9191

9292
self::assertCount(4, $messageBag);
9393

94-
$messageFromBag = $messageBag[3];
94+
$messageFromBag = $messageBag->getMessages()[3];
9595

9696
self::assertInstanceOf(AssistantMessage::class, $messageFromBag);
9797
self::assertSame('It is time to wake up.', $messageFromBag->content);
@@ -111,7 +111,7 @@ public function withoutSystemMessage(): void
111111
self::assertCount(3, $messageBag);
112112
self::assertCount(2, $newMessageBag);
113113

114-
$messageFromNewBag = $newMessageBag[0];
114+
$messageFromNewBag = $newMessageBag->getMessages()[0];
115115

116116
self::assertInstanceOf(AssistantMessage::class, $messageFromNewBag);
117117
self::assertSame('It is time to sleep.', $messageFromNewBag->content);
@@ -131,14 +131,14 @@ public function prepend(): void
131131
self::assertCount(2, $messageBag);
132132
self::assertCount(3, $newMessageBag);
133133

134-
$newMessageBagMessage = $newMessageBag[0];
134+
$newMessageBagMessage = $newMessageBag->getMessages()[0];
135135

136136
self::assertInstanceOf(SystemMessage::class, $newMessageBagMessage);
137137
self::assertSame('My amazing system prompt.', $newMessageBagMessage->content);
138138
}
139139

140140
#[Test]
141-
public function containsImageWithoutImage(): void
141+
public function containsImageReturnsFalseWithoutImage(): void
142142
{
143143
$messageBag = new MessageBag(
144144
Message::ofAssistant('It is time to sleep.'),
@@ -149,7 +149,7 @@ public function containsImageWithoutImage(): void
149149
}
150150

151151
#[Test]
152-
public function containsImageWithImage(): void
152+
public function containsImageReturnsTrueWithImage(): void
153153
{
154154
$messageBag = new MessageBag(
155155
Message::ofAssistant('It is time to sleep.'),

0 commit comments

Comments
 (0)
Please sign in to comment.