📖 1 minute read
If you’re building multiple Laravel AI agents, you’ll notice a lot of repetitive setup code in every agent class:
// ❌ Every agent repeats the same middleware setup
class CustomerSupport implements Agent, HasMiddleware
{
use Promptable;
public function middleware(): array
{
return [
RateLimitMiddleware::class,
LoggingMiddleware::class,
RetryMiddleware::class,
];
}
}
class ReportGenerator implements Agent, HasMiddleware
{
use Promptable;
public function middleware(): array
{
return [
RateLimitMiddleware::class,
LoggingMiddleware::class,
RetryMiddleware::class,
];
}
}
DRY it up with a base agent:
// app/Ai/Agents/BaseAgent.php
abstract class BaseAgent implements Agent, HasMiddleware
{
use Promptable;
public function middleware(): array
{
return [
RateLimitMiddleware::class,
LoggingMiddleware::class,
RetryMiddleware::class,
];
}
}
Now every agent just extends BaseAgent:
// ✅ Clean and minimal
class CustomerSupport extends BaseAgent
{
// Just your agent-specific logic
}
class ReportGenerator extends BaseAgent
{
// Just your agent-specific logic
}
Benefits:
- Add/remove middleware in one place – affects all agents instantly
- Onboarding a new agent? One line:
extends BaseAgent - Override middleware for specific agents if needed (just override the
middleware()method)
Example override for special cases:
// Most agents use BaseAgent defaults
class BulkProcessor extends BaseAgent
{
// Different rate limit for bulk operations
public function middleware(): array
{
return [
BulkRateLimitMiddleware::class,
...parent::middleware(),
];
}
}
Pattern applies beyond agents: Same concept works for controllers (BaseController), jobs (BaseJob), or any class hierarchy where you have shared setup.
Leave a Reply