Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion examples/misc/parallel-chat-gpt.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
$results = [];
foreach (range('A', 'D') as $letter) {
echo ' - Request for the letter '.$letter.' initiated.'.\PHP_EOL;
$results[] = $platform->invoke('gpt-4o-mini', $messages->with(Message::ofUser($letter)));
$results[] = $platform->invoke('gpt-4o-mini', (clone $messages)->add(Message::ofUser($letter)));
}

echo 'Waiting for the responses ...'.\PHP_EOL;
Expand Down
57 changes: 36 additions & 21 deletions src/platform/src/Message/MessageBag.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,21 @@
namespace Symfony\AI\Platform\Message;

use Symfony\AI\Platform\Metadata\MetadataAwareTrait;
use Symfony\Component\Uid\AbstractUid;
use Symfony\Component\Uid\TimeBasedUidInterface;
use Symfony\Component\Uid\Uuid;

/**
* @author Christopher Hertel <mail@christopher-hertel.de>
*
* @implements \IteratorAggregate<MessageInterface>
*/
class MessageBag implements \Countable
class MessageBag implements \IteratorAggregate, \Countable
{
use MetadataAwareTrait;

private AbstractUid&TimeBasedUidInterface $id;

/**
* @var list<MessageInterface>
*/
Expand All @@ -28,11 +35,31 @@ class MessageBag implements \Countable
public function __construct(MessageInterface ...$messages)
{
$this->messages = array_values($messages);
$this->id = Uuid::v7();
}

public function __clone()
{
$this->id = Uuid::v7();
}

public function getId(): AbstractUid&TimeBasedUidInterface
{
return $this->id;
}

public function add(MessageInterface $message): void
public function add(MessageInterface $message): self
{
$this->messages[] = $message;

return $this;
}

public function prepend(MessageInterface $message): self
{
$this->messages = array_merge([$message], $this->messages);

return $this;
}

/**
Expand Down Expand Up @@ -65,20 +92,11 @@ public function getUserMessage(): ?UserMessage
return null;
}

public function with(MessageInterface $message): self
{
$messages = clone $this;
$messages->add($message);

return $messages;
}

public function merge(self $messageBag): self
{
$messages = clone $this;
$messages->messages = array_merge($messages->messages, $messageBag->getMessages());
$this->messages = array_merge($this->messages, $messageBag->getMessages());

return $messages;
return $this;
}

public function withoutSystemMessage(): self
Expand All @@ -92,14 +110,6 @@ public function withoutSystemMessage(): self
return $messages;
}

public function prepend(MessageInterface $message): self
{
$messages = clone $this;
$messages->messages = array_merge([$message], $messages->messages);

return $messages;
}

public function containsAudio(): bool
{
foreach ($this->messages as $message) {
Expand All @@ -126,4 +136,9 @@ public function count(): int
{
return \count($this->messages);
}

public function getIterator(): \Traversable
{
return new \ArrayIterator($this->messages);
}
}
22 changes: 1 addition & 21 deletions src/platform/tests/Message/MessageBagTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,26 +48,6 @@ public function testGetSystemMessageWithoutSystemMessage()
$this->assertNull($messageBag->getSystemMessage());
}

public function testWith()
{
$messageBag = new MessageBag(
Message::forSystem('My amazing system prompt.'),
Message::ofAssistant('It is time to sleep.'),
Message::ofUser('Hello, world!'),
);

$newMessage = Message::ofAssistant('It is time to wake up.');
$newMessageBag = $messageBag->with($newMessage);

$this->assertCount(3, $messageBag);
$this->assertCount(4, $newMessageBag);

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

$this->assertInstanceOf(AssistantMessage::class, $newMessageFromBag);
$this->assertSame('It is time to wake up.', $newMessageFromBag->getContent());
}

public function testMerge()
{
$messageBag = new MessageBag(
Expand Down Expand Up @@ -121,7 +101,7 @@ public function testPrepend()
);

$newMessage = Message::forSystem('My amazing system prompt.');
$newMessageBag = $messageBag->prepend($newMessage);
$newMessageBag = (clone $messageBag)->prepend($newMessage);

$this->assertCount(2, $messageBag);
$this->assertCount(3, $newMessageBag);
Expand Down