Skip to main content

カスタムプロバイダーが必要な場面

Laravel AI SDKは OpenAI、Anthropic、Gemini、Mistral など主要なAIサービスを標準でサポートしています。しかし次のようなケースでは標準プロバイダーでは対応できません。
  • まだ公式対応されていない新興のAIサービス
  • 社内のモデルゲートウェイや課金管理レイヤーを経由させたい
  • 独自プロトコルや認証方式を持つオンプレミス推論サーバー
このような場合に、カスタムプロバイダーを実装してSDKの 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() の実装は既存のトレイト(GeneratesTextStreamsText)に任せられるため、実際に実装が必要なのはモデル名を返す3つのメソッドと textGateway() の合計4つです。マルチステップのツールループは TextGenerationLoop が管理するため、ゲートウェイは1ステップ分のリクエストのみを処理します。

実装例:カスタムプロバイダー

独自APIを持つ推論サービスを my-inference というプロバイダーとして登録する例です。
1

プロバイダークラスを作成する

app/Ai/Providers/MyInferenceProvider.php を作成します。
2

AppServiceProviderに登録する

App\Providers\AppServiceProviderboot メソッドで extend() を使って登録します。
3

config/ai.phpにプロバイダーを追加する

.env にも追加します。
4

エージェントから使う

登録後は prompt()provider 引数にプロバイダー名を指定するだけで標準プロバイダーと同じように使えます。
デフォルトのプロバイダーとして使う場合は config/ai.phpdefault キーを変更します。

カスタムゲートウェイの実装

OpenAI互換ではない独自APIを持つサービスには、StepTextGateway コントラクトを実装したカスタムゲートウェイが必要です。

StepTextGatewayコントラクト

src/Contracts/Gateway/StepTextGateway.php が定義するインターフェースです。ゲートウェイは会話の1ステップ分のリクエストを処理し、StepResponse を返します。ツール呼び出しのループは呼び出し元の TextGenerationLoop が管理します。
0.8以前の TextGateway コントラクト(generateText()stream()onToolInvocation())は0.9で削除されました。カスタムゲートウェイを持っている場合は StepTextGateway への移行が必要です。ツール呼び出しの onToolInvocation()TextGenerationLoop に移動しています。

カスタムゲートウェイの実装例

独自の推論APIにHTTPリクエストを送るシンプルなゲートウェイの骨格です。
ツール呼び出し(function calling)をサポートする場合は generateTextStep() でツールの呼び出し結果を toolCalls に含め、finishReasonFinishReason::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

テキスト生成プロバイダーが実装するインターフェースの定義です。
最終更新日 2026年7月11日