Skip to main content

前言

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_conversationsagent_conversation_messages 表格,用於保存對話歷史。

設定

環境變數

.env 檔案設定要使用的 AI 供應商 API 金鑰。
文字、圖片、語音、轉錄、Embedding 所使用的預設模型也可於 config/ai.php 設定。

自訂 base URL

若要透過 Proxy 服務,可為各供應商設定自訂 URL。
OpenAI、Anthropic、Gemini、Groq、Cohere、DeepSeek、xAI、OpenRouter 皆可使用自訂 base URL。

OpenAI-Compatible 供應商

若使用 LM Studio、vLLM、Together、Fireworks、本地 Gateway 等 OpenAI 相容 API,可以 openai-compatible driver 設定供應商。url 為必要,若指定 key 則會作為 Bearer token 傳送。
設定後可與其他供應商同樣以供應商名稱指定。
若設定預設文字模型,可以不必每次指定模型。
OpenAI-Compatible 供應商支援文字生成、串流、Tool、結構化輸出與圖片附加。若端點需要額外的請求 body 欄位,請使用供應商選項

Lab enum

於程式碼中參照供應商可使用 Lab enum。

Agent

Agent 是 Laravel AI SDK 的基本組成要素。可以 make:agent 指令產生 Agent 類別。
產生的 Agent 位於 app/Ai/Agents/ 目錄。以下為實作了主要介面的 Agent 範例。

Prompt

prompt() 方法對 Agent 送出訊息。
使用 make() 靜態方法可從容器解析相依並產生實例。
供應商、模型、Timeout 可透過 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 類別。
於 Agent 的 tools() 方法註冊 Tool。

相似度搜尋工具

可輕鬆加入使用向量 Embedding 的相似度搜尋工具。
亦可指定選項。
也可以 closure 定義自訂搜尋邏輯。
可以 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 套件。
MCP client 的 tools 方法回傳 Collection,因此使用 ... spread 運算子展開至 Agent 的 tools 陣列。
AI SDK 會自動包裝各 MCP 工具,讓 Agent 可以與其他工具同樣的方式呼叫。也可以使用具名 MCP client
或者也可以連線至本地 MCP 伺服器
MCP client 的建立與驗證(Bearer token 或 OAuth 等)詳情請參考 MCP client 文件

供應商工具

由 AI 供應商原生實作的特殊工具。 為 Agent 加入網頁搜尋。支援 Anthropic、OpenAI、Gemini、OpenRouter。
可以選項指定搜尋件數、限制網域、位置資訊。

Web Fetch

取得指定 URL 內容的工具。支援 Anthropic、Gemini。
從向量儲存搜尋文件的工具。支援 OpenAI、Gemini。
也可用 FileSearchQuery 指定複雜篩選。

Sub-Agent

Agent 也可從其他 Agent 的 tools() 方法回傳。若將 Agent 註冊為 Tool,父 Agent 可將特定任務委派給 Sub-Agent,並將其結果納入原本的回應。適用於通用 Agent 需存取具備專門指示、工具、模型設定、供應商設定的特化型 Agent 時。 例如客服 Agent 將關於退款政策的問題委派給退款專門 Agent 的範例。
若要自訂 Sub-Agent 對父 Agent 的呈現方式,可於 Sub-Agent 實作 CanActAsTool 介面,並定義工具用的名稱與描述。
若未實作 CanActAsTool 的 Sub-Agent,Laravel 會使用類別名稱作為工具名稱,並自動產生通用的描述文字。每個 Sub-Agent 的呼叫獨立進行,不會沿用父 Agent 的對話歷史。

中介層

可為 Agent 加入中介層,攔截 prompt 或回應。
於 Agent 實作 HasMiddleware 介面,並於 middleware() 方法註冊中介層。
以下為中介層類別的實作範例。
使用 then() 也可加入回應後的處理。

匿名 Agent

不定義類別,可用 agent() helper 使用匿名 Agent。
也可建立附有結構化輸出的匿名 Agent。

Agent 設定(PHP Attributes)

可透過 PHP Attribute 宣告式地撰寫 Agent 的預設設定。
模型選擇的捷徑 Attribute 也已備妥。

供應商選項

實作 HasProviderOptions 介面可傳遞供應商特有的選項。

人工承認(Human Tool Approval)

使用工具承認需要對話歷史被永續化的 Conversational Agent。要恢復暫停的呼叫,RemembersConversations trait 提供所需的永續化功能。
對於檔案刪除或匯款等機敏或不可還原的操作,可於執行前要求人工承認。要將工具設為承認對象,實作 Approvable contract 並使用 InteractsWithApprovals trait。承認對象工具預設為必需承認。
若希望依工具呼叫的引數判斷是否需承認,於工具定義 needsApproval 方法。此方法可回傳布林值,或含承認理由的 Approval 實例。
於 Agent 的 tools 方法回傳工具時,也可覆寫承認要件。
當承認對象工具被呼叫時,Agent 會於執行前暫停。透過檢查回應的 pendingApprovals,可確認各工具呼叫的 ID、工具名稱、引數、承認理由。
要恢復 Agent,繼續對話並傳入包含對各保留中工具呼叫決定的 Decisions 實例。決定可以承認、拒絕呼叫,或於執行前編輯引數。
布林值 truefalse 可分別作為承認、拒絕的簡略寫法使用。所有保留中的工具呼叫都必須要有決定。若指定未知、缺失、已解決的工具呼叫 ID,會拋出 ApprovalMismatchException。對於無明確決定的呼叫,可透過 approveRemainingrejectRemaining 方法指定預設決定。
若如 Decision::reject('未獲承認。') 附結果拒絕,會回傳給模型並繼續回應。若無結果拒絕,於拒絕被記錄時生成迴圈停止。 工具承認於 promptstreamqueuebroadcastbroadcastNowbroadcastOnQueue 方法皆受支援。 於 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 值。
承認流程是同時授予 AI Agent 強力操作權限,同時可於執行前加入人工檢查的機制。於檔案刪除、支付處理、對外部 API 寫入等伴隨無法還原之操作的工具中,請積極活用。

