Laravel AI SDK alcanza versión 1.0.0 tras meses en beta. El paquete oficial unifica OpenAI, Anthropic, Gemini y otros a través de una API: `composer require laravel/ai`.

terminal
composer require laravel/ai

La clasificación con el modelo Jev de TypeSafe destaca como novedad principal. Jev entrega decisiones rápidas y baratas: sí/no u opciones múltiples. Un ticket de soporte recibe marca `is_urgent` y encamina a `billing`, `technical` o `sales`. Las preguntas binarias aisladas usan `Str::of($message)->decide('Is this spam?');`. TypeSafe y OpenRouter funcionan hoy; más proveedores seguirán la misma interfaz.

El streaming ahora habla directamente Vercel Chat y AG-UI. Una ruta con `Vercel::chat($request)`, `withMessages()` y `stream()` carga el historial, lo persiste y procesa aprobaciones de herramientas pendientes. Los clientes AG-UI como CopilotKit cambian a `usingAgentUserInteractionProtocol()`.

Las herramientas delicadas requieren visto humano. Una clase `DeleteFile` implementa `Approvable` y `Tool` con `InteractsWithApprovals`. Aprobar, rechazar con razón visible al modelo, o editar argumentos antes de ejecutar.

Otras adiciones 1.0: middleware corre en cada paso de generación (no solo una vez); `ToolSearch` carga bajo demanda herramientas poco usadas en OpenAI y Anthropic; `CodeExecution` ejecuta código en sandboxes de Anthropic, OpenAI, Azure, Gemini y xAI. El historial vive en columna única `steps`—apps que consulten columnas viejas necesitan migración.

Laravel Boost suaviza la actualización: `composer require laravel/boost --dev`, luego `php artisan boost:install`, después ejecutar `/upgrade-ai-sdk-v1` en Claude Code o Cursor.

Laravel 13.33 trae ajustes prácticos menores. `Cache::memo()` ahora acepta `tags`, lecturas memorizadas dentro de una petición permanecen etiquetadas: `Cache::memo()->tags(['permissions'])->get(...)`. Comprobaciones repetidas de permisos o ajustes evitan viajes extras a Redis.

El atributo `#[Refreshes]` maneja columnas calculadas por la base. Marcar `#[Refreshes('net_salary')]` en un modelo donde `net_salary` procede de `base_salary + allowance - deduction` vía expresión almacenada. Tras crear o guardar, Laravel recarga esa columna en el objeto modelo. Múltiples columnas: `#[Refreshes('net_salary', 'tax_status')]`. Cada guardado paga una pequeña consulta (`select net_salary from employees where id = ? limit 1`). Para necesidades ocasionales, el `refresh()` manual sigue siendo mejor.

`AsCollection::nullable()` y `AsArrayObject::nullable()` guardan ahora NULL SQL real en lugar de la cadena "null", así `whereNull()` las encuentra. Los modificadores `inplace()` y `lock()` solicitan `ALGORITHM=INPLACE` y `LOCK=NONE` en migraciones de índices y claves foráneas de tablas grandes MySQL. Los atributos Form Request como `#[StopOnFirstFailure]` heredan de clases padre. `Worker::$killOnTimeout = false` permite a un job vencido lanzar excepción y limpiar sin matar el proceso worker. `mockArtisan()` y `realArtisan()` separan ejecuciones simuladas de reales sin cambiar `$mockConsoleOutput`.