何時需要自定義 Provider
Laravel AI SDK 內建支援 OpenAI、Anthropic、Gemini、Mistral 等主流 AI 服務。然而在以下場景,標準 Provider 無法滿足需求:- 尚未獲得官方支援的新興 AI 服務
- 想要經過公司內部的模型閘道器或計費管理層
- 擁有獨立協議或認證方式的本地部署推理伺服器
AiManager,就能像標準 Provider 一樣透過同一 API 使用它。
OpenAI 相容 API 請使用內建驅動從 SDK 0.9 開始,
openai-compatible 驅動已內建提供。對於公司內部的 OpenAI 相容推理伺服器(例如 Ollama 的 OpenAI 相容端點),只需在 config/ai.php 中新增配置即可使用,無需實現自定義 Provider。架構概覽
兩層結構
Laravel AI SDK 由 Provider 與 Gateway 兩層構成。
所有 Provider 都繼承抽象類
Laravel\Ai\Providers\Provider,並按功能實現對應的契約(介面)。包含工具呼叫的多步驟迴圈由 TextGenerationLoop 反覆呼叫 Gateway 來實現。
契約一覽
根據要支援的功能,實現所需的契約即可。多數情況下只需實現
TextProvider 即可。TextProvider 契約
這是文字生成 Provider 所要實現的介面(src/Contracts/Providers/TextProvider.php)。
prompt() 與 stream() 的實現可交由現有 trait(GeneratesText、StreamsText)處理,因此實際需要實現的只有返回模型名的 3 個方法以及 textGateway(),合計 4 個方法。多步驟的工具迴圈由 TextGenerationLoop 管理,Gateway 只需處理一步的請求。
實現示例:自定義 Provider
以下示例將一個擁有獨立 API 的推理服務作為my-inference Provider 進行註冊。
1
建立 Provider 類
建立
app/Ai/Providers/MyInferenceProvider.php。2
在 AppServiceProvider 中註冊
在
App\Providers\AppServiceProvider 的 boot 方法中使用 extend() 進行註冊。3
在 config/ai.php 中新增 Provider
.env 中新增:4
在 Agent 中使用
註冊後,只需將 Provider 名稱傳給 若要將其作為預設 Provider,請修改
prompt() 的 provider 引數,就能像使用標準 Provider 一樣使用它。config/ai.php 的 default 鍵。自定義 Gateway 的實現
對於並非 OpenAI 相容、擁有獨立 API 的服務,需要實現StepTextGateway 契約的自定義 Gateway。
StepTextGateway 契約
以下是src/Contracts/Gateway/StepTextGateway.php 定義的介面。Gateway 負責處理會話的單步請求並返回 StepResponse,工具呼叫迴圈由呼叫方的 TextGenerationLoop 管理。
自定義 Gateway 實現示例
以下是向自定義推理 API 發起 HTTP 請求的簡單 Gateway 骨架。如需支援工具呼叫(function calling),請在
generateTextStep() 中將工具的呼叫結果加入 toolCalls,並將 finishReason 設為 FinishReason::ToolCalls。工具的執行以及進入下一步的過渡由 TextGenerationLoop 自動處理。實現參考可檢視 AnthropicGateway.php。測試方法
使用 Agent 類的 fake()
要測試使用自定義 Provider 的 Agent,可使用 Agent 類的fake() 方法。不論是否是自定義 Provider,都會將 fake Gateway 注入到 Provider 中。
從 0.9 開始,
Agent::fake() 的響應會經過與真實 Provider 相同的 TextGenerationLoop。如果在沒有註冊工具的 Agent 上設定了 fake 工具呼叫,會丟擲 NoSuchToolException。使用 extend() 的 Mock Provider
也可以透過extend() 從容器註冊測試用 Provider。
參考連結
OllamaProvider.php — 簡單的 Provider 實現示例
連線本地模型伺服器的 Provider 最小實現。可作為自定義 Provider 實現的參考。
AnthropicGateway.php — Gateway 實現示例
實現了
StepTextGateway 的 Gateway 示例。可檢視 generateTextStep() 與 generateStreamStep() 的實現。StepTextGateway Contract
文字生成 Gateway 所要實現的介面定義。
TextProvider Contract
文字生成 Provider 所要實現的介面定義。