Skip to main content

何時需要自定義 Provider

Laravel AI SDK 內建支援 OpenAI、Anthropic、Gemini、Mistral 等主流 AI 服務。然而在以下場景,標準 Provider 無法滿足需求:
  • 尚未獲得官方支援的新興 AI 服務
  • 想要經過公司內部的模型閘道器或計費管理層
  • 擁有獨立協議或認證方式的本地部署推理伺服器
在這些情況下,你可以實現自定義 Provider 並註冊到 SDK 的 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(GeneratesTextStreamsText)處理,因此實際需要實現的只有返回模型名的 3 個方法以及 textGateway(),合計 4 個方法。多步驟的工具迴圈由 TextGenerationLoop 管理,Gateway 只需處理一步的請求。

實現示例:自定義 Provider

以下示例將一個擁有獨立 API 的推理服務作為 my-inference Provider 進行註冊。
1

建立 Provider 類

建立 app/Ai/Providers/MyInferenceProvider.php
2

在 AppServiceProvider 中註冊

App\Providers\AppServiceProviderboot 方法中使用 extend() 進行註冊。
3

在 config/ai.php 中新增 Provider

同時在 .env 中新增:
4

在 Agent 中使用

註冊後,只需將 Provider 名稱傳給 prompt()provider 引數,就能像使用標準 Provider 一樣使用它。
若要將其作為預設 Provider,請修改 config/ai.phpdefault 鍵。

自定義 Gateway 的實現

對於並非 OpenAI 相容、擁有獨立 API 的服務,需要實現 StepTextGateway 契約的自定義 Gateway。

StepTextGateway 契約

以下是 src/Contracts/Gateway/StepTextGateway.php 定義的介面。Gateway 負責處理會話的單步請求並返回 StepResponse,工具呼叫迴圈由呼叫方的 TextGenerationLoop 管理。
0.8 之前的 TextGateway 契約(generateText()stream()onToolInvocation())已在 0.9 中移除。如果你擁有自定義 Gateway,需要遷移到 StepTextGateway。工具呼叫的 onToolInvocation() 已被移動到 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 所要實現的介面定義。
最後修改於 2026年7月31日