heybardi / routersoup
Openrouter free self-hosted alternative for Laravel
Requires
- php: ^8.3.0
- laravel/ai: *
- laravel/framework: ^11.0|^12.0
- livewire/livewire: ^3.0|^4.0|^5.0
Requires (Dev)
- jonpurvis/lawman: ^4.1
- laravel/pint: ^1.24.0
- mockery/mockery: ^1.6
- orchestra/testbench: ^10.8
- peckphp/peck: ^0.1.3
- pestphp/pest: ^4.1.0
- pestphp/pest-plugin-type-coverage: ^4.0.2
- phpstan/phpstan: ^2.1.26
- rector/rector: ^2.1.7
- symfony/var-dumper: ^7.3.3
This package is not auto-updated.
Last update: 2026-03-17 08:03:10 UTC
README
RouterSoup for Laravel
Your self-hosted, free alternative to OpenRouter. Store multiple API keys per provider, rotate between them automatically, and monitor everything from a built-in dashboard.
Requires PHP 8.3+, Laravel 11+, and Laravel AI
Table of Contents
- Installation
- Usage
- Rotation Strategies
- Dashboard
- Authorization
- Pruning Old Events
- Configuration
- Development
Installation
⚡️ Get started by requiring the package using Composer:
composer require heybardi/routersoup
Then run the install command — it publishes the config, migrations, and a service provider stub:
php artisan routersoup:install php artisan migrate
Usage
Open your AppServiceProvider and call RouterSoup::enable():
use HeyBardi\RouterSoup\RouterSoup; class AppServiceProvider extends ServiceProvider { public function boot(): void { RouterSoup::enable(); } }
That's it. RouterSoup now intercepts all Laravel AI calls and rotates your provider keys automatically.
Head to /routersoup in your browser, add a few API keys, and you're good to go.
Rotation Strategies
RouterSoup supports two strategies for picking which API key to use:
| Strategy | Enum | What it does |
|---|---|---|
| Random | RouterSoupRotation::Random |
Picks a random active key. Simple, stateless. |
| Least Used | RouterSoupRotation::LeastUsed |
Picks the key that hasn't been used the longest. Spreads load evenly. |
Set it in config/routersoup.php:
use HeyBardi\RouterSoup\Enums\RouterSoupRotation; 'rotation' => RouterSoupRotation::LeastUsed,
Dashboard
Visit /routersoup (or whatever you set path to) to access the admin panel:
- Dashboard — Provider usage analytics over the last 30 days.
- Providers — Add, edit, enable/disable, and delete API keys.
- Monitoring — Browse every Laravel AI event with full payloads.
- Exceptions — Failed provider calls with error details and traces.
No frontend build step needed — it's all Livewire.
Authorization
In local environments, the dashboard is open to everyone. In production, access is controlled by a viewRouterSoup gate.
The install command publishes a RouterSoupServiceProvider where you define who gets in:
// app/Providers/RouterSoupServiceProvider.php protected function gate(): void { Gate::define('viewRouterSoup', function ($user) { return in_array($user->email, [ 'you@example.com', ]); }); }
Pruning Old Events
Events pile up. Schedule the prune command to keep things clean:
$schedule->command('routersoup:prune')->daily();
By default it keeps the last 24 hours. Need more? Pass --hours:
php artisan routersoup:prune --hours=72
Configuration
After installing, you'll find config/routersoup.php in your app:
return [ // URI prefix for the admin panel. Set to null to disable it. 'path' => env('ROUTERSOUP_PATH', 'routersoup'), // Middleware applied to admin panel routes. 'middleware' => ['web', 'routersoup.auth'], // Use a separate DB connection. null = app default. 'database_connection' => env('ROUTERSOUP_DB', null), // Rotation strategy: Random or LeastUsed. 'rotation' => RouterSoupRotation::Random, // Toggle provider usage tracking. 'analytics' => [ 'enabled' => env('ROUTERSOUP_ANALYTICS', true), ], // Toggle Laravel AI event monitoring. 'monitoring' => [ 'enabled' => env('ROUTERSOUP_MONITORING', true), ], ];
Development
🧹 Keep a modern codebase with Pint:
composer lint
✅ Run refactors using Rector:
composer refactor
⚗️ Run static analysis using PHPStan:
composer test:types
✅ Run unit tests using Pest:
composer test:unit
🚀 Run the entire test suite:
composer test
License
RouterSoup was created by Bardi under the MIT license.