Skip to main content

はじめに

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_conversationsagent_conversation_messages テーブルが作成され、会話履歴の保存に使われます。

設定

環境変数

使用する AI プロバイダーの API キーを .env ファイルに設定します。
テキスト・画像・音声・文字起こし・埋め込みに使うデフォルトモデルは config/ai.php でも設定できます。

カスタムベース URL

プロキシサービスを経由させる場合は、プロバイダーごとにカスタム URL を設定できます。
カスタムベース URL は OpenAI・Anthropic・Gemini・Groq・Cohere・DeepSeek・xAI・OpenRouter で利用できます。

OpenAI-Compatible プロバイダー

LM Studio・vLLM・Together・Fireworks・ローカルゲートウェイなど、OpenAI 互換の API を使用する場合は openai-compatible ドライバーでプロバイダーを設定できます。url は必須で、key を指定した場合は Bearer トークンとして送信されます。
設定後は、他のプロバイダーと同様にプロバイダー名で指定できます。
デフォルトテキストモデルを設定しておくと、毎回モデルを指定せずに使えます。
OpenAI-Compatible プロバイダーはテキスト生成・ストリーミング・ツール・構造化出力・画像添付に対応しています。エンドポイントで追加のリクエストボディフィールドが必要な場合は、プロバイダーオプションを使用してください。

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 パッケージがインストールされている必要があります。
MCP クライアントの tools メソッドはコレクションを返すため、... スプレッド演算子を使ってエージェントの tools 配列に展開します。
AI SDK は各 MCP ツールを自動的にラップし、エージェントが他のツールと同様に呼び出せるようにします。名前付き MCP クライアント を使うこともできます。
または、ローカル MCP サーバー に接続することも可能です。
MCP クライアントの作成と認証(Bearer トークンや OAuth など)については、MCP クライアントのドキュメント を参照してください。

プロバイダーツール

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 を使ってエージェントのデフォルト設定を宣言的に記述できます。
モデル選択のショートカット Attribute も用意されています。

プロバイダーオプション

HasProviderOptions インターフェースを実装すると、プロバイダー固有のオプションを渡せます。

人間による承認(Human Tool Approval)

ツール承認を利用するには、会話履歴が永続化されるConversationalエージェントが必要です。一時停止した呼び出しを再開するために、RemembersConversationsトレイトが必要な永続化機能を提供します。
ファイルの削除や送金など、機密性の高い操作や取り消せない操作を行うツールには、実行前に人間の承認を要求できます。ツールを承認対象にするには、Approvableコントラクトを実装しInteractsWithApprovalsトレイトを使用します。承認対象のツールはデフォルトで承認が必須になります。
ツール呼び出しの引数に応じて承認の要否を判定したい場合は、ツールにneedsApprovalメソッドを定義します。このメソッドは真偽値か、承認理由を含むApprovalインスタンスを返せます。
エージェントのtoolsメソッドからツールを返す際に、承認要件を上書きすることもできます。
承認対象のツールが呼び出されると、エージェントは実行前に一時停止します。レスポンスのpendingApprovalsを調べることで、各ツール呼び出しのID・ツール名・引数・承認理由を確認できます。
エージェントを再開するには、会話を継続し、保留中の各ツール呼び出しに対する決定を含むDecisionsインスタンスを渡します。決定では呼び出しの承認・却下・実行前の引数の編集が行えます。
真偽値のtruefalseは、それぞれ承認・却下の省略記法として使えます。保留中のすべてのツール呼び出しには決定が必要です。不明・欠落・すでに解決済みのツール呼び出しIDを指定するとApprovalMismatchExceptionがスローされます。明示的な決定がない呼び出しに対しては、approveRemainingまたはrejectRemainingメソッドでデフォルトの決定を指定できます。
Decision::reject('承認されませんでした。')のように結果付きで却下すると、モデルに返されて応答が継続されます。結果なしで却下すると、却下が記録された時点で生成ループが停止します。 ツール承認はpromptstreamqueuebroadcastbroadcastNowbroadcastOnQueueメソッドでサポートされています。 ストリーミングおよびブロードキャスト中は、一時停止がtool_approval_requestイベントとして表現されます。Vercel AI SDK ストリームプロトコルを使用している場合、承認リクエストと結果はプロトコルのネイティブなツール承認パートとして送出されます。 キューイングされたエージェントの場合、結果のレスポンスはthenコールバックに渡され、Laravel はToolApprovalRequestedイベントもディスパッチします。 Laravel は、モデルに続行を求める前に、承認済みツールの実行結果を保存します。その後に生成が失敗した場合、承認はすでに解決済みです。同じ承認決定を再送するのではなく、通常のテキストプロンプトで会話を継続してください。

完全な承認フロー

以下のルートは、完全な承認フローを示します。GETルートはチャット画面を返し、POSTルートはチャット画面からの新しいテキストプロンプトまたは承認決定のいずれかを受け取ります。この例では、アプリケーションのUserモデルがHasConversationsトレイトを使用していることを前提としています。
レスポンスのステータスがawaiting_approvalの場合、チャット画面は保留中の承認を表示し、ツール呼び出しIDをキーとしてユーザーの選択を同じエンドポイントに送信する必要があります。
通常のチャットメッセージの場合は、代わりにmessageの値を送信します。
承認フローはAIエージェントに強力な操作権限を与えつつ、実行前に人間のチェックを挟める仕組みです。ファイル削除・決済処理・外部APIへの書き込みなど、取り消しの効かない操作を伴うツールでは積極的に活用しましょう。

画像生成

Image クラスで画像を生成できます。OpenAI・Gemini・xAI プロバイダーが対応しています。
品質やアスペクト比・タイムアウトを指定できます。
参照画像を添付して加工することもできます。

画像の保存

キューで画像生成


音声合成(TTS)

Audio クラスでテキストを音声に変換できます。OpenAI・ElevenLabs プロバイダーが対応しています。
声の性別や具体的なボイス ID、話し方の指示も指定できます。

音声の保存

キューで音声生成


文字起こし(STT)

Transcription クラスで音声ファイルをテキストに変換できます。OpenAI・ElevenLabs・Mistral プロバイダーが対応しています。

話者分離(ダイアリゼーション)

diarize() を使うと、話者ごとに分離した文字起こしが得られます。

キューで文字起こし


埋め込み(Embeddings)

テキストをベクター表現に変換して、類似検索などに活用できます。
プロバイダー・モデル・次元数を指定することもできます。

マルチモーダル埋め込み(Multimodal Embeddings)

Embeddings::for メソッドは文字列だけでなく、画像・音声・ドキュメント・動画の入力も受け付けるため、テキスト以外のコンテンツに対しても埋め込みを生成できます。Gemini は画像・音声・ドキュメント・動画の埋め込みに対応し、VoyageAI は画像・動画の埋め込みに対応しています。
マルチモーダル入力には添付ファイルで使われるものと同じファイルクラスを使います。これらのファイルはローカルパス、ファイルシステムディスク、リモート URL、Base64 エンコードされたコンテンツから作成できます。画像・ドキュメント・動画はアップロードされたファイルからも作成でき、ドキュメントは生の文字列コンテンツからも作成できます。
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 — ストアからのファイル削除後
最終更新日 2026年7月24日