Skip to content

Commit 3736faf

Browse files
committed
fix
1 parent 40ed14e commit 3736faf

File tree

5 files changed

+48
-116
lines changed

5 files changed

+48
-116
lines changed

examples/agent/meilisearch_bag.php renamed to examples/misc/persistent-chat_meilisearch.php

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,35 +10,35 @@
1010
*/
1111

1212
use Symfony\AI\Agent\Agent;
13-
use Symfony\AI\Platform\Bridge\Meilisearch\MessageBag;
13+
use Symfony\AI\Agent\Bridge\Meilisearch\MessageStore;
14+
use Symfony\AI\Agent\Chat;
1415
use Symfony\AI\Platform\Bridge\OpenAi\Gpt;
1516
use Symfony\AI\Platform\Bridge\OpenAi\PlatformFactory;
1617
use Symfony\AI\Platform\Message\Message;
18+
use Symfony\AI\Platform\Message\MessageBag;
1719

1820
require_once dirname(__DIR__).'/bootstrap.php';
1921

2022
$platform = PlatformFactory::create(env('OPENAI_API_KEY'), http_client());
21-
$model = new Gpt(Gpt::GPT_4O_MINI, [
22-
'temperature' => 0.5, // default options for the model
23-
]);
23+
$llm = new Gpt(Gpt::GPT_4O_MINI);
2424

