Laravel AI v0.11.0 se publicó el 19 de agosto de 2026 con 36 pull requests fusionados y doce colaboradores primerizos. El cambio estrella es la observabilidad: un único ID de invocación recorre ahora toda la ejecución de un agente, incluidos los intentos de conmutación, y un conjunto de eventos de ciclo de vida informa de cada paso.
Siete pull requests de @pushpak1300 rehacen el reporting. La ruta síncrona prompt() genera ahora el ID de invocación por adelantado, como ya hacía streamPrompt(); antes el middleware síncrono veía null, y una conmutación entre tres proveedores producía tres IDs sin relación para una misma ejecución. Un nuevo RunContext porta la identidad de la ejecución y despacha los eventos directamente. El ID de invocación de herramienta se crea dentro de executeTool(), lo que corrige un fallo de anidamiento por el que un agente invocado como herramienta sobrescribía el ID de la llamada externa. Las herramientas lo leen con Request::toolInvocationId().
StartingStep, StepCompleted y StepFailed se disparan alrededor de cada ida y vuelta al proveedor, en la ruta síncrona y en streaming. StartingStep lleva los mensajes, las opciones resueltas y todo el historial; los eventos de fin llevan el tiempo de ejecución en milisegundos, igual que QueryExecuted::$time. ToolFailed informa de un handler de herramienta que lanza excepción, con su ID de invocación, antes de relanzarla, y AgentFailed reporta un fallo terminal una sola vez por ejecución, tras agotar la cadena de conmutación. Una llamada a herramienta publica sus IDs, de modo que cualquier agente que invoque los hereda como parentInvocationId y parentToolInvocationId; el vínculo no cruza fronteras de cola.
Un nuevo wrapper ToolSearch de @behzadsp difiere los catálogos grandes de herramientas: OpenAI y Anthropic las cargan bajo demanda mediante su búsqueda hospedada en lugar de enviar todas las definiciones en cada petición. Las herramientas no necesitan cambios. El wrapper se traduce a {"type":"tool_search"} en OpenAI y a los tipos tool_search_tool_* en Anthropic, cuya estrategia de búsqueda es un argumento del constructor validado contra regex y bm25. Los proveedores no compatibles lanzan una excepción antes del envío; solo se permite un wrapper por petición, y la búsqueda hospedada de OpenAI exige respuestas almacenadas, por lo que usarlo con store=false lanza una excepción. El mismo PR añade reproducción de salida sin estado para OpenAI.
La conmutación cubre ahora tres casos que antes se escapaban. Las ConnectionException, como un host caído o una instancia local de Ollama detenida, se relanzan como ProviderConnectionException que implementa FailoverableException (@JVillator0). La lista de estados por sobrecarga pasó de solo 503 a 502, 503, 504, 520, 522 y 524; el 500 queda excluido deliberadamente (@sulimanbenhalim). Anthropic recibió el mismo tratamiento. Los rechazos HTTP 400 de Anthropic por límite de gasto también disparan ahora la conmutación, después de que @oddvalue reportara unas 990 excepciones no gestionadas en un mes por ese caso.
En proveedores: búsqueda web y de archivos para xAI (@timmcleod), transcripción para proveedores compatibles con OpenAI y para Groq, la herramienta de servidor web fetch para OpenRouter (@CamilleScholtz), y las citas de web fetch de Anthropic aparecen ahora en $response->meta->citations en respuestas sin streaming. El modelo de texto por defecto de Gemini pasa a gemini-3.7-flash.
Para pruebas, assertPromptedTimes() se suma a las aserciones del fake Promptable, al estilo de Bus::assertDispatchedTimes() (@F1nnG), y la generación simulada en cola de transcripciones, imágenes, audio y embeddings ejecuta ahora el callback then(...) (@gdebrauwer).
Entre los arreglos menores: uso de streaming sumado entre pasos de llamadas a herramientas, tokens de escritura de caché de OpenAI conservados, tokens de acierto de caché de DeepSeek excluidos, filtrado de llamadas a herramientas parcialmente huérfanas al reproducir el historial, reparación de llamadas a herramientas locales desconocidas, manejo del contenido en bloques de Mistral, mapeo de las razones de parada de Anthropic refusal y model_context_window_exceeded, eliminación de fences Markdown en la salida estructurada compatible con OpenAI, reconstrucción de adjuntos S3 en File::fromArray, fuentes de documentos como text/plain en Anthropic y un enlace estable de la petición MCP.
Notas de actualización: un error de proveedor dentro del cuerpo de un stream lanza ahora una StreamErrorException no conmutable en lugar de terminar el paso en silencio; el evento de error del proveedor está en ->error. AgentFailedOver recibe un nuevo argumento obligatorio string $invocationId, ToolInvoked un float $time, y AgentFailedOver ya no se dispara para el último proveedor de una cadena. Las aplicaciones que usan el modelo Gemini por defecto pasarán a gemini-3.7-flash salvo que fijen el modelo explícitamente. Actualización con composer update laravel/ai.
Comentarios
Aún no hay comentarios — escribe el primero.
Inicia la conversación
Sin cuenta ni contraseña — introduce tu correo y te enviamos un enlace de acceso de un solo uso. ¿Primera vez? Todo se configura automáticamente.
Tu valoración se aplicará automáticamente al iniciar sesión.
Revisa tu bandeja de entrada
Hemos enviado un enlace de acceso a …. Ábrelo en este dispositivo — esta pestaña te conectará automáticamente.
¿No llega nada? Mira en la carpeta de spam — y marca el correo como «No es spam» para que la próxima vez llegue directo.