arnaud-delgerie/symfony-ai-tool-agent
spatie/laravel-symfony). The ToolFunctionManagerInterface and ToolAgentProvider patterns align with Laravel’s service-oriented architecture.TopicClassificationToolFunctionManager), enabling domain-specific AI integrations without monolithic refactoring.Post/Comment entities), adhering to Laravel’s Eloquent and repository patterns.illuminate/support and illuminate/container can host Symfony services (e.g., ToolAgentProvider) via Symfony\Component\DependencyInjection\ContainerInterface.Observers, Listeners) may require adapters for Symfony’s EventDispatcher.ClientConfig, simplifying provider swaps. Laravel’s HttpClient or Guzzle can wrap these calls if needed.execute() method in ToolFunctionManager mirrors Laravel’s command/bus patterns (e.g., Handle classes), but requires manual mapping to Laravel’s job queues (e.g., Illuminate\Bus\Queueable).postId in context). Mitigate via Laravel’s Str::of() sanitization or Symfony’s ExpressionLanguage.Logging or Monitoring (e.g., spatie/laravel-monitoring) to alert on high usage.EntityManagerInterface) require Laravel’s Model::update() wrappers.Console commands need Laravel’s Artisan command adapters (e.g., Illuminate\Console\Command).env() vs. Symfony’s ParameterBag).ollama/ollama) be supported?RateLimiter).laravel-zero/log-viewer).Illuminate\Support\Facades\Retry).Illuminate/Cache).availableTopics) be cached? (e.g., Redis via predis/predis).ToolAgentProvider with a Laravel service provider binding:
$this->app->singleton(ToolAgentProvider::class, fn() => new ToolAgentProvider(
$this->app->make(HttpClient::class),
$this->app->make(ParameterBag::class)
));
EntityManagerInterface calls in Laravel’s Model methods (e.g., Post::find()).dispatch() (e.g., ToolAgent::run() → event(new AgentExecuted($response))).guzzlehttp/guzzle (Laravel’s default) instead of Symfony’s HttpClient.ToolAgent execution to Laravel Queues (e.g., bus:dispatch).Cache facade (e.g., Cache::remember()).TopicClassification) in a Laravel module.symfony/var-dumper for debugging (compatible via Composer).telescope for API call monitoring.ConsoleToolAgent with a Laravel Command:
class ClassifyPostsCommand extends Command {
protected $signature = 'ai:classify-posts';
public function handle(ToolAgentProvider $provider) {
$agent = $provider->createToolAgent(...);
// Process posts via Laravel's Query Builder
}
}
class AiToolAgentServiceProvider extends ServiceProvider {
public function register() {
$this->app->bind(ToolAgentProvider::class, fn() => new ToolAgentProvider(
$this->app['http'],
new ParameterBag($this->app['config'])
));
}
}
ai:tool-agent middleware to validate budgets).Horizon for queue monitoring.spatie/laravel-feature-flags) for gradual rollout.| Laravel Feature | Symfony Bundle Compatibility | Workaround |
|---|---|---|
| Eloquent ORM | Uses Doctrine EntityManager |
Wrap in Model::update() or use doctrine/dbal. |
| Artisan Commands | ConsoleToolAgent |
Extend Illuminate\Console\Command. |
| Queue System | No native support | Use bus:dispatch with ToolAgent payloads. |
| Event System | Symfony EventDispatcher |
Bridge via Symfony\Contracts\EventDispatcher. |
| API Testing | No Laravel Pint/Sniffs integration | Use pestphp/pest for PHPUnit compatibility. |
composer require symfony/var-dumper symfony/options-resolver.config/ai_tool_agent.php.AppServiceProvider.ToolFunctionManager trait:
trait UsesToolFunctions {
public function execute(array $args): ToolResponse {
// Laravel-specific logic (e.g., Model updates)
}
}
HttpClient for unit tests (use Laravel’s MockHttp).artisan test.scheduler for periodic ConsoleToolAgent runs.QUEUE_CONNECTION for async processing.composer.json must pin Symfony dependencies to avoid version conflicts (e.g., symfony/http-client:^6.4).platform.sh/config.yaml or laravel-mix for environment-specific configs.migrations (e.g., schema:modify for new properties).deprecates trait:
class OldToolFunctionManager {
public function __construct() {
if (app()->environment('production')) {
throw new \RuntimeException('Use NewToolFunctionManager');
}
}
}
database (e.g., prompts table) or filesystem (e.g., storage/app/prompts/).laravel-nova or filamentphp/filament for UI management.dd() or dump() for ToolResponse inspection.Monolog:
Log::debug('ToolAgent response', ['content' =>
How can I help you explore Laravel packages today?