Introducción
Laravel AI SDK proporciona una API unificada y expresiva para interactuar con proveedores de IA como OpenAI, Anthropic o Gemini. Con AI SDK puedes construir agentes inteligentes con herramientas y salida estructurada, generar imágenes, sintetizar voz y transcribir audio, crear embeddings vectoriales y muchas otras funciones de IA con una interfaz coherente y muy propia de Laravel.Laravel AI SDK es un paquete oficial añadido en Laravel 13. Se distribuye como
laravel/ai y permite trabajar con múltiples proveedores de IA a través de una API unificada.Lista de compatibilidad por proveedor
Instalación
1
Instalación del paquete
Instala Laravel AI SDK con Composer.
2
Publicar el archivo de configuración y las migraciones
Publica el archivo de configuración y las migraciones con el comando Artisan
vendor:publish.3
Ejecutar las migraciones
Ejecuta las migraciones de la base de datos. Se crearán las tablas
agent_conversations y agent_conversation_messages, que se usan para guardar el historial de conversaciones.Configuración
Variables de entorno
Define las claves de API de los proveedores de IA que vayas a usar en el archivo.env.
config/ai.php.
URL base personalizada
Si necesitas dirigir el tráfico a través de un servicio proxy, puedes definir una URL personalizada por proveedor.Proveedor OpenAI-Compatible
Cuando uses APIs compatibles con OpenAI, como LM Studio, vLLM, Together, Fireworks o gateways locales, puedes configurar el proveedor con el driveropenai-compatible. url es obligatorio y, si indicas key, se enviará como token Bearer.
Enum Lab
Para referenciar los proveedores desde el código utiliza el enumLab.
Agentes
Los agentes son el bloque de construcción fundamental de Laravel AI SDK. Puedes generar una clase de agente con el comandomake:agent.
app/Ai/Agents/. A continuación se muestra un ejemplo de un agente que implementa todas las interfaces principales.
Prompt
Envía un mensaje al agente con el métodoprompt().
make() puedes crear una instancia resolviendo sus dependencias desde el contenedor.
prompt().
Contexto conversacional
Si implementas la interfazConversational y defines el método messages(), puedes pasar el historial de conversación previo a la IA.
Con el trait RemembersConversations puedes guardar y recuperar automáticamente el historial de conversación en la base de datos.
forUser() y utiliza el conversationId devuelto para continuarla con continue().
Salida estructurada
Si implementas la interfazHasStructuredOutput y defines el esquema JSON en el método schema(), podrás recibir la respuesta de la IA como datos estructurados.
Objetos anidados
Arrays de objetos
anyOf (elegir entre varios esquemas)
Cuando el valor pueda coincidir con cualquiera de varios esquemas, usa el métodoanyOf.
Adjuntos
Con el argumentoattachments puedes pasar documentos e imágenes al agente.
Streaming
Con el métodostream() la respuesta se devuelve por fragmentos (chunks). Es útil para enviar respuestas largas al frontend en tiempo real.
then().
Protocolo Vercel AI SDK
Si usas Vercel AI SDK en el frontend, llama ausingVercelDataProtocol().
Broadcasting
Los eventos del stream pueden enviarse a canales de broadcast como Laravel Echo.broadcastOnQueue() puedes emitir el broadcast pasando por la cola.
Omitir eventos muy grandes
Algunas plataformas de broadcast limitan los mensajes de WebSocket a aproximadamente 10 KB. Los eventos de stream con mucho contenido (como resultados de herramientas de gran tamaño) pueden superar ese límite y fallar al emitirse. Con el atributoWithoutBroadcasting puedes excluir del broadcast tipos de eventos concretos.
agent_conversation_messages. De esta forma, el frontend puede obtener todos los datos de las herramientas tras finalizar el stream. Esto funciona tanto por cola (broadcastOnQueue) como de forma síncrona (broadcast / broadcastNow).
Cola
Con el métodoqueue() puedes encolar el prompt para procesarlo de forma asíncrona.
Herramientas
Las herramientas permiten que la IA invoque funciones de tu código. Puedes generar una clase de herramienta con el comandomake:tool.
tools() del agente.
Herramienta de búsqueda por similitud
Puedes añadir con facilidad una herramienta de búsqueda por similitud basada en embeddings vectoriales.withDescription() puedes personalizar la descripción de la herramienta.
Herramientas de almacenamiento de archivos
Con la fábrica de herramientasFileStorage puedes darle al agente acceso a un disco del sistema de archivos de Laravel. El método all devuelve el conjunto de herramientas para listar, leer, generar URL, escribir, eliminar y copiar archivos en el disco indicado.
readOnly.
Illuminate\Support\Collection, así que puedes filtrar aún más las herramientas que se ofrecen.
Herramientas MCP
Si tu aplicación utiliza Laravel MCP, puedes ofrecer al agente las herramientas expuestas por un servidor Model Context Protocol. Puedes utilizar el cliente MCP de Laravel para conectarte a un servidor MCP remoto o local y pasar sus herramientas directamente al agente.Para usar herramientas MCP necesitas tener instalado el paquete Laravel MCP en la aplicación.
tools del cliente MCP devuelve una colección, así que utiliza el operador spread ... para expandirla dentro del array tools del agente.
Herramientas de proveedor
Son herramientas especiales que el proveedor de IA implementa de forma nativa.Búsqueda web
Añade búsqueda web al agente. Compatible con Anthropic, OpenAI, Gemini y OpenRouter.Fetch web
Herramienta para obtener el contenido de la URL indicada. Compatible con Anthropic y Gemini.Búsqueda de archivos
Herramienta para buscar documentos en un vector store. Compatible con OpenAI y Gemini.FileSearchQuery.
Subagentes
Un agente también puede devolverse desde el métodotools() de otro agente. Al registrar un agente como herramienta, el agente padre puede delegar tareas concretas en el subagente e incorporar el resultado a su respuesta original. Resulta útil cuando un agente genérico necesita acceder a agentes especializados con instrucciones, herramientas, configuración de modelo o de proveedor específicas.
Por ejemplo, un agente de atención al cliente que delega las preguntas sobre políticas de reembolso a un agente especializado en reembolsos.
CanActAsTool en el subagente y define el nombre y la descripción de la herramienta.
CanActAsTool, Laravel usa el nombre de la clase como nombre de la herramienta y genera automáticamente una descripción genérica. Cada invocación de subagente es independiente y no hereda el historial de conversación del agente padre.
Middleware
Puedes añadir middleware al agente para interceptar prompts y respuestas.HasMiddleware en el agente y registra el middleware en el método middleware().
then() también puedes añadir procesamiento posterior a la respuesta.
Agentes anónimos
Con la función helperagent() puedes utilizar agentes anónimos sin necesidad de definir una clase.
Configuración del agente (atributos PHP)
Con atributos PHP puedes escribir la configuración por defecto del agente de forma declarativa.Opciones de proveedor
Al implementar la interfazHasProviderOptions puedes pasar opciones específicas del proveedor.
Aprobación humana de herramientas (Human Tool Approval)
En herramientas que realizan operaciones sensibles o irreversibles, como eliminar archivos o transferir dinero, puedes exigir aprobación humana antes de la ejecución. Para marcar una herramienta como aprobable, implementa el contratoApprovable y usa el trait InteractsWithApprovals. Las herramientas aprobables requieren aprobación por defecto.
needsApproval en la herramienta. Este método puede devolver un booleano o una instancia de Approval que incluya el motivo de la aprobación.
tools del agente también puedes sobreescribir el requisito de aprobación.
pendingApprovals en la respuesta para consultar el ID, el nombre de la herramienta, los argumentos y el motivo de aprobación de cada invocación.
Decisions con la decisión de cada invocación de herramienta pendiente. En una decisión puedes aprobar, rechazar o editar los argumentos de la invocación antes de ejecutarla.
true y false pueden usarse como forma abreviada de aprobar y rechazar, respectivamente. Todas las invocaciones de herramienta pendientes necesitan una decisión. Si indicas un ID de invocación desconocido, ausente o ya resuelto, se lanzará ApprovalMismatchException. Para las invocaciones sin decisión explícita, puedes indicar una decisión por defecto con los métodos approveRemaining o rejectRemaining.
Decision::reject('No fue aprobado.'), el resultado se devuelve al modelo y la respuesta continúa. Si se rechaza sin resultado, el bucle de generación se detiene en el momento en que se registra el rechazo.
La aprobación de herramientas se soporta en los métodos prompt, stream, queue, broadcast, broadcastNow y broadcastOnQueue.
Durante el streaming y el broadcasting, la pausa se representa como un evento tool_approval_request. Cuando utilizas el protocolo de stream de Vercel AI SDK, las solicitudes y los resultados de aprobación se emiten como las partes nativas de aprobación de herramientas del protocolo.
En el caso de agentes encolados, la respuesta resultante se pasa al callback then y Laravel también despacha el evento ToolApprovalRequested.
Laravel guarda el resultado de la ejecución de las herramientas aprobadas antes de pedirle al modelo que continúe. Si la generación posterior falla, las aprobaciones ya están resueltas. En lugar de reenviar la misma decisión de aprobación, continúa la conversación con un prompt de texto normal.
Flujo completo de aprobación
Las siguientes rutas muestran un flujo completo de aprobación. La rutaGET devuelve la pantalla de chat y la ruta POST recibe un nuevo prompt de texto desde la pantalla o una decisión de aprobación. En este ejemplo se asume que el modelo User de la aplicación usa el trait HasConversations.
awaiting_approval, la pantalla de chat mostrará las aprobaciones pendientes y deberá enviar al mismo endpoint la elección del usuario usando como clave el ID de la invocación de la herramienta.
message.
Generación de imágenes
Con la claseImage puedes generar imágenes. Compatible con los proveedores OpenAI, Gemini y xAI.
Guardar la imagen
Generar imágenes por cola
Síntesis de voz (TTS)
Con la claseAudio puedes convertir texto a voz. Compatible con los proveedores OpenAI y ElevenLabs.
Guardar el audio
Generar audio por cola
Transcripción (STT)
Con la claseTranscription puedes convertir archivos de audio a texto. Compatible con los proveedores OpenAI, ElevenLabs y Mistral.
Diarización de hablantes
Condiarize() obtienes una transcripción segmentada por hablante.
Transcripción por cola
Resumen de texto (Text Summarization)
Con el métodosummarize que proporciona la clase Stringable de Laravel puedes resumir un texto. Por defecto se resume en 3 frases como máximo, utilizando el modelo de texto más económico del proveedor configurado.
Str ofrece la versión estática.
Embeddings
Convierte texto en representaciones vectoriales para aprovecharlo en búsquedas por similitud, entre otras cosas.Embeddings multimodales
El métodoEmbeddings::for no solo acepta cadenas: también admite imágenes, audio, documentos y vídeo, de forma que puedes generar embeddings para contenido distinto del texto. Gemini soporta embeddings de imágenes, audio, documentos y vídeo; VoyageAI soporta embeddings de imágenes y vídeo.
VoyageAI no permite mezclar en la misma petición contenido multimedia de URL remotas con contenido codificado en Base64. Los archivos locales, de storage y subidos se envían como contenido codificado en Base64, y las entradas de texto se pueden combinar con cualquiera de las dos fuentes de contenido. Consulta la documentación de cada proveedor para conocer los modelos multimodales y las entradas disponibles.
Búsqueda vectorial (pgvector)
Ejemplo de configuración de búsqueda vectorial con PostgreSQL y la extensión pgvector.1
Crear la migración
2
Configurar el modelo
3
Consulta por similitud
Caché de embeddings
Puedes cachear los embeddings para no volver a generarlos con el mismo texto. Configura los valores por defecto de la caché enconfig/ai.php.
Reranking
Puedes reordenar (rerank) los resultados de búsqueda según su relevancia para la consulta. Compatible con los proveedores Cohere y Jina.limit() puedes limitar el número de resultados devueltos.
Reranking de colecciones
Puedes rerankar directamente una colección de Eloquent.Gestión de archivos
Puedes subir archivos al proveedor de IA para referenciarlos posteriormente.Referenciar un archivo ya guardado
Puedes adjuntar al agente un archivo ya subido a partir de su ID.Obtener y eliminar archivos
Especificar el proveedor
Especificar opciones específicas del proveedor
Con el métodowithProviderOptions puedes pasar opciones de subida específicas del proveedor. Por ejemplo, puedes configurar el purpose del archivo en OpenAI.
Vector Stores
Con los vector stores puedes gestionar los documentos en el lado del proveedor.Añadir archivos al store
Eliminar archivos del store
Failover
Si indicas varios proveedores en un array, cuando el primero falle se hará automáticamente fallback al siguiente.Pruebas
Laravel AI SDK ofrece funcionalidad de fakes para pruebas, de forma que puedas testear sin llamar a la API real.Pruebas de agentes
preventStrayPrompts() se lanza una excepción si se invoca un prompt que no ha sido definido en el fake.
Si se llama a
fake() en un agente con salida estructurada sin pasar datos falsos explícitos, Laravel genera automáticamente datos falsos acordes con el esquema definido por el agente.AnonymousAgent::fake().
Pruebas de generación de imágenes
Pruebas de síntesis de voz
Pruebas de transcripción
Pruebas de embeddings
Pruebas de reranking
Pruebas de archivos
Pruebas de vector stores
Eventos
Laravel AI SDK despacha los siguientes eventos. Puedes escucharlos para registrar logs, monitorizar, etc.Relacionados con agentes
Relacionados con agentes
PromptingAgent— antes de enviar el promptAgentPrompted— después de enviar el promptStreamingAgent— al iniciar el streamingAgentStreamed— al finalizar el streamingInvokingTool— antes de invocar la herramientaToolInvoked— después de invocar la herramientaToolApprovalRequested— cuando se solicita aprobación de la herramientaToolApprovalResolved— después de resolverse la aprobación de la herramienta
Relacionados con imágenes, audio y transcripción
Relacionados con imágenes, audio y transcripción
GeneratingImage— antes de generar la imagenImageGenerated— después de generar la imagenGeneratingAudio— antes de generar el audioAudioGenerated— después de generar el audioGeneratingTranscription— antes de generar la transcripciónTranscriptionGenerated— después de generar la transcripción
Relacionados con embeddings y reranking
Relacionados con embeddings y reranking
GeneratingEmbeddings— antes de generar los embeddingsEmbeddingsGenerated— después de generar los embeddingsReranking— antes del rerankingReranked— después del reranking
Relacionados con archivos y stores
Relacionados con archivos y stores
StoringFile— antes de guardar el archivoFileStored— después de guardar el archivoFileDeleted— después de eliminar el archivoCreatingStore— antes de crear el storeStoreCreated— después de crear el storeAddingFileToStore— antes de añadir el archivo al storeFileAddedToStore— después de añadir el archivo al storeRemovingFileFromStore— antes de eliminar el archivo del storeFileRemovedFromStore— después de eliminar el archivo del store