圖片生成

可以 Image 類別產生圖片。支援 OpenAI、Gemini、xAI 供應商。
可指定品質、Aspect Ratio、Timeout。
也可附加參考圖片進行加工。

圖片的儲存

以 Queue 生成圖片


語音合成(TTS)

可以 Audio 類別將文字轉換為語音。支援 OpenAI、ElevenLabs 供應商。
可指定聲音性別、具體 Voice ID、說話方式指示。

語音的儲存

以 Queue 生成語音


語音轉錄(STT)

可以 Transcription 類別將音訊檔轉換為文字。支援 OpenAI、ElevenLabs、Mistral 供應商。

說話者分離(Diarization)

使用 diarize() 可取得依說話者分離的文字轉錄。

以 Queue 進行文字轉錄


文字摘要(Text Summarization)

透過 Laravel Stringable 類別提供的 summarize 方法,可摘要文字。預設會在 3 句內摘要,使用已設定供應商中最便宜的文字模型。
也可以指定摘要使用的最大句數、供應商、模型、Timeout。Str 類別也備有靜態方法版本。

Embedding

將文字轉換為向量表示,可用於相似度搜尋等。
也可指定供應商、模型、維度數。

多模態 Embedding(Multimodal Embeddings)

Embeddings::for 方法不僅接受字串,也接受圖片、音訊、文件、影片的輸入,因此可對非文字內容生成 Embedding。Gemini 支援圖片、音訊、文件、影片的 Embedding,VoyageAI 支援圖片、影片的 Embedding。
多模態輸入使用與附加檔案相同的 File 類別。這些檔案可從本地路徑、檔案系統 disk、遠端 URL、Base64 編碼內容建立。圖片、文件、影片也可從上傳檔案建立,文件也可從原始字串內容建立。
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
若要對不同供應商指定不同選項,可傳入 closure。

向量儲存

使用向量儲存可以在供應商端管理文件。

將檔案加入 Store

也可加上 metadata。

從 Store 刪除檔案


Failover

若以陣列指定多個供應商,於第一個供應商失敗時會自動 fallback 至下一個。

測試

Laravel AI SDK 提供測試用的 Fake 功能,可以不呼叫實際 API 進行測試。

Agent 的測試

也備有 Queue 化的斷言。
使用 preventStrayPrompts(),若呼叫未於 Fake 定義的 prompt 會拋出例外。
若要 Fake 回傳結構化輸出的 Agent,可用陣列指定回應。Agent 會回傳含指定資料的結構化回應。
若對結構化輸出 Agent 呼叫 fake() 時未明確傳入 Fake 資料,Laravel 會自動生成符合 Agent 所定義 schema 的 Fake 資料。
匿名 Agent 的測試使用 AnonymousAgent::fake()

圖片生成的測試

語音合成的測試

文字轉錄的測試

Embedding 的測試

Reranking 的測試

檔案的測試

向量儲存的測試

也可對 Store 的檔案操作進行斷言。

事件

Laravel AI SDK dispatch 以下事件。透過監聽這些事件,可活用於日誌記錄或監視。
  • PromptingAgent — 送出 prompt 前
  • AgentPrompted — 送出 prompt 後
  • StreamingAgent — 開始 Streaming 時
  • AgentStreamed — Streaming 完成後
  • InvokingTool — 呼叫工具前
  • ToolInvoked — 呼叫工具後
  • ToolApprovalRequested — 工具承認請求時
  • ToolApprovalResolved — 工具承認解決後
  • GeneratingImage — 圖片生成前
  • ImageGenerated — 圖片生成後
  • GeneratingAudio — 語音生成前
  • AudioGenerated — 語音生成後
  • GeneratingTranscription — 文字轉錄前
  • TranscriptionGenerated — 文字轉錄後
  • GeneratingEmbeddings — Embedding 生成前
  • EmbeddingsGenerated — Embedding 生成後
  • Reranking — Reranking 前
  • Reranked — Reranking 後
  • StoringFile — 檔案保存前
  • FileStored — 檔案保存後
  • FileDeleted — 檔案刪除後
  • CreatingStore — Store 建立前
  • StoreCreated — Store 建立後
  • AddingFileToStore — 檔案加入 Store 前
  • FileAddedToStore — 檔案加入 Store 後
  • RemovingFileFromStore — 從 Store 刪除檔案前
  • FileRemovedFromStore — 從 Store 刪除檔案後
最後修改於 2026年8月2日