Skip to content

Commit 3d1112e

Browse files
fix code review
1 parent 04f14a9 commit 3d1112e

File tree

7 files changed

+59
-47
lines changed

7 files changed

+59
-47
lines changed

examples/platform/message-templates.php

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@
1414
use Symfony\AI\Platform\Message\Message;
1515
use Symfony\AI\Platform\Message\MessageBag;
1616
use Symfony\AI\Platform\Message\Template;
17+
use Symfony\AI\Platform\Message\TemplateRenderer\ChainTemplateRenderer;
1718
use Symfony\AI\Platform\Message\TemplateRenderer\StringTemplateRenderer;
18-
use Symfony\AI\Platform\Message\TemplateRenderer\TemplateRendererRegistry;
1919
use Symfony\Component\EventDispatcher\EventDispatcher;
2020

2121
require_once dirname(__DIR__).'/bootstrap.php';
2222

2323
$eventDispatcher = new EventDispatcher();
24-
$rendererRegistry = new TemplateRendererRegistry([
24+
$rendererRegistry = new ChainTemplateRenderer([
2525
new StringTemplateRenderer(),
2626
]);
2727
$templateListener = new TemplateRendererListener($rendererRegistry);
@@ -32,18 +32,18 @@
3232
echo "Example 1: SystemMessage with template\n";
3333
echo "=======================================\n\n";
3434

35-
$template = Template::string('You are a {role} assistant.');
35+
$template = Template::string('You are a {domain} expert assistant.');
3636
$messages = new MessageBag(
3737
Message::forSystem($template),
3838
Message::ofUser('What is PHP?')
3939
);
4040

4141
$result = $platform->invoke('gpt-4o-mini', $messages, [
42-
'template_vars' => ['role' => 'helpful'],
42+
'template_vars' => ['domain' => 'programming'],
4343
]);
4444

45-
echo "SystemMessage template: You are a {role} assistant.\n";
46-
echo "Variables: ['role' => 'helpful']\n";
45+
echo "SystemMessage template: You are a {domain} expert assistant.\n";
46+
echo "Variables: ['domain' => 'programming']\n";
4747
echo 'Response: '.$result->asText()."\n\n";
4848

4949
echo "Example 2: UserMessage with template\n";
@@ -65,7 +65,7 @@
6565
echo "Example 3: Multiple messages with templates\n";
6666
echo "============================================\n\n";
6767

68-
$systemTemplate = Template::string('You are a {role} assistant.');
68+
$systemTemplate = Template::string('You are a {domain} assistant.');
6969
$userTemplate = Template::string('Calculate {operation}');
7070

7171
$messages = new MessageBag(
@@ -75,14 +75,14 @@
7575

7676
$result = $platform->invoke('gpt-4o-mini', $messages, [
7777
'template_vars' => [
78-
'role' => 'helpful',
78+
'domain' => 'math',
7979
'operation' => '2 + 2',
8080
],
8181
]);
8282

83-
echo "System template: You are a {role} assistant.\n";
83+
echo "System template: You are a {domain} assistant.\n";
8484
echo "User template: Calculate {operation}\n";
85-
echo "Variables: ['role' => 'helpful', 'operation' => '2 + 2']\n";
85+
echo "Variables: ['domain' => 'math', 'operation' => '2 + 2']\n";
8686
echo 'Response: '.$result->asText()."\n\n";
8787

8888
echo "Example 4: UserMessage with mixed content\n";

src/ai-bundle/config/services.php

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,16 +63,17 @@
6363
use Symfony\AI\Platform\Contract\JsonSchema\DescriptionParser;
6464
use Symfony\AI\Platform\Contract\JsonSchema\Factory as SchemaFactory;
6565
use Symfony\AI\Platform\EventListener\TemplateRendererListener;
66+
use Symfony\AI\Platform\Message\TemplateRenderer\ChainTemplateRenderer;
6667
use Symfony\AI\Platform\Message\TemplateRenderer\ExpressionLanguageTemplateRenderer;
6768
use Symfony\AI\Platform\Message\TemplateRenderer\StringTemplateRenderer;
68-
use Symfony\AI\Platform\Message\TemplateRenderer\TemplateRendererRegistry;
6969
use Symfony\AI\Platform\Serializer\StructuredOutputSerializer;
7070
use Symfony\AI\Platform\StructuredOutput\PlatformSubscriber;
7171
use Symfony\AI\Platform\StructuredOutput\ResponseFormatFactory;
7272
use Symfony\AI\Platform\StructuredOutput\ResponseFormatFactoryInterface;
7373
use Symfony\AI\Store\Command\DropStoreCommand;
7474
use Symfony\AI\Store\Command\IndexCommand;
7575
use Symfony\AI\Store\Command\SetupStoreCommand;
76+
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
7677

7778
return static function (ContainerConfigurator $container): void {
7879
$container->services()
@@ -117,13 +118,19 @@
117118

118119
// message templates
119120
->set('ai.platform.template_renderer.string', StringTemplateRenderer::class)
120-
->tag('ai.platform.template_renderer')
121-
->set('ai.platform.template_renderer.expression', ExpressionLanguageTemplateRenderer::class)
122-
->args([
123-
service('expression_language')->nullOnInvalid(),
124-
])
125-
->tag('ai.platform.template_renderer')
126-
->set('ai.platform.template_renderer_registry', TemplateRendererRegistry::class)
121+
->tag('ai.platform.template_renderer');
122+
123+
if (class_exists(ExpressionLanguage::class)) {
124+
$container->services()
125+
->set('ai.platform.template_renderer.expression', ExpressionLanguageTemplateRenderer::class)
126+
->args([
127+
service('expression_language'),
128+
])
129+
->tag('ai.platform.template_renderer');
130+
}
131+
132+
$container->services()
133+
->set('ai.platform.template_renderer_registry', ChainTemplateRenderer::class)
127134
->args([
128135
tagged_iterator('ai.platform.template_renderer'),
129136
])

src/ai-bundle/tests/DependencyInjection/AiBundleTest.php

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@
2929
use Symfony\AI\Platform\Bridge\Ollama\OllamaApiCatalog;
3030
use Symfony\AI\Platform\Capability;
3131
use Symfony\AI\Platform\EventListener\TemplateRendererListener;
32+
use Symfony\AI\Platform\Message\TemplateRenderer\ChainTemplateRenderer;
3233
use Symfony\AI\Platform\Message\TemplateRenderer\ExpressionLanguageTemplateRenderer;
3334
use Symfony\AI\Platform\Message\TemplateRenderer\StringTemplateRenderer;
34-
use Symfony\AI\Platform\Message\TemplateRenderer\TemplateRendererRegistry;
3535
use Symfony\AI\Platform\Model;
3636
use Symfony\AI\Store\Bridge\Azure\SearchStore as AzureStore;
3737
use Symfony\AI\Store\Bridge\ChromaDb\Store as ChromaDbStore;
@@ -58,6 +58,7 @@
5858
use Symfony\Component\DependencyInjection\Definition;
5959
use Symfony\Component\DependencyInjection\Reference;
6060
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
61+
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
6162
use Symfony\Component\HttpClient\HttpClient;
6263
use Symfony\Component\Translation\TranslatableMessage;
6364
use Symfony\Contracts\HttpClient\HttpClientInterface;
@@ -4432,16 +4433,20 @@ public function testTemplateRendererServicesAreRegistered()
44324433
$this->assertSame(StringTemplateRenderer::class, $stringRendererDefinition->getClass());
44334434
$this->assertTrue($stringRendererDefinition->hasTag('ai.platform.template_renderer'));
44344435

4435-
// Verify expression template renderer is registered
4436-
$this->assertTrue($container->hasDefinition('ai.platform.template_renderer.expression'));
4437-
$expressionRendererDefinition = $container->getDefinition('ai.platform.template_renderer.expression');
4438-
$this->assertSame(ExpressionLanguageTemplateRenderer::class, $expressionRendererDefinition->getClass());
4439-
$this->assertTrue($expressionRendererDefinition->hasTag('ai.platform.template_renderer'));
4436+
// Verify expression template renderer is registered only when ExpressionLanguage is available
4437+
if (class_exists(ExpressionLanguage::class)) {
4438+
$this->assertTrue($container->hasDefinition('ai.platform.template_renderer.expression'));
4439+
$expressionRendererDefinition = $container->getDefinition('ai.platform.template_renderer.expression');
4440+
$this->assertSame(ExpressionLanguageTemplateRenderer::class, $expressionRendererDefinition->getClass());
4441+
$this->assertTrue($expressionRendererDefinition->hasTag('ai.platform.template_renderer'));
4442+
} else {
4443+
$this->assertFalse($container->hasDefinition('ai.platform.template_renderer.expression'));
4444+
}
44404445

44414446
// Verify template renderer registry is registered
44424447
$this->assertTrue($container->hasDefinition('ai.platform.template_renderer_registry'));
44434448
$registryDefinition = $container->getDefinition('ai.platform.template_renderer_registry');
4444-
$this->assertSame(TemplateRendererRegistry::class, $registryDefinition->getClass());
4449+
$this->assertSame(ChainTemplateRenderer::class, $registryDefinition->getClass());
44454450

44464451
// Verify template renderer listener is registered as event subscriber
44474452
$this->assertTrue($container->hasDefinition('ai.platform.template_renderer_listener'));

src/platform/src/EventListener/TemplateRendererListener.php

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
use Symfony\AI\Platform\Message\MessageInterface;
1818
use Symfony\AI\Platform\Message\SystemMessage;
1919
use Symfony\AI\Platform\Message\Template;
20-
use Symfony\AI\Platform\Message\TemplateRenderer\TemplateRendererRegistry;
20+
use Symfony\AI\Platform\Message\TemplateRenderer\ChainTemplateRenderer;
2121
use Symfony\AI\Platform\Message\UserMessage;
2222
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
2323

@@ -29,10 +29,17 @@
2929
final readonly class TemplateRendererListener implements EventSubscriberInterface
3030
{
3131
public function __construct(
32-
private TemplateRendererRegistry $rendererRegistry,
32+
private ChainTemplateRenderer $rendererRegistry,
3333
) {
3434
}
3535

36+
public static function getSubscribedEvents(): array
37+
{
38+
return [
39+
InvocationEvent::class => '__invoke',
40+
];
41+
}
42+
3643
public function __invoke(InvocationEvent $event): void
3744
{
3845
$options = $event->getOptions();
@@ -58,13 +65,6 @@ public function __invoke(InvocationEvent $event): void
5865
$event->setOptions($options);
5966
}
6067

61-
public static function getSubscribedEvents(): array
62-
{
63-
return [
64-
InvocationEvent::class => '__invoke',
65-
];
66-
}
67-
6868
/**
6969
* @param array<string, mixed> $templateVars
7070
*/

src/platform/src/Message/TemplateRenderer/TemplateRendererRegistry.php renamed to src/platform/src/Message/TemplateRenderer/ChainTemplateRenderer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
*
2222
* @author Johannes Wachter <johannes@sulu.io>
2323
*/
24-
final readonly class TemplateRendererRegistry implements TemplateRendererInterface
24+
final readonly class ChainTemplateRenderer implements TemplateRendererInterface
2525
{
2626
/**
2727
* @var TemplateRendererInterface[]

src/platform/tests/EventListener/TemplateRendererListenerTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
use Symfony\AI\Platform\Message\Message;
1919
use Symfony\AI\Platform\Message\MessageBag;
2020
use Symfony\AI\Platform\Message\Template;
21+
use Symfony\AI\Platform\Message\TemplateRenderer\ChainTemplateRenderer;
2122
use Symfony\AI\Platform\Message\TemplateRenderer\StringTemplateRenderer;
22-
use Symfony\AI\Platform\Message\TemplateRenderer\TemplateRendererRegistry;
2323
use Symfony\AI\Platform\Model;
2424

2525
final class TemplateRendererListenerTest extends TestCase
@@ -29,7 +29,7 @@ final class TemplateRendererListenerTest extends TestCase
2929

3030
protected function setUp(): void
3131
{
32-
$registry = new TemplateRendererRegistry([
32+
$registry = new ChainTemplateRenderer([
3333
new StringTemplateRenderer(),
3434
]);
3535

src/platform/tests/Message/TemplateRenderer/TemplateRendererRegistryTest.php renamed to src/platform/tests/Message/TemplateRenderer/ChainTemplateRendererTest.php

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@
1414
use PHPUnit\Framework\TestCase;
1515
use Symfony\AI\Platform\Exception\InvalidArgumentException;
1616
use Symfony\AI\Platform\Message\Template;
17+
use Symfony\AI\Platform\Message\TemplateRenderer\ChainTemplateRenderer;
1718
use Symfony\AI\Platform\Message\TemplateRenderer\StringTemplateRenderer;
1819
use Symfony\AI\Platform\Message\TemplateRenderer\TemplateRendererInterface;
19-
use Symfony\AI\Platform\Message\TemplateRenderer\TemplateRendererRegistry;
2020

21-
final class TemplateRendererRegistryTest extends TestCase
21+
final class ChainTemplateRendererTest extends TestCase
2222
{
2323
public function testRenderWithSupportedType(): void
2424
{
25-
$registry = new TemplateRendererRegistry([
25+
$registry = new ChainTemplateRenderer([
2626
new StringTemplateRenderer(),
2727
]);
2828

@@ -49,7 +49,7 @@ public function render(Template $template, array $variables): string
4949

5050
$renderer2 = new StringTemplateRenderer();
5151

52-
$registry = new TemplateRendererRegistry([$renderer1, $renderer2]);
52+
$registry = new ChainTemplateRenderer([$renderer1, $renderer2]);
5353

5454
$template = Template::string('Hello {name}!');
5555

@@ -60,7 +60,7 @@ public function render(Template $template, array $variables): string
6060

6161
public function testThrowsExceptionForUnsupportedType(): void
6262
{
63-
$registry = new TemplateRendererRegistry([
63+
$registry = new ChainTemplateRenderer([
6464
new StringTemplateRenderer(),
6565
]);
6666

@@ -74,7 +74,7 @@ public function testThrowsExceptionForUnsupportedType(): void
7474

7575
public function testAcceptsIterableOfRenderers(): void
7676
{
77-
$registry = new TemplateRendererRegistry(new \ArrayIterator([
77+
$registry = new ChainTemplateRenderer(new \ArrayIterator([
7878
new StringTemplateRenderer(),
7979
]));
8080

@@ -87,7 +87,7 @@ public function testAcceptsIterableOfRenderers(): void
8787

8888
public function testImplementsRendererInterface(): void
8989
{
90-
$registry = new TemplateRendererRegistry([
90+
$registry = new ChainTemplateRenderer([
9191
new StringTemplateRenderer(),
9292
]);
9393

@@ -96,7 +96,7 @@ public function testImplementsRendererInterface(): void
9696

9797
public function testSupportsMethod(): void
9898
{
99-
$registry = new TemplateRendererRegistry([
99+
$registry = new ChainTemplateRenderer([
100100
new StringTemplateRenderer(),
101101
]);
102102

@@ -106,11 +106,11 @@ public function testSupportsMethod(): void
106106

107107
public function testCanBeNestedAsComposite(): void
108108
{
109-
$innerRegistry = new TemplateRendererRegistry([
109+
$innerRegistry = new ChainTemplateRenderer([
110110
new StringTemplateRenderer(),
111111
]);
112112

113-
$outerRegistry = new TemplateRendererRegistry([
113+
$outerRegistry = new ChainTemplateRenderer([
114114
$innerRegistry,
115115
]);
116116

0 commit comments

Comments
 (0)