Le Laravel AI SDK fournit une API unifiée et expressive pour dialoguer avec OpenAI, Anthropic, Gemini, etc. Construisez des agents intelligents avec tools et sorties structurées, générez images, audio, transcriptions, embeddings — le tout via une interface cohérente et laravelienne.
Laravel AI SDK est un package officiel ajouté avec Laravel 13 (laravel/ai).
Implémentez Conversational et messages().Trait RemembersConversations pour la persistance auto.
use Laravel\Ai\Concerns\RemembersConversations;class SalesCoach implements Agent, Conversational{ use Promptable, RemembersConversations; public function instructions(): string { return 'You are a sales coach...'; }}
forUser() puis continue() avec l’ID :
$response = (new SalesCoach)->forUser($user)->prompt('Hello!');$conversationId = $response->conversationId;$response = (new SalesCoach)->continue($conversationId, as: $user)->prompt('Tell me more about that.');
public function schema(JsonSchema $schema): array{ return ['score' => $schema->integer()->required()];}$response = (new SalesCoach)->prompt('Analyze this...');return $response['score'];
use Laravel\Ai\Files;$response = (new SalesCoach)->prompt( 'Analyze the attached sales transcript...', attachments: [ Files\Document::fromStorage('transcript.pdf'), Files\Document::fromPath('/home/laravel/transcript.md'), $request->file('transcript'), ]);
Images :
$response = (new ImageAnalyzer)->prompt('What is in this image?', attachments: [ Files\Image::fromStorage('photo.jpg'), Files\Image::fromPath('/home/laravel/photo.jpg'), $request->file('photo'),]);
use Illuminate\Broadcasting\Channel;$stream = (new SalesCoach)->stream('Analyze this sales transcript...');foreach ($stream as $event) { $event->broadcast(new Channel('channel-name'));}
Version en queue :
(new SalesCoach)->broadcastOnQueue( 'Analyze this sales transcript...', new Channel('channel-name'),);
Les events exclus ne sont pas diffusés mais restent enregistrés dans agent_conversation_messages — le frontend peut récupérer les infos après le stream.
<?phpnamespace App\Ai\Tools;use Illuminate\Contracts\JsonSchema\JsonSchema;use Laravel\Ai\Contracts\Tool;use Laravel\Ai\Tools\Request;use Stringable;class RandomNumberGenerator implements Tool{ public function description(): Stringable|string { return 'This tool may be used to generate cryptographically secure random numbers.'; } public function handle(Request $request): Stringable|string { return (string) random_int($request['min'], $request['max']); } public function schema(JsonSchema $schema): array { return [ 'min' => $schema->integer()->min(0)->required(), 'max' => $schema->integer()->required(), ]; }}
Enregistrez sur l’agent :
public function tools(): iterable{ return [new RandomNumberGenerator];}
Un agent peut être exposé comme un tool d’un autre agent, pour déléguer.
<?phpnamespace App\Ai\Agents;use Laravel\Ai\Contracts\Agent;use Laravel\Ai\Contracts\HasTools;use Laravel\Ai\Promptable;class CustomerSupportAgent implements Agent, HasTools{ use Promptable; public function instructions(): string { return 'You help customers with account, order, and billing questions. Delegate refund policy questions to the refunds specialist.'; } public function tools(): iterable { return [ new RefundsAgent, ]; }}
Personnalisez son exposition via CanActAsTool.
<?phpnamespace App\Ai\Agents;use App\Ai\Tools\LookupOrder;use Laravel\Ai\Attributes\Provider;use Laravel\Ai\Contracts\Agent;use Laravel\Ai\Contracts\CanActAsTool;use Laravel\Ai\Contracts\HasTools;use Laravel\Ai\Enums\Lab;use Laravel\Ai\Promptable;#[Provider(Lab::Anthropic)]class RefundsAgent implements Agent, CanActAsTool, HasTools{ use Promptable; public function instructions(): string { return 'You are a refunds specialist. Use order details and the refund policy to give concise eligibility guidance.'; } public function name(): string { return 'refunds_specialist'; } public function description(): string { return 'Determine whether an order is eligible for a refund and explain the next step.'; } public function tools(): iterable { return [ new LookupOrder, ]; }}
Sans CanActAsTool, Laravel utilise le nom de classe et une description générique. Chaque appel de sous-agent est indépendant — pas d’héritage d’historique.
use function Laravel\Ai\{agent};$response = agent( instructions: 'You are an expert at software development.', messages: [], tools: [],)->prompt('Tell me about Laravel');
Sortie structurée :
use Illuminate\Contracts\JsonSchema\JsonSchema;$response = agent( schema: fn (JsonSchema $schema) => ['number' => $schema->integer()->required()],)->prompt('Generate a random number less than 100');
use Laravel\Ai\Image;$image = Image::of('A donut sitting on the kitchen counter')->generate();$rawContent = (string) $image;
Qualité, ratio, timeout :
$image = Image::of('A donut sitting on the kitchen counter') ->quality('high') ->landscape() ->timeout(120) ->generate();
Avec pièces jointes de référence :
use Laravel\Ai\Files;$image = Image::of('Update this photo to be in the style of an impressionist painting.') ->attachments([Files\Image::fromStorage('photo.jpg')]) ->landscape() ->generate();
use Laravel\Ai\Audio;$audio = Audio::of('I love coding with Laravel.')->generate();$rawContent = (string) $audio;
Voix, instructions :
$audio = Audio::of('I love coding with Laravel.')->female()->generate();$audio = Audio::of('I love coding with Laravel.')->voice('voice-id-or-name')->generate();$audio = Audio::of('I love coding with Laravel.')->female()->instructions('Said like a pirate')->generate();
use Laravel\Ai\Responses\AudioResponse;Audio::of('I love coding with Laravel.') ->queue() ->then(function (AudioResponse $audio) { $path = $audio->store(); });
use Laravel\Ai\Embeddings;$response = Embeddings::for([ 'Laravel is awesome.', 'PHP is great.',])->generate();$response->embeddings; // [[0.1, 0.2, ...], [...]]
Via Stringable :
use Illuminate\Support\Str;$embedding = Str::of('Laravel is awesome.')->toEmbeddings();
Réordonner un ensemble de résultats. Providers : Cohere, Jina, VoyageAI.
use Laravel\Ai\Reranking;$response = Reranking::of([ 'Django is a Python web framework.', 'Laravel is a PHP web application framework.', 'React is a JavaScript library for building user interfaces.',])->rerank('PHP frameworks');$response->first()->document;
Upload / gestion de fichiers vers les providers. OpenAI, Anthropic, Gemini, Azure.
use Laravel\Ai\Files;// Depuis un chemin$file = Files\Document::fromPath('/home/laravel/document.pdf');// Depuis storage$file = Files\Document::fromStorage('document.pdf');// Depuis un upload$file = Files\Document::fromUpload($request->file('document'));
use Laravel\Ai\Facades\Ai;Ai::fake([ 'This is a fake response.',]);$response = agent()->prompt('Hello');expect((string) $response)->toBe('This is a fake response.');