Skip to main content

Cuándo necesitas un proveedor personalizado

Laravel AI SDK soporta de forma predeterminada los principales servicios de IA como OpenAI, Anthropic, Gemini y Mistral. Sin embargo, en los siguientes casos los proveedores estándar no bastan:
  • Servicios de IA emergentes que aún no cuentan con soporte oficial.
  • Cuando quieres pasar por una gateway de modelos interna o una capa de gestión de facturación.
  • Servidores de inferencia on-premise con protocolos o esquemas de autenticación propios.
En estos casos, si implementas un proveedor personalizado y lo registras en el AiManager del SDK, podrás utilizarlo con la misma API que los proveedores estándar.
Para APIs compatibles con OpenAI, usa el driver integradoDesde la versión 0.9 del SDK se proporciona el driver openai-compatible. Para servidores de inferencia internos compatibles con OpenAI (como el endpoint compatible con OpenAI de Ollama), basta con añadir la configuración a config/ai.php; no es necesario implementar un proveedor personalizado.

Descripción general de la arquitectura

Estructura de dos capas

Laravel AI SDK está compuesto por dos capas: proveedores (providers) y gateways. Todos los proveedores extienden la clase abstracta Laravel\Ai\Providers\Provider e implementan los contratos (interfaces) correspondientes a cada capacidad. Los bucles de varios pasos que incluyen llamadas a herramientas se ejecutan haciendo que TextGenerationLoop invoque el gateway de forma repetida.

Lista de contratos

Implementa solo los contratos necesarios según las funcionalidades que quieras ofrecer.
En la mayoría de los casos, basta con implementar TextProvider.

Contrato TextProvider

Es la interfaz que implementan los proveedores de generación de texto (src/Contracts/Providers/TextProvider.php).
Las implementaciones de prompt() y stream() pueden delegarse en los traits existentes (GeneratesText, StreamsText), por lo que en la práctica solo debes implementar los tres métodos que devuelven el nombre del modelo y textGateway(), un total de cuatro. Como el bucle de herramientas multi-paso lo gestiona TextGenerationLoop, el gateway solo procesa la petición de un único paso.

Ejemplo de implementación: un proveedor personalizado

Ejemplo para registrar un servicio de inferencia con una API propia como proveedor llamado my-inference.
1

Crea la clase del proveedor

Crea app/Ai/Providers/MyInferenceProvider.php.
2

Regístralo en el AppServiceProvider

Regístralo con extend() en el método boot de App\Providers\AppServiceProvider.
3

Añade el proveedor a config/ai.php

Añádelo también en tu .env.
4

Úsalo desde un agente

Una vez registrado, basta con especificar el nombre del proveedor en el argumento provider de prompt() para usarlo igual que un proveedor estándar.
Si quieres usarlo como proveedor predeterminado, cambia la clave default de config/ai.php.

Implementar un gateway personalizado

Para servicios con una API propia que no sea compatible con OpenAI, necesitarás un gateway personalizado que implemente el contrato StepTextGateway.

Contrato StepTextGateway

Es la interfaz definida en src/Contracts/Gateway/StepTextGateway.php. El gateway procesa la petición correspondiente a un solo paso de la conversación y devuelve un StepResponse. El bucle de llamadas a herramientas lo gestiona TextGenerationLoop desde la capa superior.
El contrato TextGateway anterior a 0.8 (generateText(), stream(), onToolInvocation()) fue eliminado en 0.9. Si tienes un gateway personalizado, debes migrarlo a StepTextGateway. El onToolInvocation() para llamadas a herramientas se ha movido a TextGenerationLoop.

Ejemplo de implementación de un gateway personalizado

Este es el esqueleto de un gateway sencillo que envía peticiones HTTP a una API de inferencia propia.
Si tu gateway soporta llamadas a herramientas (function calling), incluye los resultados de la llamada en toolCalls desde generateTextStep() y establece finishReason como FinishReason::ToolCalls. La ejecución de las herramientas y el paso al siguiente step los gestiona TextGenerationLoop automáticamente. Como referencia de implementación, consulta AnthropicGateway.php.

Cómo hacer pruebas

Usa fake() en la clase del agente

Para probar un agente que utiliza un proveedor personalizado, utiliza el método fake() de la clase del agente. Se instalará un gateway falso en el proveedor, independientemente de si se trata de un proveedor personalizado o no.
Desde 0.9, las respuestas de Agent::fake() pasan por el mismo TextGenerationLoop que un proveedor real. Si configuras una llamada falsa a una herramienta en un agente sin herramientas registradas, se lanzará NoSuchToolException.

Proveedor mock usando extend()

También puedes registrar un proveedor de prueba en el contenedor usando extend().

Enlaces de referencia

OllamaProvider.php — ejemplo simple de implementación de un provider

Configuración mínima de un proveedor que se conecta a un servidor de modelos local. Es una buena referencia para implementar tu propio proveedor.

AnthropicGateway.php — ejemplo de implementación de gateway

Ejemplo de implementación de un gateway que implementa StepTextGateway. Puedes ver la implementación de generateTextStep() y generateStreamStep().

StepTextGateway Contract

Definición de la interfaz que implementan los gateways de generación de texto.

TextProvider Contract

Definición de la interfaz que implementan los proveedores de generación de texto.
Última modificación el 13 de julio de 2026