カスタムプロバイダーが必要な場面
Laravel AI SDKは OpenAI、Anthropic、Gemini、Mistral など主要なAIサービスを標準でサポートしています。しかし次のようなケースでは標準プロバイダーでは対応できません。- まだ公式対応されていない新興のAIサービス
- 社内のモデルゲートウェイや課金管理レイヤーを経由させたい
- 独自プロトコルや認証方式を持つオンプレミス推論サーバー
AiManager に登録することで、標準プロバイダーと同じAPIで利用できます。
OpenAI互換APIの場合は組み込みドライバーを使うSDK 0.9以降、
openai-compatible ドライバーが標準で提供されています。社内のOpenAI互換推論サーバー(Ollama の OpenAI互換エンドポイントなど)には config/ai.php に設定を追加するだけで利用でき、カスタムプロバイダーの実装は不要です。アーキテクチャの概要
2層構造
Laravel AI SDKはプロバイダーとゲートウェイの2層で構成されています。
すべてのプロバイダーは抽象クラス
Laravel\Ai\Providers\Provider を継承し、機能ごとのコントラクト(インターフェース)を実装します。ツール呼び出しを含むマルチステップのループは TextGenerationLoop がゲートウェイを繰り返し呼び出すことで実現されます。
コントラクト一覧
提供したい機能に応じて必要なコントラクトだけを実装します。ほとんどの場合は
TextProvider だけ実装すれば十分です。TextProviderコントラクト
テキスト生成プロバイダーが実装するインターフェースです(src/Contracts/Providers/TextProvider.php)。
prompt() と stream() の実装は既存のトレイト(GeneratesText、StreamsText)に任せられるため、実際に実装が必要なのはモデル名を返す3つのメソッドと textGateway() の合計4つです。マルチステップのツールループは TextGenerationLoop が管理するため、ゲートウェイは1ステップ分のリクエストのみを処理します。
実装例:カスタムプロバイダー
独自APIを持つ推論サービスをmy-inference というプロバイダーとして登録する例です。
1
プロバイダークラスを作成する
app/Ai/Providers/MyInferenceProvider.php を作成します。2
AppServiceProviderに登録する
App\Providers\AppServiceProvider の boot メソッドで extend() を使って登録します。3
config/ai.phpにプロバイダーを追加する
.env にも追加します。4
エージェントから使う
登録後は デフォルトのプロバイダーとして使う場合は
prompt() の provider 引数にプロバイダー名を指定するだけで標準プロバイダーと同じように使えます。config/ai.php の default キーを変更します。カスタムゲートウェイの実装
OpenAI互換ではない独自APIを持つサービスには、StepTextGateway コントラクトを実装したカスタムゲートウェイが必要です。
StepTextGatewayコントラクト
src/Contracts/Gateway/StepTextGateway.php が定義するインターフェースです。ゲートウェイは会話の1ステップ分のリクエストを処理し、StepResponse を返します。ツール呼び出しのループは呼び出し元の TextGenerationLoop が管理します。
カスタムゲートウェイの実装例
独自の推論APIにHTTPリクエストを送るシンプルなゲートウェイの骨格です。ツール呼び出し(function calling)をサポートする場合は
generateTextStep() でツールの呼び出し結果を toolCalls に含め、finishReason を FinishReason::ToolCalls にします。ツールの実行と次のステップへの移行は TextGenerationLoop が自動で処理します。実装の参考には AnthropicGateway.php を参照してください。テスト方法
エージェントクラスの fake() を使う
カスタムプロバイダーを使うエージェントのテストには、エージェントクラスのfake() メソッドを使います。カスタムプロバイダーかどうかに関係なく、フェイクゲートウェイがプロバイダーにセットされます。
0.9以降、
Agent::fake() のレスポンスは実際のプロバイダーと同じ TextGenerationLoop を通ります。ツールを登録していないエージェントでフェイクのツール呼び出しを設定した場合、NoSuchToolException がスローされます。extend() を使ったモックプロバイダー
extend() を使って、テスト用のプロバイダーをコンテナから登録することもできます。
参考リンク
OllamaProvider.php — シンプルなプロバイダー実装例
ローカルモデルサーバーに接続するプロバイダーの最小構成です。カスタムプロバイダー実装の参考になります。
AnthropicGateway.php — ゲートウェイの実装例
StepTextGateway を実装したゲートウェイの実装例です。generateTextStep() と generateStreamStep() の実装が確認できます。StepTextGateway Contract
テキスト生成ゲートウェイが実装するインターフェースの定義です。
TextProvider Contract
テキスト生成プロバイダーが実装するインターフェースの定義です。