25-
$agent = new Agent($platform, $model, logger: logger());
26-
27-
$messages = new MessageBag(
25+
$agent = new Agent($platform, $llm, logger: logger());
26+
$store = new MessageStore(
2827
http_client(),
2928
env('MEILISEARCH_HOST'),
3029
env('MEILISEARCH_API_KEY'),
31-
'meilisearch_agent'
30+
'chat',
3231
);
32+
$store->initialize();
3333

34-
// Initialize the bag
35-
$messages->initialize();
34+
$chat = new Chat($agent, $store);
3635

37-
$messages->add(Message::forSystem('You are a pirate and you write funny.'));
38-
$messages->add(Message::ofUser('What is the Symfony framework?'));
36+
$messages = new MessageBag(
37+
Message::forSystem('You are a helpful assistant. You only answer with short sentences.'),
38+
);
3939

40-
$result = $agent->call($messages, [
41-
'max_tokens' => 500, // specific options just for this call
42-
]);
40+
$chat->initiate($messages);
41+
$chat->submit(Message::ofUser('My name is Christopher.'));
42+
$message = $chat->submit(Message::ofUser('What is my name?'));
4343

44-
echo $result->getContent().\PHP_EOL;
44+
echo $message->content.\PHP_EOL;

src/platform/src/Bridge/Meilisearch/MessageBag.php renamed to src/agent/src/Bridge/Meilisearch/MessageStore.php

Lines changed: 17 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
* file that was distributed with this source code.
1010
*/
1111

12-
namespace Symfony\AI\Platform\Bridge\Meilisearch;
12+
namespace Symfony\AI\Agent\Bridge\Meilisearch;
1313

14-
use Symfony\AI\Platform\Exception\InvalidArgumentException;
14+
use Symfony\AI\Agent\Chat\InitializableMessageStoreInterface;
15+
use Symfony\AI\Agent\Chat\MessageStoreInterface;
16+
use Symfony\AI\Agent\Exception\InvalidArgumentException;
1517
use Symfony\AI\Platform\Message\AssistantMessage;
1618
use Symfony\AI\Platform\Message\Content\Audio;
1719
use Symfony\AI\Platform\Message\Content\ContentInterface;
@@ -20,8 +22,7 @@
2022
use Symfony\AI\Platform\Message\Content\Image;
2123
use Symfony\AI\Platform\Message\Content\ImageUrl;
2224
use Symfony\AI\Platform\Message\Content\Text;
23-
use Symfony\AI\Platform\Message\InitializableMessageBagInterface;
24-
use Symfony\AI\Platform\Message\MessageBag as InMemoryMessageBag;
25+
use Symfony\AI\Platform\Message\MessageBag;
2526
use Symfony\AI\Platform\Message\MessageBagInterface;
2627
use Symfony\AI\Platform\Message\MessageInterface;
2728
use Symfony\AI\Platform\Message\SystemMessage;
@@ -31,7 +32,7 @@
3132
/**
3233
* @author Guillaume Loulier <[email protected]>
3334
*/
34-
final readonly class MessageBag implements InitializableMessageBagInterface, MessageBagInterface
35+
final readonly class MessageStore implements InitializableMessageStoreInterface, MessageStoreInterface
3536
{
3637
public function __construct(
3738
private HttpClientInterface $httpClient,
@@ -41,88 +42,26 @@ public function __construct(
4142
) {
4243
}
4344

44-
public function add(MessageInterface $message): void
45+
public function save(MessageBagInterface $messages): void
4546
{
46-
$this->request('PUT', \sprintf('indexes/%s/documents', $this->indexName), $this->convertToIndexableArray($message));
47-
}
48-
49-
public function getMessages(): array
50-
{
51-
$messages = $this->request('POST', \sprintf('indexes/%s/documents/fetch', $this->indexName));
52-
53-
return array_map($this->convertToMessage(...), $messages['results']);
54-
}
55-
56-
public function getSystemMessage(): ?SystemMessage
57-
{
58-
$messages = $this->getMessages();
59-
60-
foreach ($messages as $message) {
61-
if ($message instanceof SystemMessage) {
62-
return $message;
63-
}
64-
}
65-
66-
return null;
67-
}
68-
69-
public function with(MessageInterface $message): MessageBagInterface
70-
{
71-
$this->add($message);
72-
73-
return $this;
74-
}
75-
76-
public function merge(MessageBagInterface $messageBag): MessageBagInterface
77-
{
78-
$messages = $messageBag->getMessages();
47+
$messages = $messages->getMessages();
7948

80-
foreach ($messages as $message) {
81-
$this->add($message);
82-
}
83-
84-
return $this;
85-
}
86-
87-
public function withoutSystemMessage(): MessageBagInterface
88-
{
89-
$messages = $this->request('POST', \sprintf('indexes/%s/documents', $this->indexName), [
90-
'filter' => \sprintf('type != "%s"', SystemMessage::class),
91-
]);
92-
93-
return new InMemoryMessageBag(...array_map(
94-
fn (array $message): MessageInterface => $this->convertToMessage($message),
95-
$messages['results']),
96-
);
97-
}
98-
99-
public function prepend(MessageInterface $message): MessageBagInterface
100-
{
101-
$this->add($message);
102-
103-
return $this;
49+
$this->request('PUT', \sprintf('indexes/%s/documents', $this->indexName), array_map(
50+
$this->convertToIndexableArray(...),
51+
$messages,
52+
));
10453
}
10554

106-
public function containsAudio(): bool
55+
public function load(): MessageBagInterface
10756
{
108-
foreach ($this->getMessages() as $message) {
109-
if ($message instanceof UserMessage && $message->hasAudioContent()) {
110-
return true;
111-
}
112-
}
57+
$messages = $this->request('POST', \sprintf('indexes/%s/documents/fetch', $this->indexName));
11358

114-
return false;
59+
return new MessageBag(...array_map($this->convertToMessage(...), $messages['results']));
11560
}
11661

117-
public function containsImage(): bool
62+
public function clear(): void
11863
{
119-
foreach ($this->getMessages() as $message) {
120-
if ($message instanceof UserMessage && $message->hasImageContent()) {
121-
return true;
122-
}
123-
}
124-
125-
return false;
64+
$this->request('DELETE', \sprintf('indexes/%s/documents', $this->indexName));
12665
}
12766

12867
public function initialize(array $options = []): void
@@ -137,11 +76,6 @@ public function initialize(array $options = []): void
13776
]);
13877
}
13978

140-
public function count(): int
141-
{
142-
return \count($this->getMessages());
143-
}
144-
14579
/**
14680
* @param array<string, mixed> $payload
14781
*

src/platform/src/Message/InitializableMessageBagInterface.php renamed to src/agent/src/Chat/InitializableMessageStoreInterface.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
* file that was distributed with this source code.
1010
*/
1111

12-
namespace Symfony\AI\Platform\Message;
12+
namespace Symfony\AI\Agent\Chat;
1313

