前言
Laravel AI SDK 為與 OpenAI、Anthropic、Gemini 等 AI 供應商對話提供了統一且表達力豐富的 API。使用 AI SDK,可以以一致且富有 Laravel 風格的介面實現:具備工具與結構化輸出的智慧 Agent 建構、圖片生成、語音合成/文字轉錄、向量 Embedding 建立等多樣化 AI 功能。Laravel AI SDK 是 Laravel 13 新增的官方套件。以
laravel/ai 提供,可以統一 API 處理多個 AI 供應商。供應商支援一覽
安裝
1
套件安裝
以 Composer 安裝 Laravel AI SDK。
2
公開設定檔與 Migration
以
vendor:publish Artisan 指令公開設定檔與 Migration。3
執行 Migration
執行資料庫 Migration。會建立
agent_conversations 與 agent_conversation_messages 表格,用於保存對話歷史。設定
環境變數
於.env 檔案設定要使用的 AI 供應商 API 金鑰。
config/ai.php 設定。
自訂 base URL
若要透過 Proxy 服務,可為各供應商設定自訂 URL。OpenAI-Compatible 供應商
若使用 LM Studio、vLLM、Together、Fireworks、本地 Gateway 等 OpenAI 相容 API,可以openai-compatible driver 設定供應商。url 為必要,若指定 key 則會作為 Bearer token 傳送。
Lab enum
於程式碼中參照供應商可使用Lab enum。
Agent
Agent 是 Laravel AI SDK 的基本組成要素。可以make:agent 指令產生 Agent 類別。
app/Ai/Agents/ 目錄。以下為實作了主要介面的 Agent 範例。
Prompt
以prompt() 方法對 Agent 送出訊息。
make() 靜態方法可從容器解析相依並產生實例。
prompt() 的引數覆寫。
對話 Context
若實作Conversational 介面並定義 messages() 方法,可將過去的對話歷史傳給 AI。
使用 RemembersConversations trait,可將對話歷史自動保存至資料庫並取用。
forUser() 開始對話,並使用回傳的 conversationId 透過 continue() 繼續對話。
結構化輸出
實作HasStructuredOutput 介面並於 schema() 方法定義 JSON schema,可以取得結構化資料形式的 AI 回應。
巢狀物件
物件的陣列
anyOf(多個 schema 的選擇)
若值符合多個 schema 中任一者,可使用anyOf 方法。
附加檔案
可透過attachments 引數將文件或圖片交給 Agent。
串流
使用stream() 方法可以以 chunk 為單位回傳回應。適合將長回應即時傳送至前端。
then() callback 可以撰寫串流完成後的處理。
Vercel AI SDK 協定
若前端使用 Vercel AI SDK,可呼叫usingVercelDataProtocol()。
廣播
可以將 stream 的事件傳送至 Laravel Echo 等 Broadcasting 頻道。broadcastOnQueue() 可透過 Queue 進行廣播。
跳過巨大事件
某些廣播平台將 WebSocket 訊息限制在約 10KB。像大型工具結果等資料量大的 stream 事件可能超過此上限而廣播失敗。可使用WithoutBroadcasting Attribute 將特定事件類型從廣播中排除。
agent_conversation_messages 表。因此前端可於 stream 完成後取得工具的全部資料。此機制於透過 Queue(broadcastOnQueue)與同步(broadcast / broadcastNow)均可運作。
Queue
以queue() 方法將 prompt 送入 Queue 可進行非同步處理。
Tool
使用 Tool 可讓 AI 呼叫程式碼中的函式。可以make:tool 指令產生 Tool 類別。
tools() 方法註冊 Tool。
相似度搜尋工具
可輕鬆加入使用向量 Embedding 的相似度搜尋工具。withDescription() 自訂工具的描述。
檔案儲存工具
使用FileStorage 工具 factory 可對 Agent 授予存取 Laravel 檔案系統 disk 的權限。all 方法回傳一組可對指定 disk 上的檔案進行列示、讀取、URL 生成、寫入、刪除、複製的工具集。
readOnly 方法。
Illuminate\Support\Collection,可以進一步縮限提供的工具。
MCP 工具
若應用程式使用 Laravel MCP,可將 Model Context Protocol 伺服器公開的工具提供給 Agent。可使用 Laravel MCP Client連線至遠端或本地 MCP 伺服器,並將其工具直接交給 Agent。要使用 MCP 工具,需於應用程式安裝 Laravel MCP 套件。
tools 方法回傳 Collection,因此使用 ... spread 運算子展開至 Agent 的 tools 陣列。
供應商工具
由 AI 供應商原生實作的特殊工具。Web Search
為 Agent 加入網頁搜尋。支援 Anthropic、OpenAI、Gemini、OpenRouter。Web Fetch
取得指定 URL 內容的工具。支援 Anthropic、Gemini。File Search
從向量儲存搜尋文件的工具。支援 OpenAI、Gemini。FileSearchQuery 指定複雜篩選。
Sub-Agent
Agent 也可從其他 Agent 的tools() 方法回傳。若將 Agent 註冊為 Tool,父 Agent 可將特定任務委派給 Sub-Agent,並將其結果納入原本的回應。適用於通用 Agent 需存取具備專門指示、工具、模型設定、供應商設定的特化型 Agent 時。
例如客服 Agent 將關於退款政策的問題委派給退款專門 Agent 的範例。
CanActAsTool 介面,並定義工具用的名稱與描述。
CanActAsTool 的 Sub-Agent,Laravel 會使用類別名稱作為工具名稱,並自動產生通用的描述文字。每個 Sub-Agent 的呼叫獨立進行,不會沿用父 Agent 的對話歷史。
中介層
可為 Agent 加入中介層,攔截 prompt 或回應。HasMiddleware 介面,並於 middleware() 方法註冊中介層。
then() 也可加入回應後的處理。
匿名 Agent
不定義類別,可用agent() helper 使用匿名 Agent。
Agent 設定(PHP Attributes)
可透過 PHP Attribute 宣告式地撰寫 Agent 的預設設定。供應商選項
實作HasProviderOptions 介面可傳遞供應商特有的選項。
人工承認(Human Tool Approval)
對於檔案刪除或匯款等機敏或不可還原的操作,可於執行前要求人工承認。要將工具設為承認對象,實作Approvable contract 並使用 InteractsWithApprovals trait。承認對象工具預設為必需承認。
needsApproval 方法。此方法可回傳布林值,或含承認理由的 Approval 實例。
tools 方法回傳工具時,也可覆寫承認要件。
pendingApprovals,可確認各工具呼叫的 ID、工具名稱、引數、承認理由。
Decisions 實例。決定可以承認、拒絕呼叫,或於執行前編輯引數。
true、false 可分別作為承認、拒絕的簡略寫法使用。所有保留中的工具呼叫都必須要有決定。若指定未知、缺失、已解決的工具呼叫 ID,會拋出 ApprovalMismatchException。對於無明確決定的呼叫,可透過 approveRemaining 或 rejectRemaining 方法指定預設決定。
Decision::reject('未獲承認。') 附結果拒絕,會回傳給模型並繼續回應。若無結果拒絕,於拒絕被記錄時生成迴圈停止。
工具承認於 prompt、stream、queue、broadcast、broadcastNow、broadcastOnQueue 方法皆受支援。
於 Streaming 及 Broadcasting 中,暫停會被表達為 tool_approval_request 事件。若使用 Vercel AI SDK stream 協定,承認請求與結果會作為協定原生的工具承認部分送出。
於 Queue 化的 Agent 中,結果回應會傳入 then callback,Laravel 也會 dispatch ToolApprovalRequested 事件。
Laravel 於要求模型繼續前,會保存已承認工具的執行結果。若之後生成失敗,承認已解決。請以一般文字 prompt 繼續對話,而非重送相同的承認決定。
完整的承認流程
以下路由展示完整的承認流程。GET 路由回傳聊天畫面,POST 路由接收來自聊天畫面的新文字 prompt 或承認決定。此範例假設應用程式的 User 模型使用了 HasConversations trait。
awaiting_approval 時,聊天畫面應顯示保留中的承認,並以工具呼叫 ID 為 key 將使用者的選擇送至同一端點。
message 值。
圖片生成
可以Image 類別產生圖片。支援 OpenAI、Gemini、xAI 供應商。
圖片的儲存
以 Queue 生成圖片
語音合成(TTS)
可以Audio 類別將文字轉換為語音。支援 OpenAI、ElevenLabs 供應商。
語音的儲存
以 Queue 生成語音
語音轉錄(STT)
可以Transcription 類別將音訊檔轉換為文字。支援 OpenAI、ElevenLabs、Mistral 供應商。
說話者分離(Diarization)
使用diarize() 可取得依說話者分離的文字轉錄。
以 Queue 進行文字轉錄
文字摘要(Text Summarization)
透過 LaravelStringable 類別提供的 summarize 方法,可摘要文字。預設會在 3 句內摘要,使用已設定供應商中最便宜的文字模型。
Str 類別也備有靜態方法版本。
Embedding
將文字轉換為向量表示,可用於相似度搜尋等。多模態 Embedding(Multimodal Embeddings)
Embeddings::for 方法不僅接受字串,也接受圖片、音訊、文件、影片的輸入,因此可對非文字內容生成 Embedding。Gemini 支援圖片、音訊、文件、影片的 Embedding,VoyageAI 支援圖片、影片的 Embedding。
VoyageAI 不允許遠端 URL 媒體與 Base64 編碼媒體於同一請求中混用。本地、Storage、上傳檔案會以 Base64 編碼內容送出,文字輸入可與任一媒體來源結合。可用的多模態模型與輸入請確認各供應商的文件。
向量搜尋(pgvector)
以下為使用 PostgreSQL 與 pgvector 擴充的向量搜尋設定範例。1
建立 Migration
2
模型的設定
3
相似度搜尋查詢
Embedding 的快取
可將相同文字的 Embedding 生成快取以避免重複執行。 於config/ai.php 設定預設的快取。
Reranking
可依查詢的相關度對搜尋結果進行 Rerank(重新排序)。支援 Cohere、Jina 供應商。limit() 縮限回傳件數。
Collection 的 Reranking
可直接 Rerank Eloquent Collection。檔案管理
可將檔案上傳至 AI 供應商並於稍後參照。參照已儲存的檔案
可用已上傳的檔案 ID 附加至 Agent。檔案的取得、刪除
指定供應商
指定供應商特定選項
以withProviderOptions 方法可傳遞供應商特定的上傳選項。例如可設定 OpenAI 的檔案 purpose。
向量儲存
使用向量儲存可以在供應商端管理文件。將檔案加入 Store
從 Store 刪除檔案
Failover
若以陣列指定多個供應商,於第一個供應商失敗時會自動 fallback 至下一個。測試
Laravel AI SDK 提供測試用的 Fake 功能,可以不呼叫實際 API 進行測試。Agent 的測試
preventStrayPrompts(),若呼叫未於 Fake 定義的 prompt 會拋出例外。
若對結構化輸出 Agent 呼叫
fake() 時未明確傳入 Fake 資料,Laravel 會自動生成符合 Agent 所定義 schema 的 Fake 資料。AnonymousAgent::fake()。
圖片生成的測試
語音合成的測試
文字轉錄的測試
Embedding 的測試
Reranking 的測試
檔案的測試
向量儲存的測試
事件
Laravel AI SDK dispatch 以下事件。透過監聽這些事件,可活用於日誌記錄或監視。Agent 相關
Agent 相關
PromptingAgent— 送出 prompt 前AgentPrompted— 送出 prompt 後StreamingAgent— 開始 Streaming 時AgentStreamed— Streaming 完成後InvokingTool— 呼叫工具前ToolInvoked— 呼叫工具後ToolApprovalRequested— 工具承認請求時ToolApprovalResolved— 工具承認解決後
圖片、語音、轉錄相關
圖片、語音、轉錄相關
GeneratingImage— 圖片生成前ImageGenerated— 圖片生成後GeneratingAudio— 語音生成前AudioGenerated— 語音生成後GeneratingTranscription— 文字轉錄前TranscriptionGenerated— 文字轉錄後
Embedding、Reranking 相關
Embedding、Reranking 相關
GeneratingEmbeddings— Embedding 生成前EmbeddingsGenerated— Embedding 生成後Reranking— Reranking 前Reranked— Reranking 後
檔案、Store 相關
檔案、Store 相關
StoringFile— 檔案保存前FileStored— 檔案保存後FileDeleted— 檔案刪除後CreatingStore— Store 建立前StoreCreated— Store 建立後AddingFileToStore— 檔案加入 Store 前FileAddedToStore— 檔案加入 Store 後RemovingFileFromStore— 從 Store 刪除檔案前FileRemovedFromStore— 從 Store 刪除檔案後