Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions config/options.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,18 @@
->end()
->end()
->end()
->arrayNode('bedrock')
->useAttributeAsKey('name')
->arrayPrototype()
->children()
->stringNode('bedrock_runtime_client')
->defaultNull()
->info('Service ID of the Bedrock runtime client to use')
->end()
->stringNode('model_catalog')->defaultNull()->end()
->end()
->end()
->end()
->arrayNode('cache')
->useAttributeAsKey('name')
->arrayPrototype()
Expand Down
2 changes: 2 additions & 0 deletions config/services.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
use Symfony\AI\Platform\Bridge\Anthropic\Contract\AnthropicContract;
use Symfony\AI\Platform\Bridge\Anthropic\ModelCatalog as AnthropicModelCatalog;
use Symfony\AI\Platform\Bridge\Azure\OpenAi\ModelCatalog as AzureOpenAiModelCatalog;
use Symfony\AI\Platform\Bridge\Bedrock\ModelCatalog as BedrockModelCatalog;
use Symfony\AI\Platform\Bridge\Cartesia\ModelCatalog as CartesiaModelCatalog;
use Symfony\AI\Platform\Bridge\Cerebras\ModelCatalog as CerebrasModelCatalog;
use Symfony\AI\Platform\Bridge\Decart\ModelCatalog as DecartModelCatalog;
Expand Down Expand Up @@ -96,6 +97,7 @@
->set('ai.platform.model_catalog.albert', AlbertModelCatalog::class)
->set('ai.platform.model_catalog.anthropic', AnthropicModelCatalog::class)
->set('ai.platform.model_catalog.azure.openai', AzureOpenAiModelCatalog::class)
->set('ai.platform.model_catalog.bedrock', BedrockModelCatalog::class)
->set('ai.platform.model_catalog.cartesia', CartesiaModelCatalog::class)
->set('ai.platform.model_catalog.cerebras', CerebrasModelCatalog::class)
->set('ai.platform.model_catalog.decart', DecartModelCatalog::class)
Expand Down
42 changes: 34 additions & 8 deletions src/AiBundle.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
use Symfony\AI\Platform\Bridge\Albert\PlatformFactory as AlbertPlatformFactory;
use Symfony\AI\Platform\Bridge\Anthropic\PlatformFactory as AnthropicPlatformFactory;
use Symfony\AI\Platform\Bridge\Azure\OpenAi\PlatformFactory as AzureOpenAiPlatformFactory;
use Symfony\AI\Platform\Bridge\Bedrock\PlatformFactory as BedrockFactory;
use Symfony\AI\Platform\Bridge\Cartesia\PlatformFactory as CartesiaPlatformFactory;
use Symfony\AI\Platform\Bridge\Cerebras\PlatformFactory as CerebrasPlatformFactory;
use Symfony\AI\Platform\Bridge\Decart\PlatformFactory as DecartPlatformFactory;
Expand Down Expand Up @@ -380,11 +381,11 @@ private function processPlatformConfig(string $type, array $platform, ContainerB
}

if ('azure' === $type) {
if (!ContainerBuilder::willBeAvailable('symfony/ai-azure-platform', AzureOpenAiPlatformFactory::class, ['symfony/ai-bundle'])) {
throw new RuntimeException('Azure platform configuration requires "symfony/ai-azure-platform" package. Try running "composer require symfony/ai-azure-platform".');
}

foreach ($platform as $name => $config) {
if (!ContainerBuilder::willBeAvailable('symfony/ai-azure-platform', AzureOpenAiPlatformFactory::class, ['symfony/ai-bundle'])) {
throw new RuntimeException('Azure platform configuration requires "symfony/ai-azure-platform" package. Try running "composer require symfony/ai-azure-platform".');
}

$platformId = 'ai.platform.azure.'.$name;
$definition = (new Definition(Platform::class))
->setFactory(AzureOpenAiPlatformFactory::class.'::create')
Expand All @@ -408,6 +409,31 @@ private function processPlatformConfig(string $type, array $platform, ContainerB
return;
}

if ('bedrock' === $type) {
if (!ContainerBuilder::willBeAvailable('symfony/ai-bedrock-platform', BedrockFactory::class, ['symfony/ai-bundle'])) {
throw new RuntimeException('Bedrock platform configuration requires "symfony/ai-bedrock-platform" package. Try running "composer require symfony/ai-bedrock-platform".');
}

foreach ($platform as $name => $config) {
$platformId = 'ai.platform.bedrock_'.$name;
$definition = (new Definition(Platform::class))
->setFactory(BedrockFactory::class.'::create')
->setLazy(true)
->addTag('proxy', ['interface' => PlatformInterface::class])
->setArguments([
$config['bedrock_runtime_client'] ? new Reference($config['bedrock_runtime_client'], ContainerInterface::NULL_ON_INVALID_REFERENCE) : null,
$config['model_catalog'] ? new Reference($config['model_catalog']) : new Reference('ai.platform.model_catalog.bedrock'),
null,
new Reference('event_dispatcher'),
])
->addTag('ai.platform', ['name' => 'bedrock_'.$name]);

$container->setDefinition($platformId, $definition);
}

return;
}

if ('cache' === $type) {
foreach ($platform as $name => $cachedPlatformConfig) {
$definition = (new Definition(CachedPlatform::class))
Expand Down Expand Up @@ -536,11 +562,11 @@ private function processPlatformConfig(string $type, array $platform, ContainerB
}

if ('generic' === $type) {
if (!ContainerBuilder::willBeAvailable('symfony/ai-generic-platform', GenericPlatformFactory::class, ['symfony/ai-bundle'])) {
throw new RuntimeException('Generic platform configuration requires "symfony/ai-generic-platform" package. Try running "composer require symfony/ai-generic-platform".');
}

foreach ($platform as $name => $config) {
if (!ContainerBuilder::willBeAvailable('symfony/ai-generic-platform', GenericPlatformFactory::class, ['symfony/ai-bundle'])) {
throw new RuntimeException('Generic platform configuration requires "symfony/ai-generic-platform" package. Try running "composer require symfony/ai-generic-platform".');
}

$platformId = 'ai.platform.generic.'.$name;
$definition = (new Definition(Platform::class))
->setFactory(GenericPlatformFactory::class.'::create')
Expand Down
8 changes: 8 additions & 0 deletions tests/DependencyInjection/AiBundleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

namespace Symfony\AI\AiBundle\Tests\DependencyInjection;

use AsyncAws\BedrockRuntime\BedrockRuntimeClient;
use Codewithkyrian\ChromaDB\Client;
use MongoDB\Client as MongoDbClient;
use PHPUnit\Framework\Attributes\DoesNotPerformAssertions;
Expand Down Expand Up @@ -7013,6 +7014,7 @@ private function buildContainer(array $configuration): ContainerBuilder
$container->setParameter('kernel.environment', 'dev');
$container->setParameter('kernel.build_dir', 'public');
$container->setDefinition(ClockInterface::class, new Definition(MonotonicClock::class));
$container->setDefinition('async_aws.client.bedrock_us', new Definition(BedrockRuntimeClient::class));

$extension = (new AiBundle())->getContainerExtension();
$extension->load($configuration, $container);
Expand Down Expand Up @@ -7049,6 +7051,12 @@ private function getFullConfig(): array
'api_version' => '2024-02-15-preview',
],
],
'bedrock' => [
'default' => [],
'us' => [
'bedrock_runtime_client' => 'async_aws.client.bedrock_us',
],
],
'cache' => [
'azure' => [
'platform' => 'ai.platform.azure.my_azure_instance',
Expand Down