はじめに
Laravel AI SDK は、OpenAI・Anthropic・Gemini などの AI プロバイダーと対話するための統一された表現力豊かな API を提供します。AI SDK を使うと、ツールや構造化出力を備えたインテリジェントなエージェントの構築、画像生成、音声合成・文字起こし、ベクター埋め込みの作成など、多彩な AI 機能を一貫した Laravel らしいインターフェースで実現できます。Laravel AI SDK は Laravel 13 で追加された公式パッケージです。
laravel/ai として提供されており、複数の AI プロバイダーを統一 API で扱えます。プロバイダーサポート一覧
インストール
1
パッケージのインストール
Composer で Laravel AI SDK をインストールします。
2
設定ファイルとマイグレーションの公開
vendor:publish Artisan コマンドで設定ファイルとマイグレーションを公開します。3
マイグレーションの実行
データベースマイグレーションを実行します。
agent_conversations と agent_conversation_messages テーブルが作成され、会話履歴の保存に使われます。設定
環境変数
使用する AI プロバイダーの API キーを.env ファイルに設定します。
config/ai.php でも設定できます。
カスタムベース URL
プロキシサービスを経由させる場合は、プロバイダーごとにカスタム URL を設定できます。OpenAI-Compatible プロバイダー
LM Studio・vLLM・Together・Fireworks・ローカルゲートウェイなど、OpenAI 互換の API を使用する場合はopenai-compatible ドライバーでプロバイダーを設定できます。url は必須で、key を指定した場合は Bearer トークンとして送信されます。
Lab enum
コード内でプロバイダーを参照するにはLab enum を使います。
エージェント
エージェントは Laravel AI SDK の基本的な構成要素です。make:agent コマンドでエージェントクラスを生成できます。
app/Ai/Agents/ ディレクトリに配置されます。以下は主要なインターフェースをすべて実装したエージェントの例です。
プロンプト
prompt() メソッドでエージェントにメッセージを送ります。
make() 静的メソッドを使うと、コンテナから依存関係を解決してインスタンスを生成できます。
prompt() の引数で上書きできます。
会話コンテキスト
Conversational インターフェースを実装して messages() メソッドを定義すると、過去の会話履歴を AI に渡せます。
RemembersConversations トレイトを使うと、会話履歴をデータベースに自動保存・取得できます。
forUser() で会話を開始し、返ってきた conversationId を使って continue() で続きの会話ができます。
構造化出力
HasStructuredOutput インターフェースを実装し、schema() メソッドで JSON スキーマを定義すると、AI のレスポンスを構造化されたデータとして受け取れます。
ネストされたオブジェクト
オブジェクトの配列
anyOf(複数スキーマの選択)
値が複数のスキーマのいずれかにマッチする場合は、anyOf メソッドを使います。
添付ファイル
attachments 引数でドキュメントや画像をエージェントに渡せます。
ストリーミング
stream() メソッドを使うと、レスポンスをチャンク単位で返せます。長いレスポンスをリアルタイムにフロントエンドへ送るのに適しています。
then() コールバックで、ストリーミング完了後の処理を記述できます。
Vercel AI SDK プロトコル
フロントエンドで Vercel AI SDK を使う場合はusingVercelDataProtocol() を呼びます。
ブロードキャスト
ストリームのイベントを Laravel Echo などのブロードキャストチャンネルに送信できます。broadcastOnQueue() を使うと、キューを経由してブロードキャストできます。
巨大なイベントのスキップ
ブロードキャストプラットフォームによっては WebSocket メッセージを約 10KB に制限しているものがあります。大きなツール結果など、データ量の多いストリームイベントがこの上限を超えてブロードキャストに失敗することがあります。WithoutBroadcasting Attribute を使用して、特定のイベントタイプをブロードキャストから除外できます。
agent_conversation_messages テーブルへの保存は引き続き行われます。そのため、フロントエンドはストリーム完了後にツールの全データを取得できます。これはキュー経由(broadcastOnQueue)と同期(broadcast / broadcastNow)の両方で機能します。
キュー
queue() メソッドでプロンプトをキューに積んで非同期処理できます。
ツール
ツールを使うと、AI がコード内の関数を呼び出せるようになります。make:tool コマンドでツールクラスを生成できます。
tools() メソッドでツールを登録します。
類似検索ツール
ベクター埋め込みを使った類似検索ツールを簡単に追加できます。withDescription() でツールの説明をカスタマイズできます。
ファイルストレージツール
FileStorage ツールファクトリーを使うと、エージェントに Laravel ファイルシステムディスクへのアクセスを与えられます。all メソッドは、指定ディスク上のファイルを一覧・読み取り・URL 生成・書き込み・削除・コピーするツール一式を返します。
readOnly メソッドを使います。
Illuminate\Support\Collection を返すため、提供するツールをさらに絞り込めます。
MCP ツール
アプリケーションで Laravel MCP を使っている場合、Model Context Protocol サーバーが公開するツールをエージェントに提供できます。Laravel MCP クライアントを使って、リモートまたはローカルの MCP サーバーに接続し、そのツールをエージェントに直接渡すことができます。MCP ツールを使用するには、アプリケーションに Laravel MCP パッケージがインストールされている必要があります。
tools メソッドはコレクションを返すため、... スプレッド演算子を使ってエージェントの tools 配列に展開します。
プロバイダーツール
AI プロバイダーがネイティブで実装している特別なツールです。Web 検索
ウェブ検索をエージェントに追加します。Anthropic・OpenAI・Gemini・OpenRouter に対応しています。Web フェッチ
指定した URL のコンテンツを取得するツールです。Anthropic・Gemini に対応しています。ファイル検索
ベクターストアからドキュメントを検索するツールです。OpenAI・Gemini に対応しています。FileSearchQuery を使った複雑なフィルターも指定できます。
サブエージェント
エージェントは別のエージェントのtools() メソッドから返すこともできます。エージェントをツールとして登録すると、親エージェントが特定のタスクをサブエージェントに委譲し、その結果を元の応答に組み込めます。汎用エージェントが専門的な指示・ツール・モデル設定・プロバイダー設定を持つ特化型エージェントにアクセスするときに便利です。
たとえば、カスタマーサポートエージェントが返金ポリシーの質問を返金専門エージェントに委譲する例です。
CanActAsTool インターフェースを実装し、ツール用の名前と説明を定義します。
CanActAsTool を実装しないサブエージェントの場合、Laravel はクラス名をツール名として使用し、汎用的な説明文を自動で生成します。各サブエージェントの呼び出しは独立して行われ、親エージェントの会話履歴は引き継ぎません。
ミドルウェア
エージェントにミドルウェアを追加して、プロンプトやレスポンスをインターセプトできます。HasMiddleware インターフェースを実装し、middleware() メソッドでミドルウェアを登録します。
then() を使うと、レスポンス後の処理も追加できます。
匿名エージェント
クラスを定義せずにagent() ヘルパーで匿名エージェントを使えます。
エージェント設定(PHP Attributes)
PHP Attribute を使ってエージェントのデフォルト設定を宣言的に記述できます。プロバイダーオプション
HasProviderOptions インターフェースを実装すると、プロバイダー固有のオプションを渡せます。
人間による承認(Human Tool Approval)
ファイルの削除や送金など、機密性の高い操作や取り消せない操作を行うツールには、実行前に人間の承認を要求できます。ツールを承認対象にするには、Approvableコントラクトを実装しInteractsWithApprovalsトレイトを使用します。承認対象のツールはデフォルトで承認が必須になります。
needsApprovalメソッドを定義します。このメソッドは真偽値か、承認理由を含むApprovalインスタンスを返せます。
toolsメソッドからツールを返す際に、承認要件を上書きすることもできます。
pendingApprovalsを調べることで、各ツール呼び出しのID・ツール名・引数・承認理由を確認できます。
Decisionsインスタンスを渡します。決定では呼び出しの承認・却下・実行前の引数の編集が行えます。
true・falseは、それぞれ承認・却下の省略記法として使えます。保留中のすべてのツール呼び出しには決定が必要です。不明・欠落・すでに解決済みのツール呼び出しIDを指定するとApprovalMismatchExceptionがスローされます。明示的な決定がない呼び出しに対しては、approveRemainingまたはrejectRemainingメソッドでデフォルトの決定を指定できます。
Decision::reject('承認されませんでした。')のように結果付きで却下すると、モデルに返されて応答が継続されます。結果なしで却下すると、却下が記録された時点で生成ループが停止します。
ツール承認はprompt・stream・queue・broadcast・broadcastNow・broadcastOnQueueメソッドでサポートされています。
ストリーミングおよびブロードキャスト中は、一時停止がtool_approval_requestイベントとして表現されます。Vercel AI SDK ストリームプロトコルを使用している場合、承認リクエストと結果はプロトコルのネイティブなツール承認パートとして送出されます。
キューイングされたエージェントの場合、結果のレスポンスはthenコールバックに渡され、Laravel はToolApprovalRequestedイベントもディスパッチします。
Laravel は、モデルに続行を求める前に、承認済みツールの実行結果を保存します。その後に生成が失敗した場合、承認はすでに解決済みです。同じ承認決定を再送するのではなく、通常のテキストプロンプトで会話を継続してください。
完全な承認フロー
以下のルートは、完全な承認フローを示します。GETルートはチャット画面を返し、POSTルートはチャット画面からの新しいテキストプロンプトまたは承認決定のいずれかを受け取ります。この例では、アプリケーションのUserモデルがHasConversationsトレイトを使用していることを前提としています。
awaiting_approvalの場合、チャット画面は保留中の承認を表示し、ツール呼び出しIDをキーとしてユーザーの選択を同じエンドポイントに送信する必要があります。
messageの値を送信します。
画像生成
Image クラスで画像を生成できます。OpenAI・Gemini・xAI プロバイダーが対応しています。
画像の保存
キューで画像生成
音声合成(TTS)
Audio クラスでテキストを音声に変換できます。OpenAI・ElevenLabs プロバイダーが対応しています。
音声の保存
キューで音声生成
文字起こし(STT)
Transcription クラスで音声ファイルをテキストに変換できます。OpenAI・ElevenLabs・Mistral プロバイダーが対応しています。
話者分離(ダイアリゼーション)
diarize() を使うと、話者ごとに分離した文字起こしが得られます。
キューで文字起こし
埋め込み(Embeddings)
テキストをベクター表現に変換して、類似検索などに活用できます。マルチモーダル埋め込み(Multimodal Embeddings)
Embeddings::for メソッドは文字列だけでなく、画像・音声・ドキュメント・動画の入力も受け付けるため、テキスト以外のコンテンツに対しても埋め込みを生成できます。Gemini は画像・音声・ドキュメント・動画の埋め込みに対応し、VoyageAI は画像・動画の埋め込みに対応しています。
VoyageAI はリモート URL のメディアと Base64 エンコードされたメディアを同一リクエスト内で混在させることを許可していません。ローカル・ストレージ・アップロードされたファイルは Base64 エンコードされたコンテンツとして送信され、テキスト入力はどちらのメディアソースとも組み合わせられます。利用可能なマルチモーダルモデルと入力については、各プロバイダーのドキュメントを確認してください。
ベクター検索(pgvector)
PostgreSQL と pgvector 拡張を使ったベクター検索の設定例です。1
マイグレーションの作成
2
モデルの設定
3
類似検索クエリ
埋め込みのキャッシュ
同じテキストの埋め込み生成を繰り返さないようにキャッシュできます。config/ai.php でデフォルトのキャッシュ設定を行います。
リランキング
検索結果をクエリへの関連度でリランク(並び替え)できます。Cohere・Jina プロバイダーが対応しています。limit() で返す件数を絞り込めます。
コレクションのリランキング
Eloquent コレクションを直接リランクできます。ファイル管理
AI プロバイダーにファイルをアップロードして、後から参照できます。保存済みファイルの参照
アップロード済みのファイル ID でエージェントに添付できます。ファイルの取得・削除
プロバイダーの指定
プロバイダー固有オプションの指定
withProviderOptions メソッドでプロバイダー固有のアップロードオプションを渡せます。たとえば OpenAI のファイル purpose を設定できます。
ベクターストア
ベクターストアを使うと、ドキュメントをプロバイダー側で管理できます。ストアへのファイル追加
ストアからのファイル削除
フェイルオーバー
複数のプロバイダーを配列で指定すると、最初のプロバイダーが失敗した場合に次のプロバイダーへ自動フォールバックします。テスト
Laravel AI SDK はテスト用のフェイク機能を提供しており、実際の API を呼び出さずにテストできます。エージェントのテスト
preventStrayPrompts() を使うと、フェイクで定義していないプロンプトが呼ばれた場合に例外を投げます。
構造化出力エージェントに対して
fake() がフェイクデータを明示的に渡さずに呼ばれた場合、Laravel はエージェントの定義したスキーマに合致するフェイクデータを自動生成します。AnonymousAgent::fake() を使います。
画像生成のテスト
音声合成のテスト
文字起こしのテスト
埋め込みのテスト
リランキングのテスト
ファイルのテスト
ベクターストアのテスト
イベント
Laravel AI SDK は以下のイベントをディスパッチします。これらのイベントをリスニングすることで、ログの記録や監視などに活用できます。エージェント関連
エージェント関連
PromptingAgent— プロンプト送信前AgentPrompted— プロンプト送信後StreamingAgent— ストリーミング開始時AgentStreamed— ストリーミング完了後InvokingTool— ツール呼び出し前ToolInvoked— ツール呼び出し後ToolApprovalRequested— ツール承認要求時ToolApprovalResolved— ツール承認解決後
画像・音声・文字起こし関連
画像・音声・文字起こし関連
GeneratingImage— 画像生成前ImageGenerated— 画像生成後GeneratingAudio— 音声生成前AudioGenerated— 音声生成後GeneratingTranscription— 文字起こし前TranscriptionGenerated— 文字起こし後
埋め込み・リランキング関連
埋め込み・リランキング関連
GeneratingEmbeddings— 埋め込み生成前EmbeddingsGenerated— 埋め込み生成後Reranking— リランキング前Reranked— リランキング後
ファイル・ストア関連
ファイル・ストア関連
StoringFile— ファイル保存前FileStored— ファイル保存後FileDeleted— ファイル削除後CreatingStore— ストア作成前StoreCreated— ストア作成後AddingFileToStore— ストアへのファイル追加前FileAddedToStore— ストアへのファイル追加後RemovingFileFromStore— ストアからのファイル削除前FileRemovedFromStore— ストアからのファイル削除後