|
17 | 17 | use Symfony\AI\Agent\AgentInterface;
|
18 | 18 | use Symfony\AI\Agent\Attribute\AsInputProcessor;
|
19 | 19 | use Symfony\AI\Agent\Attribute\AsOutputProcessor;
|
| 20 | +use Symfony\AI\Agent\Chat\MessageStoreInterface; |
20 | 21 | use Symfony\AI\Agent\InputProcessor\SystemPromptInputProcessor;
|
21 | 22 | use Symfony\AI\Agent\InputProcessorInterface;
|
22 | 23 | use Symfony\AI\Agent\Memory\MemoryInputProcessor;
|
|
34 | 35 | use Symfony\AI\AiBundle\Profiler\TraceablePlatform;
|
35 | 36 | use Symfony\AI\AiBundle\Profiler\TraceableToolbox;
|
36 | 37 | use Symfony\AI\AiBundle\Security\Attribute\IsGrantedTool;
|
| 38 | +use Symfony\AI\Chat\Bridge\HttpFoundation\SessionStore; |
37 | 39 | use Symfony\AI\Platform\Bridge\Anthropic\PlatformFactory as AnthropicPlatformFactory;
|
38 | 40 | use Symfony\AI\Platform\Bridge\Azure\OpenAi\PlatformFactory as AzureOpenAiPlatformFactory;
|
39 | 41 | use Symfony\AI\Platform\Bridge\Cerebras\PlatformFactory as CerebrasPlatformFactory;
|
@@ -161,6 +163,21 @@ public function loadExtension(array $config, ContainerConfigurator $container, C
|
161 | 163 | $builder->removeDefinition('ai.command.drop_store');
|
162 | 164 | }
|
163 | 165 |
|
| 166 | + foreach ($config['message_store'] ?? [] as $type => $store) { |
| 167 | + $this->processMessageStoreConfig($type, $store, $builder); |
| 168 | + } |
| 169 | + |
| 170 | + $messageStores = array_keys($builder->findTaggedServiceIds('ai.message_store')); |
| 171 | + |
| 172 | + if (1 === \count($messageStores)) { |
| 173 | + $builder->setAlias(MessageStoreInterface::class, reset($messageStores)); |
| 174 | + } |
| 175 | + |
| 176 | + if ([] === $messageStores) { |
| 177 | + $builder->removeDefinition('ai.command.setup_message_store'); |
| 178 | + $builder->removeDefinition('ai.command.drop_message_store'); |
| 179 | + } |
| 180 | + |
164 | 181 | foreach ($config['vectorizer'] ?? [] as $vectorizerName => $vectorizer) {
|
165 | 182 | $this->processVectorizerConfig($vectorizerName, $vectorizer, $builder);
|
166 | 183 | }
|
@@ -1191,6 +1208,62 @@ private function processStoreConfig(string $type, array $stores, ContainerBuilde
|
1191 | 1208 | }
|
1192 | 1209 | }
|
1193 | 1210 |
|
| 1211 | + /** |
| 1212 | + * @param array<string, mixed> $messageStores |
| 1213 | + */ |
| 1214 | + private function processMessageStoreConfig(string $type, array $messageStores, ContainerBuilder $container): void |
| 1215 | + { |
| 1216 | + if ('memory' === $type) { |
| 1217 | + foreach ($messageStores as $name => $messageStore) { |
| 1218 | + $definition = new Definition(InMemoryStore::class); |
| 1219 | + $definition |
| 1220 | + ->setArgument(0, $messageStore['identifier']) |
| 1221 | + ->addTag('ai.message_store'); |
| 1222 | + |
| 1223 | + $container->setDefinition('ai.message_store.'.$type.'.'.$name, $definition); |
| 1224 | + $container->registerAliasForArgument('ai.message_store.'.$type.'.'.$name, MessageStoreInterface::class, $name); |
| 1225 | + $container->registerAliasForArgument('ai.message_store.'.$type.'.'.$name, MessageStoreInterface::class, $type.'_'.$name); |
| 1226 | + } |
| 1227 | + } |
| 1228 | + |
| 1229 | + if ('cache' === $type) { |
| 1230 | + foreach ($messageStores as $name => $messageStore) { |
| 1231 | + $arguments = [ |
| 1232 | + new Reference($messageStore['service']), |
| 1233 | + ]; |
| 1234 | + |
| 1235 | + if (\array_key_exists('key', $messageStore)) { |
| 1236 | + $arguments['key'] = $messageStore['key']; |
| 1237 | + } |
| 1238 | + |
| 1239 | + $definition = new Definition(CacheStore::class); |
| 1240 | + $definition |
| 1241 | + ->setArguments($arguments) |
| 1242 | + ->addTag('ai.message_store'); |
| 1243 | + |
| 1244 | + $container->setDefinition('ai.message_store.'.$type.'.'.$name, $definition); |
| 1245 | + $container->registerAliasForArgument('ai.message_store.'.$type.'.'.$name, MessageStoreInterface::class, $name); |
| 1246 | + $container->registerAliasForArgument('ai.message_store.'.$type.'.'.$name, MessageStoreInterface::class, $type.'_'.$name); |
| 1247 | + } |
| 1248 | + } |
| 1249 | + |
| 1250 | + if ('session' === $type) { |
| 1251 | + foreach ($messageStores as $name => $messageStore) { |
| 1252 | + $definition = new Definition(SessionStore::class); |
| 1253 | + $definition |
| 1254 | + ->setArguments([ |
| 1255 | + new Reference('request_stack'), |
| 1256 | + $messageStore['identifier'], |
| 1257 | + ]) |
| 1258 | + ->addTag('ai.message_store'); |
| 1259 | + |
| 1260 | + $container->setDefinition('ai.message_store.'.$type.'.'.$name, $definition); |
| 1261 | + $container->registerAliasForArgument('ai.message_store.'.$type.'.'.$name, MessageStoreInterface::class, $name); |
| 1262 | + $container->registerAliasForArgument('ai.message_store.'.$type.'.'.$name, MessageStoreInterface::class, $type.'_'.$name); |
| 1263 | + } |
| 1264 | + } |
| 1265 | + } |
| 1266 | + |
1194 | 1267 | /**
|
1195 | 1268 | * @param array<string, mixed> $config
|
1196 | 1269 | */
|
|
0 commit comments