Laravel AI SDK(laravel/ai)は、OpenAI・Anthropic・Geminiなどのプロバイダを1つのAPIで扱うLaravel公式のパッケージです。2026年2月に0.x系のベータとして公開され、2026年9月23日にv1.0がリリースされました。2026年10月18日時点の最新は v1.2.3 です。
この記事では、導入の3手順、Agent・ミドルウェア・Skills・人手承認の書き方、0.xから1.0へ上げるときの破壊的変更、ベクトル検索の対応データベースを扱います。コードと挙動は Laravel 13.37.0 に v1.2.3 を入れ、fakeを使ったテストで確かめた結果です。Laravel本体のバージョン選びやサポート期限はLaravelの最新バージョンは13|対応PHPバージョン・サポート期限一覧とアップグレード判断で扱っています。
まとめ|Laravel AI SDK 1.xの要点
laravel/aiは2026年9月23日の v1.0.0 で安定版になり、その後3週間で v1.1.0(Skills・Cohereのテキスト生成)、v1.2.0、v1.2.3 と更新されています。分類(Classification)だけは experimental 扱いで、マイナー更新でも仕様が変わります。- 導入は
composer require laravel/ai、vendor:publish、migrateの3手順です。依存はilluminate/*: ^12.0|^13.0なので、Laravel 12.62以降・PHP 8.3以上なら13へ上げずに使えます。 - 0.11から1.0への移行ガイドは24項目あり、影響度Highが6件です。会話テーブルの
tool_calls・tool_results列がsteps列へ置き換わるため、既存データのバックフィルが要ります。 - 1.0でミドルウェアはプロンプト1回ではなく生成ステップごとに走るようになり、1.1でエージェントにSkillsを渡せるようになりました。
continue()は会話の持ち主を検証しません。別ユーザーの会話IDを渡しても続きが書き込めることを実測で確認したので、再開の前に認可を挟みます。- ベクトル検索の
whereVectorSimilarToはPostgreSQL+pgvector・MariaDB 11.7以上が対象です。MySQLで呼ぶとRuntimeExceptionになります。
AI SDKの現在地と、Boost・Laravel MCPとの役割分担
v1.0で安定版になった時期とその後の更新
初版の v0.1.0 は2026年2月5日に公開され、0.x系のあいだはマイナー更新ごとに破壊的変更が入っていました(0.9と0.10の移行ガイドには影響度Highの項目があります)。2026年9月23日の v1.0.0 で、会話の保存形式・ミドルウェア・トークン集計・ストリーミングのプロトコルが固まりました。
| 版 | 公開日 | 主な追加 |
|---|---|---|
| v1.0.0 | 2026-09-23 | 分類、AG-UI/Vercel Chat対応、ステップ単位のミドルウェア、ToolSearch |
| v1.0.1 | 2026-09-29 | Ai::build()(テナントごとの認証情報) |
| v1.1.0 | 2026-10-05 | Agent Skills、Cohereのテキスト生成、組み込みツールの承認 |
| v1.2.0 | 2026-10-07 | OpenAIでの画像付き分類、Anthropicの既定モデル更新 |
| v1.2.1〜1.2.3 | 2026-10-12〜15 | Stopミドルウェア、Retry-After待ちの再試行、Laravel 12向け修正 |
1.x系ではマイナー更新に破壊的変更を入れない前提ですが、例外があります。公式のUPGRADE.mdは1.2の項で「Classification is an experimental API, so this change ships in a minor release」と書き、分類APIのシグネチャをマイナー更新で変えています。分類を独自プロバイダで実装している場合は、^1.0 のままでも更新のたびに差分を確認します。
AI SDK・Boost・Laravel MCPの3層
| パッケージ | 担当 | 使う場面 |
|---|---|---|
| Laravel AI SDK | アプリ内のAI機能 | 要約・分類・チャット・検索など利用者が触る機能 |
| Laravel Boost | 開発者の手元 | Claude CodeやCursorにルート・スキーマ・ログを渡す |
| Laravel MCP | 外部AIへの公開 | 自社アプリの機能をMCPツールとして見せる |
laravel/ai の依存に laravel/mcp は含まれず、手元のインストールでも入りませんでした。ただしアプリが laravel/mcp を直接使っている場合、AI SDK 1.0は1.0未満の laravel/mcp と共存できないため、先に ^1.0 へ上げます。Boostが提供するMCPツールの一覧はLaravel Boostとは?2系のMCPツール10種と対応エディタ・laravel/mcpとの違いにまとめています。
導入の3手順と、Laravel 12で使える範囲
インストールから環境変数までの流れ
composer require laravel/ai
php artisan vendor:publish --provider="Laravel\Ai\AiServiceProvider"
php artisan migrate
vendor:publish で config/ai.php、マイグレーション、4種類のスタブ(agent・structured-agent・tool・agent-middleware)が公開されます。認証情報は .env に置き、公式ドキュメントが挙げる変数は ANTHROPIC_API_KEY・OPENAI_API_KEY・TYPESAFE_API_KEY など17種類です。マルチテナントでテナントごとのAPIキーを使うなら、v1.0.1で入った Ai::build(['driver' => 'anthropic', 'key' => $user->anthropic_key]) を、provider: [Ai::build([...])] のように配列で包んで渡します。
マイグレーションで作られる会話テーブルの列
migrate で agent_conversations と agent_conversation_messages の2表ができます。1.xのメッセージ表は steps(longText)と status を持ち、0.x系の tool_calls・tool_results・approval_state はありません。fakeで1往復させると、userとassistantの2行が入り、assistant行の中身は次のとおりでした。
role=assistant status=completed
steps=[{"content":"VPNはCiscoのクライアントで接続します。","tool_calls":[],"reasoning":"","replay_blocks":[],"provider_tool_calls":[]}]
usage={"input_tokens":0,"output_tokens":0,"cache_read_input_tokens":null,"cache_write_input_tokens":null,"reasoning_tokens":null}
steps はモデルとの往復1回につき1要素で、ツールの実行結果は呼び出しの要素の中に入ります。会話ログをSQLで集計している場合、0.x時代のクエリは列名から書き直しになります。マイグレーションの基本操作はLaravelマイグレーションの使い方|php artisan migrateとrollback・freshの挙動を13.xで検証で扱っています。
Laravel 12で動く範囲と、13でしか使えない機能
Packagist上の v1.2.3 が要求するのは php: ^8.3、illuminate/*: ^12.0|^13.0、illuminate/json-schema: ^12.62|^13.15 です。Laravel 12.62以降でPHP 8.3以上なら導入でき、v1.2.3でも「Keep conversation models non-incrementing on Laravel 12」という12系向けの修正が入っています。
クエリビルダの whereVectorSimilarTo、vector() カラム、Schema::ensureVectorExtensionExists() は v12.47.0(2026年1月13日)から12系にもあります。13系にしか無いのは、配列とベクトル形式を相互変換する AsVector キャストです。12系でベクトル列を扱うならキャストを自作します。
Agentクラスの構造と、属性・ミドルウェアによる制御
make:agentで生成される3つのメソッド
php artisan make:agent SupportAgent を実行すると、app/Ai/Agents に Agent・Conversational・HasTools を実装したクラスができ、メソッドは instructions()・messages()・tools() の3つです。--structured を付けると HasStructuredOutput と schema() が加わります。
namespace App\Ai\Agents;
use Laravel\Ai\Concerns\RemembersConversations;
use Laravel\Ai\Contracts\Agent;
use Laravel\Ai\Contracts\Conversational;
use Laravel\Ai\Contracts\HasTools;
use Laravel\Ai\Promptable;
class SupportAgent implements Agent, Conversational, HasTools
{
use Promptable, RemembersConversations;
public function instructions(): string
{
return '社内ヘルプデスクとして、社内規程に沿って回答します。';
}
public function tools(): iterable
{
return [new \App\Ai\Tools\LookupOrder];
}
}
会話履歴をデータベースに任せるなら、生成された messages() を消して RemembersConversations トレイトを使います。messages() を残すとトレイトより優先され、履歴が読み込まれません。ワンショットの変換なら use function Laravel\Ai\{agent}; で読み込む匿名エージェントで足ります。ツール・ミドルウェア・fakeを使うものはクラスにします。
動作を決める属性
| 属性 | 役割 |
|---|---|
| Provider / Model | プロバイダとモデル(Providerは複数指定でフェイルオーバー) |
| MaxSteps / MaxTokens | ツール利用時のステップ上限 / 生成トークン上限 |
| Temperature / TopP | サンプリング(0.0〜1.0) |
| Timeout | HTTPタイムアウト秒(既定60) |
| UseCheapestModel / UseSmartestModel | プロバイダの最安 / 最上位モデルを自動選択 |
| CacheInstructions / CacheToolDefinitions | AnthropicとBedrockでキャッシュ位置を指定 |
UseCheapestModel と UseSmartestModel が選ぶモデルはSDKの更新で変わります。実際に v1.1.0 で多くのプロバイダの既定モデルが新しくなり、v1.2.0 でAnthropicの既定が更新されました。SDK更新による使用モデルの切り替わりを避けたい本番のエージェントでは、#[Model('...')] でモデルを明示します。
ミドルウェアの実行単位と生成ステップの制御
1.0から、ミドルウェアはプロンプト1回ではなく生成ステップ(モデルとの往復)ごとに呼ばれます。モデルとの往復が3回の実行なら3回です。1回の往復で複数のツールを呼ぶこともあるので、ツールの呼び出し回数とは一致しません。php artisan make:agent-middleware TrimTools で雛形ができ、handle() は PendingStep を受け取ります。
use Closure;
use Laravel\Ai\PendingStep;
class TrimTools
{
public function handle(PendingStep $step, Closure $next)
{
if (! $step->isFirstStep()) {
$step = $step->withoutTools('SearchDocumentation');
}
return $next($step);
}
}
この例は、高価な検索ツールを2ステップ目以降で外します。PendingStep には withModel()・withMessages()・withMaxTokens() などがあり、途中でモデルを安いものに替えたり、長い履歴を要約に差し替えたりできます。エージェント側は HasMiddleware を実装して middleware() で配列を返します。0.x時代の AgentPrompt を受け取るミドルウェアは、そのままでは動きません。
Tool・Skills・会話の永続化・人手承認
make:toolで作るツールと、ツール定義の遅延読み込み
php artisan make:tool LookupOrder で app/Ai/Tools にクラスができ、description() で用途を、schema() で引数を、handle() で処理を書きます。スキーマで縛ってもモデルの出力は外れることがあるため、handle() 内で $request->validate([...]) を呼んで再検証できます。
ツールが30個あると、30個分の定義が毎リクエスト送られます。使う頻度の低いツールは new ToolSearch(tools: [...]) で包むと、プロバイダが必要なときだけ読み込みます。対応はOpenAI・Azure・Anthropicで、Anthropicでは包まないツールを最低1つ残す必要があります。
Skillsによる手順書の登録と遅延読み込み
v1.1.0で、Agent Skillsとは?SKILL.md仕様と46製品で動かす移植性の実装手順で解説している SKILL.md 形式の手順書を、アプリのエージェントにも読ませられるようになりました。resources/skills/<名前>/SKILL.md を置き、エージェントに HasSkills を実装します。
namespace App\Ai\Agents;
use Laravel\Ai\Concerns\RemembersConversations;
use Laravel\Ai\Contracts\Agent;
use Laravel\Ai\Contracts\Conversational;
use Laravel\Ai\Contracts\HasSkills;
use Laravel\Ai\Promptable;
class HelpDesk implements Agent, Conversational, HasSkills
{
use Promptable, RemembersConversations;
public function instructions(): string
{
return '社内ヘルプデスクとして、社内規程に沿って回答します。';
}
public function skills(): iterable
{
return [resource_path('skills')];
}
}
エージェントには LoadSkill ツールが1つ足され、ツールの説明文にスキル名とdescriptionの一覧が並びます。本文は呼ばれたときだけ読み込まれます。frontmatterに description の無いスキルを置いて試すと一覧に出ず、名前を指定しても「Skill [no-desc] does not exist.」が返りました。同梱ファイルは256KBを超えるものとバイナリは返されません。base_path('.agents/skills') を足せば、コーディングエージェントと同じスキルをアプリでも使えます。
会話の永続化と、再開時の認可
新しい会話は (new HelpDesk)->forUser($user)->prompt('...') で始め、返り値の conversationId を保存します。続きは continue($id, as: $user)、IDが無ければ新規にする continueOrStart() は1.0で入りました。参加者はポリモーフィックで保存されるため、UserのID 1とTeamのID 1の履歴は混ざりません。
注意したいのは、continue() が会話の持ち主を確かめない点です。ユーザーAが始めた会話のIDを使い、ユーザーBで continue($id, as: $b) を呼ぶテストを書いたところ、例外にならず同じ会話に participant_id=2 の行が追記されました。会話IDをURLやフォームから受け取る画面では、ConversationStore の conversationBelongsTo($id, $user->getMorphClass(), $user->id) で持ち主を確かめてから再開します(同じテストでAはtrue、Bはfalseでした)。
破壊的な操作に承認を挟む仕組み
ファイル削除や返金のような操作は、ツールに Approvable を実装し InteractsWithApprovals トレイトを使うと、実行前にエージェントが一時停止します。再開時は Decisions::from(['call_abc' => Decision::approve(), 'call_ghi' => Decision::reject('請求書は保管が必要です')]) のように、保留中の呼び出しすべてに判断を渡します。判断が欠けたIDがあると ApprovalMismatchException です。理由付きの拒否はモデルに返って応答が続き、理由なしの拒否はその場で生成を止めます。v1.1.0からは、MCP・ファイル操作・類似検索などの組み込みツールにも requireApproval() を付けられます。
対応プロバイダとフェイルオーバーの条件
機能別の対応プロバイダ一覧(2026年10月)
- テキスト(13):OpenAI、OpenAI互換、Anthropic、Gemini、Azure、Bedrock、Groq、xAI、DeepSeek、Mistral、Ollama、OpenRouter、Cohere
- 画像:OpenAI、Gemini、xAI、Azure、Bedrock、OpenRouter
- 音声合成:OpenAI、ElevenLabs、Gemini、Mistral、OpenRouter
- 文字起こし:OpenAI、OpenAI互換、ElevenLabs、Groq、Mistral、Gemini、OpenRouter
- Embedding:OpenAI、OpenAI互換、Gemini、Azure、Bedrock、Cohere、Mistral、Jina、VoyageAI、Ollama、OpenRouter
- Reranking:Cohere、Jina、VoyageAI、Bedrock、OpenRouter
- 分類:OpenAI、TypeSafe、OpenRouter
- ファイル:OpenAI、Anthropic、Gemini、Azure、OpenRouter
出典は公式ドキュメントのProvider Support表です。Ollamaはテキスト生成とEmbeddingだけで、画像・音声・文字起こしには使えません。Bedrockを使う場合、1.0から aws/aws-sdk-php が同梱されなくなったので、自分で composer require aws/aws-sdk-php を実行します。
フェイルオーバーが発動する例外の範囲
$response = (new SupportAgent)->prompt(
'注文の配送状況を教えてください',
provider: [Lab::OpenAI, Lab::Anthropic],
);
2社目へ切り替わるのは FailoverableException のときだけで、レート制限(RateLimitedException)、過負荷・利用不可(ProviderOverloadedException)、クレジット不足(InsufficientCreditsException)が該当します。バリデーションエラーや不正なリクエストでは切り替わりません。v1.2.1からは、レート制限や過負荷の応答に10秒以下の Retry-After が付いていれば、その秒数だけ待って同じプロバイダへ1回だけ再試行し、それでも失敗したら切り替えます(HandlesFailoverErrors の retry(2, ...))。プロバイダごとにモデルを指定する配列のキーには Lab::Gemini->value のように列挙型の値を使います。
分類(Classification)とプロバイダツール
Classificationによる問い合わせ分類と判定しきい値
1.0で、自由文ではなく型の決まった答えと確率を返す分類が加わりました。問い合わせの振り分けやモデレーションで、しきい値と比べる処理に向いています。
use Laravel\Ai\Classification;
use Laravel\Ai\Classification\Boolean;
use Laravel\Ai\Classification\Choice;
$result = Classification::of($ticket)->questions([
'urgent' => new Boolean('すぐに返答が必要か'),
'team' => new Choice('担当チームはどこか', [
'billing' => '支払い・請求・返金',
'technical' => '不具合・障害・連携',
]),
])->classify();
$result['urgent']->isTrue(threshold: 0.8);
$result['team']->choice;
Yes/Noを1問だけ聞くなら Str::of($message)->decide('Is this spam?') が真偽値を返します。分類は公式ドキュメントでも experimental と明記されており、v1.2.0で実際にシグネチャが変わりました。業務の判定ロジックに組み込むなら、判定結果をテストで固定し、更新のたびに通るかを確かめます。
Web検索・コード実行などのプロバイダツール
プロバイダ側で実行されるツールは tools() に並べるだけで使えます。対応はツールごとに違います。
| ツール | 対応プロバイダ |
|---|---|
WebSearch |
Anthropic / OpenAI / Azure / Gemini / xAI / Groq / OpenRouter |
WebFetch |
Anthropic / Gemini / OpenRouter |
CodeExecution |
Anthropic / OpenAI / Azure / Gemini / xAI / Groq(GPT-OSSのみ) |
Anthropicのストリーミングでサーバー側のWeb検索を使うと、1.0以降は message_delta の累計値を読むため、0.x時代より入力トークンが多く報告されます。コスト計算を promptTokens に単価を掛ける方式で組んでいた場合は、次章の集計変更とあわせて見直します。
ベクトル検索とRAG構築の要件
対応データベースと、MySQLで呼んだときのエラー
公式ドキュメントの検索ページは、ベクトル検索の対応をpgvector拡張を入れたPostgreSQL、MariaDB 11.7以上、Laravel MongoDBパッケージを入れたMongoDBとしています(クエリビルダとAI SDKのページはPostgreSQLとMariaDBの2種類のみ)。手元で接続ごとに whereVectorSimilarTo のSQLを組み立てると、結果は次のとおりでした。
pgsql: select * from "documents" where ("embedding" <=> ?) <= ? order by ("embedding" <=> ?) asc limit 10
mariadb: select * from `documents` where vec_distance_cosine(`embedding`, vec_fromtext(?)) <= ? ...
mysql: RuntimeException: Vector distance queries are only supported by Postgres and MariaDB.
sqlite: RuntimeException: Vector distance queries are only supported by Postgres and MariaDB.
MySQLのまま実装するなら、OpenAIやGeminiのベクトルストアへファイルを預ける FileSearch 構成か、外部の検索サービスを使う構成になります。全文検索の whereFullText はMySQLでも動くので、要件の違いに注意します。
カラム定義とHNSWインデックスの張り方
Schema::ensureVectorExtensionExists();
Schema::create('documents', function (Blueprint $table) {
$table->id();
$table->text('content');
$table->vector('embedding', dimensions: 1536)->index();
$table->timestamps();
});
次元数は埋め込みモデルの出力に合わせます。index() でHNSWインデックスが作られます(パラメータの考え方はHNSWとは?階層グラフの仕組みとM・ef_constructionの決め方を実装目線で解説【2026年版】)。whereVectorSimilarTo の minSimilarity は既定0.6で、SQLには「距離が1−0.6=0.4以下」として渡ります。minSimilarity: 0.4 を指定すると距離0.6以下まで広がることを、上のSQLのバインド値で確認しました。第2引数に文字列を渡すと、AI SDKが Stringable に登録する toEmbeddings() マクロで埋め込みが自動生成されます。
検索ツールをエージェントに組み込む手順
public function tools(): iterable
{
return [
SimilaritySearch::usingModel(Document::class, 'embedding'),
];
}
エージェントが必要と判断したときに類似検索を実行し、結果を文脈へ取り込みます。埋め込みをまとめて作るなら Embeddings::for([...])->generate() で1回のAPIコールに収め、並べ替えを詰めたいときは Reranking::of([...])->rerank('PHP frameworks') を重ねます。
画像・音声・文字起こしとテストの書き方
Image・Audio・Transcriptionとキュー
$image = Image::of('キッチンカウンターに置かれたドーナツ')->generate();
$audio = Audio::of('Laravelでのコーディングが好きです。')->generate();
$transcript = Transcription::fromStorage('audio.mp3')->generate();
画像生成や長い音声の文字起こしは queue() でバックグラウンドへ回し、then() と catch() に完了時と例外時の処理を登録します。キューワーカーの --timeout と retry_after の関係は通常のジョブと同じで、--timeout は retry_after より数秒短く設定します。この大小関係が逆転すると、処理中のジョブが再試行され、二重実行につながる可能性があります(Laravel Queueの使い方|ジョブ定義からworker常駐と失敗ジョブ運用まで)。
fakeによる無課金のテスト
HelpDesk::fake(['VPNはCiscoのクライアントで接続します。']);
$response = (new HelpDesk)->forUser($user)->prompt('VPNの接続方法は?');
HelpDesk::assertPrompted('VPNの接続方法は?');
エージェント・画像・音声・文字起こし・Embedding・Reranking・分類・ファイル・ベクトルストアのそれぞれにfakeがあります。fakeでも RemembersConversations は実際のテーブルに書き込むので、上の steps 列の確認はこのテストで行いました。構造化出力のエージェントに値を渡さずfakeすると、スキーマに沿ったダミー値が入ります。手元では {"value":"fq"} のような無意味な文字列だったので、値で分岐する処理のテストでは返り値を明示します。
0.xから1.0へ上げるときの破壊的変更
Likelihood Of Impact: Highの6項目
UPGRADE.mdの「Upgrading To 1.0 From 0.11」は24項目あり、影響度はHigh 6・Medium 9・Low 9です(2026年10月18日時点の1.xブランチで数えた値)。Highは次の6件です。
- laravel/mcp 1.0が必須:1.0未満とは競合します。直接使っているなら
^1.0へ。 - 会話メッセージが steps を保存:
tool_calls・tool_results・approval_stateをsteps・statusへ移すバックフィルのマイグレーションを自分で作って流します。承認待ちの会話は移行前に片付けておかないと再開できません。 - ミドルウェアがステップ単位:
handle(AgentPrompt $prompt, ...)をhandle(PendingStep $step, ...)に書き換えます。 - Geminiのベクトルストアへの取り込みが完了待ち:
addFile()の戻り値が操作名からドキュメント名に変わり、5分で終わらなければAiExceptionです。 - AWS SDKが既定で入らない:Bedrock利用時は
aws/aws-sdk-phpを直接追加します。 - トークン数が全量に:
promptTokens・completionTokensがinputTokens・outputTokensに改名され、キャッシュ分と推論分を含む値になりました。既存のusage列の行は旧キーのままです。
課金の集計をしているなら6番目が最も効きます。入力トークンに単価を1つ掛けていた計算は、uncachedInputTokens()・cacheReadInputTokens・cacheWriteInputTokens に分けて単価を掛ける形へ変えます。旧キーと新キーの行が同じ列に混在するので、レポートは両方を読めるようにします。
Boostの/upgrade-ai-sdk-v1で進める手順
composer require laravel/boost:^2.10 --dev -W
php artisan boost:install
Boost 2.10.0以上を入れると、Claude Code・Cursor・OpenCode・VS Codeなどで /upgrade-ai-sdk-v1 が使え、移行ガイドを1項目ずつ当てていきます。ただしバックフィルのマイグレーションは本番データに触るので、ステージングで行数と status の分布を確かめてから流します。Boostの導入時の選択肢はLaravel Boostの使い方|boost:installの選択肢とSkills・エージェント別設定【v2.10対応】にまとめています。
Laravel 12から13へ上げる判断と破壊的変更
影響度Highの項目とインストーラーの更新
AI SDKは12系でも動くので、13へ上げる理由はAI SDK以外で決めます。Laravel 13のアップグレードガイドは想定所要時間を10分としています。本文で「Likelihood Of Impact: High」と明記されるのは2件ですが、目次の「High Impact Changes」にはインストーラー更新を含む3項目が掲載されています。
- 依存の更新:
laravel/frameworkを^13.0、laravel/boostを^2.0、laravel/tinkerを^3.0、phpunit/phpunitを^12.0、pestphp/pestを^4.0へ。 - CSRFミドルウェアの改称:
VerifyCsrfTokenがPreventRequestForgeryになり、Sec-Fetch-Siteヘッダによるオリジン検証が加わりました。旧名は非推奨エイリアスとして残りますが、テストのwithoutMiddleware()は書き換えます。
Laravelインストーラーを使っている場合は composer global update laravel/installer も必要です。この項目は本文に影響度のラベルが無く、目次でHigh Impact Changesに入っています。Laravel 12のアプリにBoost ^2.0を入れると /upgrade-laravel-v13 で移行を任せられます。
影響度Mediumの2項目(serializable_classes・upsert)
キャッシュ設定に serializable_classes が加わり、既定は false です。APP_KEY が漏れたときのデシリアライズ攻撃を防ぐための変更で、キャッシュにPHPオブジェクトを入れているアプリは許可するクラスを列挙するか、配列で保存する形に変えます。もう1件は upsert で、MySQLとMariaDBでは uniqueBy の値が使われないにもかかわらず、空だと InvalidArgumentException になりました。
よくある質問
Laravel AI SDKは正式版(安定版)ですか?
はい。2026年9月23日の v1.0.0 で安定版になり、2026年10月18日時点の最新は v1.2.3 です。ただし分類(Classification)は experimental で、マイナー更新でもシグネチャが変わります。2026年9月以前の記事に「0.x系」「ベータ」とあるのは当時の情報です。
Laravel 12のままAI SDKを使えますか?
使えます。v1.2.3の依存は illuminate/*: ^12.0|^13.0、illuminate/json-schema: ^12.62|^13.15、php: ^8.3 で、Laravel 12.62以降でPHP 8.3以上なら導入できます。AsVector キャストだけは13系にしか無いため、12系でベクトル列を扱う場合は自作します。
MySQLでベクトル検索は使えますか?
使えません。MySQL接続で whereVectorSimilarTo を呼ぶと「Vector distance queries are only supported by Postgres and MariaDB.」の RuntimeException になります。PostgreSQL+pgvectorかMariaDB 11.7以上に移すか、プロバイダ側のベクトルストアを使う FileSearch で代替します。
Ollamaでローカルモデルを使えますか?
テキスト生成とEmbeddingでは使えます。画像・音声合成・文字起こしの対応表にOllamaは含まれていません。v1.2.1からは、次元数を設定しないとOllamaのモデルが持つ次元数をそのまま使います。
Laravel 13にLTS版はありますか?
現在のLaravelにLTSという区分はありません。Laravel 13はバグ修正が2027年第3四半期まで、セキュリティ修正が2028年3月17日までで、対応PHPは8.3から8.5です(公式リリースノート)。
openai-php/laravelやPrismから移行する必要はありますか?
必須ではありません。Laravel 13のアップグレードガイドにこれらのパッケージへの言及は無く、共存もできます。AI SDKへ寄せる利点は、fake・会話の永続化・人手承認・フェイルオーバーがフレームワークの流儀で揃う点です。移すなら機能単位で置き換え、まずテストをAI SDKのfakeで書き直すと切り戻しやすくなります。社内チャットボットやRAGの設計から相談したい場合は、AIチャットボット開発の支援も行っています。