何时需要自定义 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 所要实现的接口定义。