pixelworxio / laravel-ai-action
AI-powered actions for Laravel — a clean integration layer built on laravel/ai
Requires
- php: ^8.4
- laravel/ai: ^0.1 || ^0.2 || ^0.3 || ^0.4 || ^0.5 || ^0.6 || ^0.7 || ^0.8 || ^0.9 || ^0.10
- laravel/framework: ^12.0 || ^13.0
- spatie/laravel-package-tools: ^1.16
Requires (Dev)
- larastan/larastan: ^3.0
- laravel/mcp: >=0.1
- laravel/pint: ^1.14
- laravel/pulse: ^1.7
- livewire/livewire: ^4.3
- nunomaduro/collision: ^8.8
- orchestra/testbench: ^10.0 || ^11.0
- pestphp/pest: ^4.0
- pestphp/pest-plugin-arch: ^4.0
- pestphp/pest-plugin-laravel: ^4.0
- phpstan/extension-installer: ^1.4
- phpstan/phpstan-deprecation-rules: ^2.0
Suggests
- laravel/mcp: Required to expose agent actions as MCP tools (>=0.1).
- laravel/pulse: Required for the bundled AgentActionRecorder and Pulse dashboard card.
Provides
None
Conflicts
None
Replaces
None
README
What does this package do?
This package offers an architectural pattern that sits on top of laravel/ai to provide a consistent, structured, and testable way to execute AI actions in your Laravel app.
laravel/ai |
laravel-ai-action |
|
|---|---|---|
| Abstraction level | Agents, tools, streaming primitives | Single-responsibility action classes |
| Context passing | Manual | AgentContext DTO (record, meta, user instruction) |
| Output handling | Raw response objects | Typed AgentResult with token tracking |
| Structured output | StructuredAnonymousAgent |
HasStructuredOutput + mapOutput() |
| Streaming | Iterator + event handling | HasStreamingResponse callbacks |
| Queue support | None built-in | RunAgentActionJob (unique, queueable) |
| Testing | Mock the SDK | FakeAgentAction + fluent assertions |
| Artisan scaffolding | None | php artisan make:ai-action |
| Resilience | Manual | HasMiddleware — retry, idempotency, provider fallback |
| Cost tracking | Manual | AgentResult::cost() from a configurable pricing table |
| Observability | None built-in | Opt-in Laravel Pulse card |
If you're wiring AI calls directly into controllers or service classes, you're reinventing this. laravel-ai-action gives every AI capability in your app a consistent, discoverable home — the same way laravel/actions does for business logic.
Requirements
| Dependency | Version |
|---|---|
| PHP | ^8.4 |
| Laravel | ^12.0 || ^13.0 |
laravel/ai |
^0.1 |
Installation
composer require pixelworxio/laravel-ai-action
Publish the config to customise defaults:
php artisan vendor:publish --tag=ai-action-config
Quick Start
php artisan make:ai-action SummarizePost
// app/Ai/Actions/SummarizePost.php final class SummarizePost implements AgentAction { use InteractsWithAgent; public function instructions(AgentContext $context): string { return 'You are a concise technical writer. Summarize in three sentences.'; } public function prompt(AgentContext $context): string { return sprintf("Summarize:\n\n%s", $context->record->body); } public function handle(AgentContext $context): AgentResult { return app(RunAgentAction::class)->execute($this, $context); } }
// In a controller or job $context = AgentContext::fromRecord($post); $result = $this->runner->execute(new SummarizePost(), $context); echo $result->text; // "This post covers..." echo $result->inputTokens; // 320
MCP Bridge (opt-in)
Expose any AgentAction as a Laravel MCP tool — reachable from Claude Desktop, Cursor, and any MCP-aware client — with a few additional methods and one env flag.
composer require laravel/mcp
AI_ACTION_MCP_ENABLED=true
php artisan make:ai-action SummarizeInvoice --mcp
// In your AppServiceProvider::boot(): use Pixelworxio\LaravelAiAction\Mcp\Facades\AiActionMcp; AiActionMcp::tool(\App\Ai\Actions\SummarizeInvoice::class);
See docs/mcp.md for the full guide including auth scoping, annotation forwarding, auto-discovery, and custom response formatting.
Middleware, Cost Tracking & Observability
Wrap any action's execution in a middleware pipeline — the same pattern Laravel uses for queued jobs — for retries, idempotency, and provider fallback:
public function middleware(): array { return [ new Idempotent(ttl: now()->addHour()), new FallbackProvider(['openai']), new RetryAgentCall(times: 3, backoffSeconds: [1, 5, 10]), ]; }
Every AgentResult can report its own USD cost via $result->cost(), computed from a configurable per-model pricing table. And when Laravel Pulse is installed, an opt-in <livewire:pulse.ai-actions /> card shows call volume, cost, latency, and token usage per action — no bespoke dashboard to maintain.
See docs/middleware.md, docs/cost-tracking.md, and docs/pulse.md.
Documentation
- Actions — creating actions, contracts, and execution modes
- Context —
AgentContextreference and usage - Results —
AgentResultreference and usage - Testing —
FakeAgentActionand fluent assertions - Configuration — all config keys and environment variables
- Queue — background execution with
RunAgentActionJob - MCP Bridge — exposing actions as MCP tools (opt-in)
- Middleware — retries, idempotency, and provider fallback
- Cost Tracking — per-call USD cost from token usage
- Laravel Pulse — production observability dashboard (opt-in)
Changelog
See CHANGELOG.md.
License
MIT — see LICENSE.