Laravel AI SDK chegou: vale migrar do Prism (ou do seu wrapper)?
Taylor anunciou o Laravel AI SDK em 5 de fevereiro de 2026. Em 17 de março ele ficou estável junto com o Laravel 13. De lá pra cá, quem roda Prism, EchoLabs ou um wrapper caseiro em cima de OpenAI e Anthropic vive perguntando a mesma coisa: vale migrar?
Eu portei um projeto real e abri o diff. Spoiler: 47 linhas a menos no serviço de IA, switch de provider em uma atribuição, embeddings padronizados, vector store first-party com Eloquent. Mas também tem caso em que não migrar é a decisão certa.
Esse post é o passo a passo do que muda, o que continua valendo no Prism e quando ficar parado é a engenharia certa.
TL;DR
- O que é: laravel/ai, SDK oficial first-party da Laravel pra falar com provedores de IA (texto, embeddings, áudio, imagem, agentes, tools).
- Stack/Modelos: Laravel 12+, PHP 8.4+. Providers: Anthropic, OpenAI, Gemini, Groq, xAI, DeepSeek, Mistral, Bedrock, Azure, OpenRouter, Ollama.
- Custo/Acesso: open-source MIT. Você paga só o uso dos providers.
- Repositório: github.com/laravel/ai — versão atual
v0.7.0, ainda 0.x mas declarada estável desde o release do Laravel 13.
O que mudou — Laravel AI SDK em maio/2026
Resumo dos marcos:
- 5/fev/2026: anúncio público do SDK na Laravel News, tag
v0.1.2. - 9/fev/2026: live do Taylor com Josh Cirre construindo features com a SDK ao vivo.
- 17/mar/2026: Laravel 13 lança e a AI SDK sai de beta.
- maio/2026: v0.7.0 no ar, com vector store, streaming Vercel-protocol, cache de embeddings e queue nativa.
Detalhe importante que passou batido pra muita gente: o composer.json do laravel/ai lista prism-php/prism: ^0.99.0 como dependência direta. A SDK oficial não substituiu o Prism. Ela engoliu o Prism como motor e construiu o produto Laravel-native em cima.
Isso muda a leitura. Não é "Prism vs SDK oficial". É "Prism continua sendo o motor de provider, a SDK adiciona Agent classes, scaffolding Artisan, conversas persistentes, streaming, queue, vector store e testes". TJ Miller, criador do Prism, foi destacado como Artisan of the Day pelo time exatamente por isso.
O diff real — antes (Prism + wrapper) vs depois (SDK)
O projeto que portei tinha um AiService clássico: sumarização de tickets de suporte, embedding dos resumos, busca semântica pelo histórico. Stack: Laravel 11 + Prism + chamadas Http::post direto na OpenAI pros embeddings, porque o Prism naquela versão ainda variava por provider.
Versão original — app/Services/AiService.php, 89 linhas no total:
<?php
namespace App\Services;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Prism\Prism\Facades\Prism;
class AiService
{
public function summarize(string $ticket, string $provider = 'anthropic'): string
{
$model = match ($provider) {
'anthropic' => 'claude-haiku-4-5-20251001',
'openai' => 'gpt-4.1-mini',
};
return Prism::text()
->using($provider, $model)
->withSystemPrompt(view('prompts.summarize-ticket'))
->withPrompt($ticket)
->generate()
->text;
}
public function embed(array $texts): array
{
$resp = Http::withToken(config('services.openai.key'))
->post('https://api.openai.com/v1/embeddings', [
'input' => $texts,
'model' => 'text-embedding-3-small',
]);
return collect($resp->json('data'))
->pluck('embedding')
->all();
}
public function searchSimilar(string $query, int $limit = 10): array
{
$embedding = $this->embed([$query])[0];
return DB::select(
"SELECT id, content, (embedding <=> ?::vector) AS distance
FROM tickets
ORDER BY distance ASC
LIMIT ?",
[json_encode($embedding), $limit]
);
}
}
Tem três coisas chatas nesse código:
- Switch de provider via
match— toda vez que o produto pede pra trocar de modelo, mexe em duas linhas e na config. - Embedding fora do Prism — porque o
Http::postcontinua sendo o caminho mais previsível pra OpenAI no Prism 0.x. - Busca semântica em SQL cru — funciona, mas perde Eloquent, scopes e teste.
Agora a versão portada pra SDK oficial — três arquivos enxutos:
// app/Ai/Agents/TicketSummarizer.php
namespace App\Ai\Agents;
use Laravel\Ai\Attributes\Model;
use Laravel\Ai\Attributes\Provider;
use Laravel\Ai\Contracts\Agent;
use Laravel\Ai\Enums\Lab;
use Laravel\Ai\Promptable;
use Stringable;
#[Provider(Lab::Anthropic)]
#[Model('claude-haiku-4-5-20251001')]
class TicketSummarizer implements Agent
{
use Promptable;
public function instructions(): Stringable|string
{
return view('prompts.summarize-ticket');
}
}
// app/Models/Ticket.php — trecho relevante
use Laravel\Ai\Concerns\HasEmbeddings;
class Ticket extends Model
{
use HasEmbeddings;
protected $casts = [
'embedding' => 'vector',
];
}
// app/Services/TicketSearch.php
namespace App\Services;
use App\Ai\Agents\TicketSummarizer;
use App\Models\Ticket;
class TicketSearch
{
public function summarize(string $ticket): string
{
return (string) (new TicketSummarizer)->prompt($ticket);
}
public function searchSimilar(string $query, int $limit = 10)
{
return Ticket::query()
->whereVectorSimilarTo('embedding', $query, minSimilarity: 0.4)
->limit($limit)
->get();
}
}
Total: 42 linhas contra 89. 47 linhas a menos no diff. E o que se ganha não é só LOC.
Switch de provider em uma atribuição
No Prism, trocar de provider é editar a string passada pro ->using(). Em produção isso vira match, config ou variável de ambiente — sempre uma camada a mais de indireção.
Na SDK oficial, troca é atributo. A mesma classe vira Anthropic ou OpenAI mudando uma linha:
#[Provider(Lab::Anthropic)]
#[Model('claude-haiku-4-5-20251001')]
class TicketSummarizer implements Agent
{
use Promptable;
}
Pra rodar com OpenAI numa rota específica, sem tocar na classe:
$response = (new TicketSummarizer)->prompt(
$ticket,
provider: Lab::OpenAI,
model: 'gpt-4.1-mini',
timeout: 60,
);
E pra deixar o SDK escolher por custo ou por capacidade:
use Laravel\Ai\Attributes\UseCheapestModel;
#[UseCheapestModel]
class TicketTagger implements Agent
{
use Promptable;
}
O UseCheapestModel e o irmão UseSmartestModel resolvem o modelo no momento do prompt baseado nos providers configurados. Não é mágica de prompt-router — é o SDK olhando a tabela de capacidade/custo dos providers do config/ai.php.
Embeddings padronizados e vector store first-party
Esse é o ponto onde a SDK pula na frente de qualquer wrapper caseiro. Dois exemplos do que passa a ser uma linha:
use Illuminate\Support\Str;
use Laravel\Ai\Embeddings;
// Um único texto, via Stringable
$embedding = Str::of('Cliente reclamou de atraso na entrega.')->toEmbeddings();
// Batch
$response = Embeddings::for([
'Cliente reclamou de atraso na entrega.',
'Pedido chegou com avaria.',
])->generate();
$embeddings = $response->embeddings;
E a query semântica vira Eloquent puro:
$tickets = Ticket::query()
->whereVectorSimilarTo('embedding', 'pedidos atrasados', minSimilarity: 0.4)
->where('status', 'open')
->limit(10)
->get();
Scope, eager loading, soft delete — tudo funciona porque whereVectorSimilarTo é só um scope que injeta embedding <=> ?::vector no orderByRaw. Por baixo continua sendo pgvector. O SDK não inventou banco vetorial — ele integrou pgvector ao Eloquent.
Cache de embedding também sai grátis. Em config/ai.php:
'caching' => [
'embeddings' => [
'cache' => true,
'store' => env('CACHE_STORE', 'database'),
],
],
Quem chama duas vezes o mesmo texto não paga duas vezes. Era literalmente um TODO de bater na cabeça do dev quando ele esquecia.
Quando NÃO migrar
Migração é trabalho. Antes de abrir o branch:
- PHP < 8.4 ou Laravel < 12. A SDK exige os dois. Atualiza primeiro, migra depois.
- MySQL sem pgvector. O
whereVectorSimilarTodepende de pgvector. Se você está em MySQL, ou migra de banco junto (escopo enorme) ou continua com o esquema antigo. - Prism em produção há meses, sem dor. A SDK depende do Prism. Você não está num beco sem saída. Migra por feature nova — escreve agente novo na SDK, deixa o serviço antigo encostado até justificar o port.
- Caso de uso muito específico do Prism. Algumas extensões e providers exóticos do Prism ainda não têm equivalente direto na fachada do SDK. Pra esses, continuar no Prism puro (ou usar Prism direto por baixo do SDK) é razoável.
A pergunta certa não é "Prism morreu?". É "o que eu ganho fazendo esse port agora?". Em projeto novo, ganha tudo. Em projeto velho rodando bem, ganha pouco até a feature seguinte.
FAQ
O Prism vai morrer?
Não. A SDK oficial usa prism-php/prism: ^0.99.0 como dependência direta. O Prism virou a camada de provider que alimenta a SDK. Mantenedor segue ativo, agora alinhado com o time do Laravel.
Posso usar com Laravel 11?
Não. O composer.json exige Laravel 12 e PHP 8.4. Sem upgrade, sem SDK.
Funciona com Ollama local?
Sim. Lab::Ollama é provider de primeira classe na SDK e respeita OLLAMA_BASE_URL. Útil pra rodar agente local em dev ou cenários sem dependência de API externa.
Vector store precisa de Postgres?
Sim. whereVectorSimilarTo depende de pgvector. MySQL não tem equivalente nativo suportado pelo SDK até v0.7.0. Em projetos MySQL você ainda consegue gerar embeddings via Embeddings::for(...) e armazenar como JSON, mas a query semântica vai precisar de SQL custom.
Conclusão
Laravel AI SDK não é ruptura. É consolidação. O time pegou o que já estava funcionando no ecossistema (Prism), construiu produto Laravel-native em cima (Agent classes, scaffolding, streaming, queue, vector store integrado ao Eloquent) e entregou um caminho first-party pra quem está começando a colocar IA em produto.
Pra projeto novo: vai direto pra SDK. Pra projeto velho: migra incremental por feature. Pra wrapper caseiro: provavelmente vale o port — você está mantendo código que o time do Laravel agora mantém pra você.
E se você está colocando IA em produção PHP de verdade e quer trocar diff com gente que está no mesmo barco, esse tipo de conversa rola toda semana na Beer and Code, a melhor comunidade de AI engineering em português, com grupo no WhatsApp aberto pra quem está construindo IA em produção.
{AI Engineer} — apaixonado por Laravel, arquitetura de software e construir produtos com impacto. Compartilho aqui tutoriais, descobertas e reflexões sobre o dia a dia de engenharia.
Você também pode gostar
AI engineer no 2º semestre de 2026: o que o recrutador vai pedir
Li 200 vagas de AI engineer postadas em maio de 2026 e separei sinal de ruído: quatro skills que sobem (context engineering, evals, harness e compliance), três que perdem peso e um roteiro de 90 dias pra entrar na shortlist do segundo semestre.
Renderização que converte: do JSON do agente ao card clicável
O agente devolve JSON impecável e o front mostra texto cru. Conexão zero. Aqui a gente fecha o ciclo: do schema Zod ao card de produto clicável com structured outputs do Claude e generative UI no Vercel AI SDK 5.
Anatomia de um Agent Harness: state, tool execution, feedback loops e guardrails
Harness é o software que envolve o LLM e separa um demo bonito de um agente que aguenta produção. Quebro a anatomia em cinco peças obrigatórias: estado persistente, roteador de ferramentas, validação de I/O, loop de raciocínio e limites de segurança. É o mapa mental que abre a série de posts sobre engenharia de agentes.
Agente que pesquisa antes de agir: multi-tool + RAG em Laravel com pgvector
Como construir um agente em Laravel que decide quando buscar e quando responder direto. Arquitetura completa com Prism PHP, pgvector e a lógica de orquestração que separa demo de produto.