Skip to content

Commit f77e9a0

Browse files
committed
minor #163 [AIBundle] Wire & configure services explicitly (valtzu)
This PR was merged into the main branch. Discussion ---------- [AIBundle] Wire & configure services explicitly | Q | A | ------------- | --- | Bug fix? | no | New feature? | no | Docs? | no | Issues | Related to #90 | License | MIT Don't autowire or autoconfigure anything in AI Bundle Commits ------- bbd2369 [AIBundle] Wire & configure services explicitly
2 parents fd07ce1 + bbd2369 commit f77e9a0

File tree

4 files changed

+175
-107
lines changed

4 files changed

+175
-107
lines changed

src/ai-bundle/config/options.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111

1212
namespace Symfony\Component\Config\Definition\Configurator;
1313

14+
use Codewithkyrian\ChromaDB\Client as ChromaDBClient;
15+
use MongoDB\Client as MongoDBClient;
16+
use Probots\Pinecone\Client as PineconeClient;
1417
use Symfony\AI\Platform\PlatformInterface;
1518
use Symfony\AI\Store\StoreInterface;
1619

@@ -154,6 +157,7 @@
154157
->useAttributeAsKey('name')
155158
->arrayPrototype()
156159
->children()
160+
->scalarNode('client')->cannotBeEmpty()->defaultValue(ChromaDBClient::class)->end()
157161
->scalarNode('collection')->isRequired()->end()
158162
->end()
159163
->end()
@@ -163,6 +167,7 @@
163167
->useAttributeAsKey('name')
164168
->arrayPrototype()
165169
->children()
170+
->scalarNode('client')->cannotBeEmpty()->defaultValue(MongoDBClient::class)->end()
166171
->scalarNode('database')->isRequired()->end()
167172
->scalarNode('collection')->isRequired()->end()
168173
->scalarNode('index_name')->isRequired()->end()
@@ -176,6 +181,7 @@
176181
->useAttributeAsKey('name')
177182
->arrayPrototype()
178183
->children()
184+
->scalarNode('client')->cannotBeEmpty()->defaultValue(PineconeClient::class)->end()
179185
->scalarNode('namespace')->end()
180186
->arrayNode('filter')
181187
->scalarPrototype()->end()

src/ai-bundle/config/services.php

Lines changed: 77 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -18,66 +18,114 @@
1818
use Symfony\AI\Agent\Toolbox\Toolbox;
1919
use Symfony\AI\Agent\Toolbox\ToolboxInterface;
2020
use Symfony\AI\Agent\Toolbox\ToolCallArgumentResolver;
21+
use Symfony\AI\Agent\Toolbox\ToolFactory\AbstractToolFactory;
2122
use Symfony\AI\Agent\Toolbox\ToolFactory\ReflectionToolFactory;
22-
use Symfony\AI\Agent\Toolbox\ToolFactoryInterface;
2323
use Symfony\AI\Agent\Toolbox\ToolResultConverter;
2424
use Symfony\AI\AIBundle\Profiler\DataCollector;
2525
use Symfony\AI\AIBundle\Profiler\TraceableToolbox;
2626
use Symfony\AI\AIBundle\Security\EventListener\IsGrantedToolAttributeListener;
27+
use Symfony\AI\Platform\Bridge\Anthropic\Contract\AnthropicContract;
28+
use Symfony\AI\Platform\Bridge\Google\Contract\GoogleContract;
29+
use Symfony\AI\Platform\Bridge\OpenAI\Whisper\AudioNormalizer;
30+
use Symfony\AI\Platform\Contract;
31+
use Symfony\AI\Platform\Contract\JsonSchema\DescriptionParser;
32+
use Symfony\AI\Platform\Contract\JsonSchema\Factory as SchemaFactory;
2733

