1818use PHPUnit \Framework \Attributes \UsesClass ;
1919use PHPUnit \Framework \TestCase ;
2020use Symfony \AI \AiBundle \AiBundle ;
21+ use Symfony \AI \Platform \Bridge \OpenAi \Embeddings ;
22+ use Symfony \AI \Store \Document \Vectorizer ;
2123use Symfony \Component \Config \Definition \Exception \InvalidConfigurationException ;
2224use Symfony \Component \DependencyInjection \ContainerBuilder ;
2325use Symfony \Component \DependencyInjection \Definition ;
@@ -591,6 +593,77 @@ public function testOpenAiPlatformWithInvalidRegion()
591593 ]);
592594 }
593595
596+ public function testVectorizerConfiguration ()
597+ {
598+ $ container = $ this ->buildContainer ([
599+ 'ai ' => [
600+ 'vectorizer ' => [
601+ 'my_vectorizer ' => [
602+ 'platform ' => 'my_platform_service_id ' ,
603+ 'model ' => [
604+ 'class ' => 'Symfony\AI\Platform\Bridge\OpenAi\Embeddings ' ,
605+ 'name ' => 'text-embedding-3-small ' ,
606+ 'options ' => ['dimension ' => 512 ],
607+ ],
608+ ],
609+ ],
610+ ],
611+ ]);
612+
613+ $ this ->assertTrue ($ container ->hasDefinition ('ai.vectorizer.my_vectorizer ' ));
614+ $ this ->assertTrue ($ container ->hasDefinition ('ai.vectorizer.my_vectorizer.model ' ));
615+
616+ $ vectorizerDefinition = $ container ->getDefinition ('ai.vectorizer.my_vectorizer ' );
617+ $ this ->assertSame (Vectorizer::class, $ vectorizerDefinition ->getClass ());
618+ $ this ->assertTrue ($ vectorizerDefinition ->hasTag ('ai.vectorizer ' ));
619+
620+ $ modelDefinition = $ container ->getDefinition ('ai.vectorizer.my_vectorizer.model ' );
621+ $ this ->assertSame (Embeddings::class, $ modelDefinition ->getClass ());
622+ $ this ->assertTrue ($ modelDefinition ->hasTag ('ai.model.embeddings_model ' ));
623+ }
624+
625+ public function testIndexerWithConfiguredVectorizer ()
626+ {
627+ $ container = $ this ->buildContainer ([
628+ 'ai ' => [
629+ 'store ' => [
630+ 'memory ' => [
631+ 'my_store ' => [],
632+ ],
633+ ],
634+ 'vectorizer ' => [
635+ 'my_vectorizer ' => [
636+ 'platform ' => 'my_platform_service_id ' ,
637+ 'model ' => [
638+ 'class ' => 'Symfony\AI\Platform\Bridge\OpenAi\Embeddings ' ,
639+ 'name ' => 'text-embedding-3-small ' ,
640+ ],
641+ ],
642+ ],
643+ 'indexer ' => [
644+ 'my_indexer ' => [
645+ 'vectorizer ' => 'ai.vectorizer.my_vectorizer ' ,
646+ 'store ' => 'ai.store.memory.my_store ' ,
647+ ],
648+ ],
649+ ],
650+ ]);
651+
652+ $ this ->assertTrue ($ container ->hasDefinition ('ai.indexer.my_indexer ' ));
653+ $ this ->assertTrue ($ container ->hasDefinition ('ai.vectorizer.my_vectorizer ' ));
654+
655+ $ indexerDefinition = $ container ->getDefinition ('ai.indexer.my_indexer ' );
656+ $ arguments = $ indexerDefinition ->getArguments ();
657+
658+ // First argument should be a reference to the vectorizer
659+ $ this ->assertInstanceOf (Reference::class, $ arguments [0 ]);
660+ $ this ->assertSame ('ai.vectorizer.my_vectorizer ' , (string ) $ arguments [0 ]);
661+
662+ // Should not create model-specific vectorizer when using configured one
663+ $ this ->assertFalse ($ container ->hasDefinition ('ai.indexer.my_indexer.vectorizer ' ));
664+ $ this ->assertFalse ($ container ->hasDefinition ('ai.indexer.my_indexer.model ' ));
665+ }
666+
594667 private function buildContainer (array $ configuration ): ContainerBuilder
595668 {
596669 $ container = new ContainerBuilder ();
@@ -838,9 +911,8 @@ private function getFullConfig(): array
838911 ],
839912 ],
840913 ],
841- 'indexer ' => [
842- 'my_text_indexer ' => [
843- 'store ' => 'my_azure_search_store_service_id ' ,
914+ 'vectorizer ' => [
915+ 'test_vectorizer ' => [
844916 'platform ' => 'mistral_platform_service_id ' ,
845917 'model ' => [
846918 'class ' => 'Symfony\AI\Platform\Bridge\Mistral\Embeddings ' ,
@@ -849,6 +921,12 @@ private function getFullConfig(): array
849921 ],
850922 ],
851923 ],
924+ 'indexer ' => [
925+ 'my_text_indexer ' => [
926+ 'vectorizer ' => 'ai.vectorizer.test_vectorizer ' ,
927+ 'store ' => 'my_azure_search_store_service_id ' ,
928+ ],
929+ ],
852930 ],
853931 ];
854932 }
0 commit comments