Skip to content

Commit 46c9bcc

Browse files
committed
ref
1 parent 3cba27c commit 46c9bcc

File tree

14 files changed

+252
-53
lines changed

14 files changed

+252
-53
lines changed

src/agent/src/Agent.php

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@
2121
use Symfony\AI\Platform\Model;
2222
use Symfony\AI\Platform\PlatformInterface;
2323
use Symfony\AI\Platform\Result\ResultInterface;
24-
use Symfony\Component\Uid\AbstractUid;
25-
use Symfony\Component\Uid\TimeBasedUidInterface;
26-
use Symfony\Component\Uid\Uuid;
2724
use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
2825
use Symfony\Contracts\HttpClient\Exception\HttpExceptionInterface;
2926

@@ -32,8 +29,6 @@
3229
*/
3330
final readonly class Agent implements AgentInterface
3431
{
35-
private AbstractUid&TimeBasedUidInterface $id;
36-
3732
/**
3833
* @var InputProcessorInterface[]
3934
*/
@@ -57,8 +52,6 @@ public function __construct(
5752
) {
5853
$this->inputProcessors = $this->initializeProcessors($inputProcessors, InputProcessorInterface::class);
5954
$this->outputProcessors = $this->initializeProcessors($outputProcessors, OutputProcessorInterface::class);
60-
61-
$this->id = Uuid::v7();
6255
}
6356

6457
/**
@@ -104,11 +97,6 @@ public function call(MessageBagInterface $messages, array $options = []): Result
10497
return $output->result;
10598
}
10699

107-
public function getId(): AbstractUid&TimeBasedUidInterface
108-
{
109-
return $this->id;
110-
}
111-
112100
/**
113101
* @param InputProcessorInterface[]|OutputProcessorInterface[] $processors
114102
* @param class-string $interface

src/agent/src/AgentInterface.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
use Symfony\AI\Agent\Exception\ExceptionInterface;
1515
use Symfony\AI\Platform\Message\MessageBagInterface;
1616
use Symfony\AI\Platform\Result\ResultInterface;
17-
use Symfony\Component\Uid\AbstractUid;
18-
use Symfony\Component\Uid\TimeBasedUidInterface;
1917

2018
/**
2119
* @author Denis Zunke <[email protected]>
@@ -28,6 +26,4 @@ interface AgentInterface
2826
* @throws ExceptionInterface When the agent encounters an error (e.g., unsupported model capabilities, invalid arguments, network failures, or processor errors)
2927
*/
3028
public function call(MessageBagInterface $messages, array $options = []): ResultInterface;
31-
32-
public function getId(): AbstractUid&TimeBasedUidInterface;
3329
}

src/agent/src/Chat.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,16 @@
1717
use Symfony\AI\Platform\Message\MessageBagInterface;
1818
use Symfony\AI\Platform\Message\UserMessage;
1919
use Symfony\AI\Platform\Result\TextResult;
20+
use Symfony\Component\Uid\AbstractUid;
21+
use Symfony\Component\Uid\TimeBasedUidInterface;
2022

