Skip to main content

Quando serve un provider personalizzato

Laravel AI SDK supporta di default i principali servizi AI (OpenAI, Anthropic, Gemini, Mistral). Ma nei casi seguenti i provider standard non bastano.
  • Servizi AI emergenti non ancora ufficialmente supportati
  • Vuoi passare attraverso un gateway di modelli interno o un livello di gestione fatturazione aziendale
  • Server di inferenza on-premise con protocolli o metodi di autenticazione proprietari
In queste situazioni implementi un provider personalizzato e lo registri nel AiManager dell’SDK: potrai poi usarlo con la stessa API dei provider standard.
Per API OpenAI-compatibili usa il driver integratoDa SDK 0.9 è disponibile il driver openai-compatible. Per server di inferenza interni OpenAI-compatibili (per esempio l’endpoint OpenAI-compatibile di Ollama) basta aggiungere una voce a config/ai.php senza implementare un provider custom.

Panoramica dell’architettura

Struttura a due livelli

Laravel AI SDK è composto da due livelli: Provider e Gateway. Tutti i provider estendono la classe astratta Laravel\Ai\Providers\Provider e implementano i contract (interfacce) delle funzionalità che offrono. Il loop multi-step con chiamata di tool è realizzato da TextGenerationLoop che invoca ripetutamente il gateway.

Elenco dei contract

Implementi solo i contract corrispondenti alle funzionalità che vuoi offrire.
Nella maggior parte dei casi implementare solo TextProvider è sufficiente.

Il contract TextProvider

Interfaccia che i provider di generazione testo implementano (src/Contracts/Providers/TextProvider.php).
L’implementazione di prompt() e stream() può essere delegata ai trait esistenti (GeneratesText, StreamsText), quindi in pratica devi implementare quattro metodi: i tre che restituiscono i nomi dei modelli e textGateway(). Il loop multi-step per i tool è gestito da TextGenerationLoop: il gateway elabora solo la richiesta di un singolo step.

Esempio di implementazione: provider personalizzato

Esempio di registrazione di un servizio di inferenza proprietario con un provider chiamato my-inference.
1

Creare la classe provider

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

Registrarlo in AppServiceProvider

Nel metodo boot di App\Providers\AppServiceProvider registra il provider con extend().
3

Aggiungere il provider a config/ai.php

Aggiungi anche in .env.
4

Utilizzo da un agente

Dopo la registrazione, basta indicare il nome del provider nell’argomento provider di prompt() per usarlo come qualsiasi altro provider standard.
Per usarlo come provider di default, cambia la chiave default in config/ai.php.

Implementazione di un gateway personalizzato

Per servizi con API proprietarie non OpenAI-compatibili ti serve un gateway custom che implementi il contract StepTextGateway.

Il contract StepTextGateway

Interfaccia definita in src/Contracts/Gateway/StepTextGateway.php. Il gateway gestisce la richiesta di un solo step della conversazione e restituisce uno StepResponse. Il loop delle chiamate di tool è gestito dal TextGenerationLoop chiamante.
Il vecchio contract TextGateway (generateText(), stream(), onToolInvocation()) presente fino alla 0.8 è stato rimosso nella 0.9. Se hai gateway custom devi migrare a StepTextGateway. onToolInvocation() è stato spostato in TextGenerationLoop.

Esempio di implementazione di un gateway custom

Scheletro di un gateway semplice che invia richieste HTTP a un’API di inferenza proprietaria.
Se vuoi supportare la chiamata di tool (function calling), in generateTextStep() includi le tool call in toolCalls e imposta finishReason su FinishReason::ToolCalls. L’esecuzione dei tool e il passaggio allo step successivo sono gestiti automaticamente da TextGenerationLoop. Come riferimento consulta AnthropicGateway.php.

Come testare

Usare fake() sulla classe Agent

Per testare un agente che usa un provider custom, usa il metodo fake() della classe Agent. Indipendentemente dal fatto che sia custom o meno, un gateway fake viene assegnato al provider.
Da 0.9, le risposte di Agent::fake() passano attraverso lo stesso TextGenerationLoop del provider reale. Se imposti una chiamata di tool fake su un agente che non registra tool, viene sollevata NoSuchToolException.

Provider mock con extend()

Puoi anche registrare un provider di test tramite il container usando extend().

OllamaProvider.php — esempio semplice di provider

Configurazione minima di un provider che si collega a un model server locale. Utile come riferimento per implementare provider custom.

AnthropicGateway.php — esempio di gateway

Esempio di gateway che implementa StepTextGateway. Puoi vedere l’implementazione di generateTextStep() e generateStreamStep().

Contract StepTextGateway

Definizione dell’interfaccia che un text generation gateway deve implementare.

Contract TextProvider

Definizione dell’interfaccia che un text generation provider deve implementare.
Ultima modifica il 13 luglio 2026