2834
return static function (ContainerConfigurator $container): void {
2935
$container->services()
30-
->defaults()
31-
->autowire()
32-
36+
->set('ai.platform.contract.default', Contract::class)
37+
->factory([Contract::class, 'create'])
38+
->set('ai.platform.contract.openai')
39+
->parent('ai.platform.contract.default')
40+
->args([
41+
inline_service(AudioNormalizer::class),
42+
])
43+
->set('ai.platform.contract.anthropic', Contract::class)
44+
->factory([AnthropicContract::class, 'create'])
45+
->set('ai.platform.contract.google', Contract::class)
46+
->factory([GoogleContract::class, 'create'])
3347
// structured output
34-
->set(ResponseFormatFactory::class)
35-
->alias(ResponseFormatFactoryInterface::class, ResponseFormatFactory::class)
36-
->set(StructureOutputProcessor::class)
48+
->set('ai.agent.response_format_factory', ResponseFormatFactory::class)
49+
->args([
50+
service('ai.platform.json_schema_factory'),
51+
])
52+
->set('ai.platform.json_schema.description_parser', DescriptionParser::class)
53+
->set('ai.platform.json_schema_factory', SchemaFactory::class)
54+
->args([
55+
service('ai.platform.json_schema.description_parser'),
56+
service('type_info.resolver')->nullOnInvalid(),
57+
])
58+
->alias(ResponseFormatFactoryInterface::class, 'ai.agent.response_format_factory')
59+
->set('ai.agent.structured_output_processor', StructureOutputProcessor::class)
60+
->args([
61+
service('ai.agent.response_format_factory'),
62+
service('serializer'),
63+
])
3764
->tag('ai.agent.input_processor')
3865
->tag('ai.agent.output_processor')
3966

4067
// tools
41-
->set('ai.toolbox.abstract')
42-
->class(Toolbox::class)
43-
->autowire()
68+
->set('ai.toolbox.abstract', Toolbox::class)
4469
->abstract()
4570
->args([
46-
'$toolFactory' => service(ToolFactoryInterface::class),
47-
'$tools' => abstract_arg('Collection of tools'),
71+
service('ai.tool_factory'),
72+
abstract_arg('Collection of tools'),
73+
service('ai.tool_call_argument_resolver'),
74+
service('logger')->ignoreOnInvalid(),
75+
service('event_dispatcher')->nullOnInvalid(),
4876
])
49-
->set(Toolbox::class)
77+
->set('ai.toolbox', Toolbox::class)
5078
->parent('ai.toolbox.abstract')
79+
->arg('index_1', tagged_iterator('ai.tool'))
80+
->alias(ToolboxInterface::class, 'ai.toolbox')
81+
->set('ai.tool_factory.abstract', AbstractToolFactory::class)
82+
->abstract()
5183
->args([
52-
'$tools' => tagged_iterator('ai.tool'),
84+
service('ai.platform.json_schema_factory'),
5385
])
54-
->alias(ToolboxInterface::class, Toolbox::class)
55-
->set(ReflectionToolFactory::class)
56-
->alias(ToolFactoryInterface::class, ReflectionToolFactory::class)
57-
->set(ToolResultConverter::class)
58-
->set(ToolCallArgumentResolver::class)
59-
->set('ai.tool.agent_processor.abstract')
60-
->class(ToolProcessor::class)
86+
->set('ai.tool_factory', ReflectionToolFactory::class)
87+
->parent('ai.tool_factory.abstract')
88+
->set('ai.tool_result_converter', ToolResultConverter::class)
89+
->args([
90+
service('serializer'),
91+
])
92+
->set('ai.tool_call_argument_resolver', ToolCallArgumentResolver::class)
93+
->args([
94+
service('serializer'),
95+
])
96+
->set('ai.tool.agent_processor.abstract', ToolProcessor::class)
6197
->abstract()
6298
->args([
63-
'$toolbox' => abstract_arg('Toolbox'),
99+
abstract_arg('Toolbox'),
100+
service('ai.tool_result_converter'),
101+
service('event_dispatcher')->nullOnInvalid(),
102+
false,
64103
])
65-
->set(ToolProcessor::class)
104+
->set('ai.tool.agent_processor', ToolProcessor::class)
66105
->parent('ai.tool.agent_processor.abstract')
67106
->tag('ai.agent.input_processor')
68107
->tag('ai.agent.output_processor')
108+
->arg('index_0', service('ai.toolbox'))
109+
->set('ai.security.is_granted_attribute_listener', IsGrantedToolAttributeListener::class)
69110
->args([
70-
'$toolbox' => service(ToolboxInterface::class),
71-
'$eventDispatcher' => service('event_dispatcher')->nullOnInvalid(),
111+
service('security.authorization_checker'),
112+
service('expression_language')->nullOnInvalid(),
72113
])
73-
->set('ai.security.is_granted_attribute_listener', IsGrantedToolAttributeListener::class)
74114
->tag('kernel.event_listener')
75115

76116
// profiler
77-
->set(DataCollector::class)
117+
->set('ai.data_collector', DataCollector::class)
118+
->args([
119+
tagged_iterator('ai.traceable_platform'),
120+
service('ai.toolbox'),
121+
tagged_iterator('ai.traceable_toolbox'),
122+
])
78123
->tag('data_collector')
79-
->set(TraceableToolbox::class)
80-
->decorate(ToolboxInterface::class)
124+
->set('ai.traceable_toolbox', TraceableToolbox::class)
125+
->decorate('ai.toolbox')
126+
->args([
127+
service('.inner'),
128+
])
81129
->tag('ai.traceable_toolbox')
82130
;
83131
};

0 commit comments

Comments
 (0)