2123
/**
2224
* @author Christopher Hertel <[email protected]>
2325
*/
2426
final readonly class Chat implements ChatInterface
2527
{
28+
private AbstractUid&TimeBasedUidInterface $currentMessageBag;
29+
2630
public function __construct(
2731
private AgentInterface $agent,
2832
private MessageStoreInterface $store,
@@ -31,15 +35,15 @@ public function __construct(
3135

3236
public function initiate(MessageBagInterface $messages): void
3337
{
34-
$messages->setSession($this->agent->getId());
35-
36-
$this->store->clear($messages->getSession());
38+
$this->store->clear();
3739
$this->store->save($messages);
40+
41+
$this->currentMessageBag = $messages->getId();
3842
}
3943

4044
public function submit(UserMessage $message): AssistantMessage
4145
{
42-
$messagesBag = $this->store->load($this->agent->getId());
46+
$messagesBag = $this->store->load($this->currentMessageBag);
4347

4448
$messagesBag->add($message);
4549
$result = $this->agent->call($messagesBag);

src/agent/src/Chat/MessageStore/CacheStore.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,23 +32,23 @@ public function __construct(
3232

3333
public function save(MessageBagInterface $messages): void
3434
{
35-
$item = $this->cache->getItem($messages->getSession()->toRfc4122());
35+
$item = $this->cache->getItem($messages->getId()->toRfc4122());
3636

3737
$item->set($messages);
3838
$item->expiresAfter($this->ttl);
3939

4040
$this->cache->save($item);
4141
}
4242

43-
public function load(AbstractUid&TimeBasedUidInterface $session): MessageBagInterface
43+
public function load(AbstractUid&TimeBasedUidInterface $id): MessageBagInterface
4444
{
45-
$item = $this->cache->getItem($session->toRfc4122());
45+
$item = $this->cache->getItem($id->toRfc4122());
4646

4747
return $item->isHit() ? $item->get() : new MessageBag();
4848
}
4949

50-
public function clear(AbstractUid&TimeBasedUidInterface $session): void
50+
public function clear(): void
5151
{
52-
$this->cache->deleteItem($session->toRfc4122());
52+
$this->cache->clear();
5353
}
5454
}

src/agent/src/Chat/MessageStore/InMemoryStore.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,16 @@ final class InMemoryStore implements MessageStoreInterface
2626

2727
public function save(MessageBagInterface $messages): void
2828
{
29-
$this->messageBags[$messages->getSession()->toRfc4122()] = $messages;
29+
$this->messageBags[$messages->getId()->toRfc4122()] = $messages;
3030
}
3131

32-
public function load(AbstractUid&TimeBasedUidInterface $session): MessageBagInterface
32+
public function load(AbstractUid&TimeBasedUidInterface $id): MessageBagInterface
3333
{
34-
return $this->messageBags[$session->toRfc4122()] ?? new MessageBag();
34+
return $this->messageBags[$id->toRfc4122()] ?? new MessageBag();
3535
}
3636

37-
public function clear(AbstractUid&TimeBasedUidInterface $session): void
37+
public function clear(): void
3838
{
39-
$this->messageBags[$session->toRfc4122()] = new MessageBag();
39+
$this->messageBags = [];
4040
}
4141
}

src/agent/src/Chat/MessageStore/SessionStore.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,22 @@ public function __construct(
3030
if (!class_exists(RequestStack::class)) {
3131
throw new RuntimeException('For using the SessionStore as message store, the symfony/http-foundation package is required. Try running "composer require symfony/http-foundation".');
3232
}
33+
3334
$this->session = $requestStack->getSession();
3435
}
3536

3637
public function save(MessageBagInterface $messages): void
3738
{
38-
$this->session->set($messages->getSession()->toRfc4122(), $messages);
39+
$this->session->set($messages->getId()->toRfc4122(), $messages);
3940
}
4041

41-
public function load(AbstractUid&TimeBasedUidInterface $session): MessageBagInterface
42+
public function load(AbstractUid&TimeBasedUidInterface $id): MessageBagInterface
4243
{
43-
return $this->session->get($session->toRfc4122(), new MessageBag());
44+
return $this->session->get($id->toRfc4122(), new MessageBag());
4445
}
4546

46-
public function clear(AbstractUid&TimeBasedUidInterface $session): void
47+
public function clear(): void
4748
{
48-
$this->session->remove($session->toRfc4122());
49+
$this->session->clear();
4950
}
5051
}

src/agent/src/Chat/MessageStoreInterface.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ interface MessageStoreInterface
1919
{
2020
public function save(MessageBagInterface $messages): void;
2121

22-
public function load(AbstractUid&TimeBasedUidInterface $session): MessageBagInterface;
22+
public function load(AbstractUid&TimeBasedUidInterface $id): MessageBagInterface;
2323

24-
public function clear(AbstractUid&TimeBasedUidInterface $session): void;
24+
public function clear(): void;
2525
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\AI\Agent\Tests\Chat;
13+
14+
use PHPUnit\Framework\Attributes\CoversClass;
15+
use PHPUnit\Framework\Attributes\UsesClass;
16+
use PHPUnit\Framework\TestCase;
17+
use Symfony\AI\Agent\Chat\MessageStore\InMemoryStore;
18+
use Symfony\AI\Platform\Message\Message;
19+
use Symfony\AI\Platform\Message\MessageBag;
20+
21+
#[CoversClass(InMemoryStore::class)]
22+
#[UsesClass(MessageBag::class)]
23+
#[UsesClass(Message::class)]
24+
final class InMemoryStoreTest extends TestCase
25+
{
26+
public function testItCanStore()
27+
{
28+
$messageBag = new MessageBag();
29+
$messageBag->add(Message::ofUser('Hello'));
30+
31+
$store = new InMemoryStore();
32+
$store->save($messageBag);
33+
34+
$this->assertCount(1, $store->load($messageBag->getId()));
35+
}
36+
37+
public function testItCanStoreMultipleMessageBags()
38+
{
39+
$firstMessageBag = new MessageBag();
40+
$firstMessageBag->add(Message::ofUser('Hello'));
41+
42+
$secondMessageBag = new MessageBag();
43+
44+
$store = new InMemoryStore();
45+
$store->save($firstMessageBag);
46+
$store->save($secondMessageBag);
47+
48+
$this->assertCount(1, $store->load($firstMessageBag->getId()));
49+
$this->assertCount(0, $store->load($secondMessageBag->getId()));
50+
}
51+
52+
public function testItCanClear()
53+
{
54+
$firstMessageBag = new MessageBag();
55+
$firstMessageBag->add(Message::ofUser('Hello'));
56+
57+
$secondMessageBag = new MessageBag();
58+
59+
$store = new InMemoryStore();
60+
$store->save($firstMessageBag);
61+
$store->save($secondMessageBag);
62+
63+
$this->assertCount(1, $store->load($firstMessageBag->getId()));
64+
$this->assertCount(0, $store->load($secondMessageBag->getId()));
65+
66+
$store->clear();
67+
68+
$this->assertCount(0, $store->load($firstMessageBag->getId()));
69+
$this->assertCount(0, $store->load($secondMessageBag->getId()));
70+
}
71+
}

src/ai-bundle/config/options.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,33 @@
336336
->end()
337337
->end()
338338
->end()
339+
->arrayNode('message_store')
340+
->children()
341+
->arrayNode('cache')
342+
->normalizeKeys(false)
343+
->useAttributeAsKey('name')
344+
->arrayPrototype()
345+
->children()
346+
->scalarNode('service')->cannotBeEmpty()->defaultValue('cache.app')->end()
347+
->end()
348+
->end()
349+
->end()
350+
->end()
351+
->end()
352+
->arrayNode('chat')
353+
->normalizeKeys(false)
354+
->useAttributeAsKey('name')
355+
->arrayPrototype()
356+
->children()
357+
->scalarNode('agent')
358+
->info('Name of the agent used for the chat')
359+
->end()
360+
->scalarNode('message_store')
361+
->info('Name of the message store')
362+
->end()
363+
->end()
364+
->end()
365+
->end()
339366
->end()
340367
;
341368
};

src/ai-bundle/doc/index.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,15 @@ Configuration
9898
model:
9999
class: 'Symfony\AI\Platform\Bridge\Mistral\Embeddings'
100100
name: !php/const Symfony\AI\Platform\Bridge\Mistral\Embeddings::MISTRAL_EMBED
101+
message_store:
102+
cache:
103+
main:
104+
service: 'cache.app'
105+
chat:
106+
main:
107+
agent: 'research'
108+
message_store: 'main'
109+
101110
102111
Usage
103112
-----

0 commit comments

Comments
 (0)