1414
/**
1515
* @author Guillaume Loulier <[email protected]>
1616
*/
17-
interface InitializableMessageBagInterface
17+
interface InitializableMessageStoreInterface
1818
{
1919
/**
2020
* @param array<mixed> $options

src/platform/tests/Bridge/Meilisearch/MessageBagTest.php renamed to src/agent/tests/Bridge/Meilisearch/MessageStoreTest.php

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,19 @@
99
* file that was distributed with this source code.
1010
*/
1111

12-
namespace Symfony\AI\Platform\Tests\Bridge\Meilisearch;
12+
namespace Symfony\AI\Agent\Tests\Bridge\Meilisearch;
1313

1414
use PHPUnit\Framework\Attributes\CoversClass;
1515
use PHPUnit\Framework\TestCase;
16-
use Symfony\AI\Platform\Bridge\Meilisearch\MessageBag;
16+
use Symfony\AI\Agent\Bridge\Meilisearch\MessageStore;
1717
use Symfony\AI\Platform\Message\Message;
18+
use Symfony\AI\Platform\Message\MessageBag;
1819
use Symfony\Component\HttpClient\Exception\ClientException;
1920
use Symfony\Component\HttpClient\MockHttpClient;
2021
use Symfony\Component\HttpClient\Response\JsonMockResponse;
2122

22-
#[CoversClass(MessageBag::class)]
23-
final class MessageBagTest extends TestCase
23+
#[CoversClass(MessageStore::class)]
24+
final class MessageStoreTest extends TestCase
2425
{
2526
public function testStoreCannotInitializeOnInvalidResponse()
2627
{
@@ -35,7 +36,7 @@ public function testStoreCannotInitializeOnInvalidResponse()
3536
]),
3637
], 'http://localhost:7700');
3738

38-
$store = new MessageBag(
39+
$store = new MessageStore(
3940
$httpClient,
4041
'http://localhost:7700',
4142
'test',
@@ -71,7 +72,7 @@ public function testStoreCanInitialize()
7172
]),
7273
], 'http://localhost:7700');
7374

74-
$store = new MessageBag(
75+
$store = new MessageStore(
7576
$httpClient,
7677
'http://localhost:7700',
7778
'test',
@@ -96,7 +97,7 @@ public function testStoreCannotAddOnInvalidResponse()
9697
]),
9798
], 'http://localhost:7700');
9899

99-
$store = new MessageBag(
100+
$store = new MessageStore(
100101
$httpClient,
101102
'http://localhost:7700',
102103
'test',
@@ -106,7 +107,7 @@ public function testStoreCannotAddOnInvalidResponse()
106107
self::expectException(ClientException::class);
107108
self::expectExceptionMessage('HTTP 400 returned for "http://localhost:7700/indexes/test/documents".');
108109
self::expectExceptionCode(400);
109-
$store->add(Message::ofUser('Hello there'));
110+
$store->save(new MessageBag(Message::ofUser('Hello there')));
110111
}
111112

112113
public function testStoreCanAdd()
@@ -123,14 +124,14 @@ public function testStoreCanAdd()
123124
]),
124125
], 'http://localhost:7700');
125126

126-
$store = new MessageBag(
127+
$store = new MessageStore(
127128
$httpClient,
128129
'http://localhost:7700',
129130
'test',
130131
'test',
131132
);
132133

133-
$store->add(Message::ofUser('Hello there'));
134+
$store->save(new MessageBag(Message::ofUser('Hello there')));
134135

135136
$this->assertSame(1, $httpClient->getRequestsCount());
136137
}
@@ -148,7 +149,7 @@ public function testStoreCannotRetrieveMessagesOnInvalidResponse()
148149
]),
149150
], 'http://localhost:7700');
150151

151-
$store = new MessageBag(
152+
$store = new MessageStore(
152153
$httpClient,
153154
'http://localhost:7700',
154155
'test',
@@ -158,6 +159,6 @@ public function testStoreCannotRetrieveMessagesOnInvalidResponse()
158159
self::expectException(ClientException::class);
159160
self::expectExceptionMessage('HTTP 400 returned for "http://localhost:7700/indexes/test/documents/fetch".');
160161
self::expectExceptionCode(400);
161-
$store->getMessages();
162+
$store->load();
162163
}
163164
}

src/platform/CHANGELOG.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,3 @@ CHANGELOG
5858
* Add response promises for async operations
5959
* Add InMemoryPlatform and InMemoryRawResult for testing Platform without external Providers calls
6060
* Add tool calling support for Ollama platform
61-
* Add support for message bags:
62-
- Meilisearch
63-

0 commit comments

Comments
 (0)