Skip to main content

简介

Laravel AI SDK 提供了统一且富有表现力的 API,用于与 OpenAI、Anthropic、Gemini 等 AI 提供商进行对话。使用 AI SDK,你可以通过一致且富有 Laravel 风格的接口来构建带有工具和结构化输出的智能代理、生成图像、进行语音合成与转录、创建向量嵌入等丰富的 AI 功能。
Laravel AI SDK 是在 Laravel 13 中新增的官方包。以 laravel/ai 形式提供,可通过统一 API 使用多个 AI 提供商。

提供商支持一览

安装

1

安装包

使用 Composer 安装 Laravel AI SDK。
2

发布配置文件与迁移

使用 vendor:publish Artisan 命令发布配置文件和迁移。
3

执行迁移

执行数据库迁移。系统会创建 agent_conversationsagent_conversation_messages 表,用于保存对话历史。

配置

环境变量

.env 文件中设置所使用 AI 提供商的 API 密钥。
用于文本、图像、语音、转录、嵌入的默认模型也可以在 config/ai.php 中配置。

自定义 Base URL

如果需要通过代理服务,可以为每个提供商配置自定义 URL。
自定义 Base URL 支持 OpenAI、Anthropic、Gemini、Groq、Cohere、DeepSeek、xAI、OpenRouter。

OpenAI-Compatible 提供商

在使用 LM Studio、vLLM、Together、Fireworks、本地网关等兼容 OpenAI 的 API 时,可以使用 openai-compatible 驱动配置提供商。url 是必需的,如果指定了 key,会作为 Bearer 令牌发送。
配置后即可像其他提供商一样使用提供商名称来指定。
如果设置了默认文本模型,则无需每次都指定模型。
OpenAI-Compatible 提供商支持文本生成、流式传输、工具、结构化输出以及图像附件。若端点需要额外的请求体字段,请使用提供商选项

Lab 枚举

在代码中引用提供商时,使用 Lab 枚举。

智能体(Agent)

智能体是 Laravel AI SDK 的基本构成要素。可以使用 make:agent 命令生成智能体类。
生成的智能体会放置在 app/Ai/Agents/ 目录下。下面是一个实现了所有主要接口的智能体示例。

Prompt

使用 prompt() 方法向智能体发送消息。
使用 make() 静态方法可以从容器解析依赖并生成实例。
提供商、模型、超时可通过 prompt() 的参数覆盖。

对话上下文

实现 Conversational 接口并定义 messages() 方法后,即可将过去的对话历史传递给 AI。 使用 RemembersConversations trait 可以自动将对话历史保存到数据库并读取。
使用 forUser() 开始对话,然后使用返回的 conversationId 通过 continue() 继续对话。

结构化输出

实现 HasStructuredOutput 接口并通过 schema() 方法定义 JSON Schema,即可以结构化数据形式获取 AI 的响应。

嵌套对象

对象数组

anyOf(多个 Schema 中选择)

当值可能匹配多个 Schema 中的任一个时,使用 anyOf 方法。

附件

通过 attachments 参数可以向智能体传递文档或图像。
图像附件的用法相同。

流式传输

使用 stream() 方法可以按 chunk 返回响应。适合将较长的响应实时地发送到前端。
通过 then() 回调可以在流式传输完成后执行处理。
也可以手动迭代流。

Vercel AI SDK 协议

在前端使用 Vercel AI SDK 时,调用 usingVercelDataProtocol()

广播

可以将流事件发送到 Laravel Echo 等广播通道。
使用 broadcastOnQueue() 可以通过队列进行广播。

跳过巨大的事件

某些广播平台将 WebSocket 消息限制在约 10KB。当工具结果等数据量较大的流事件超过此上限时可能会广播失败。可以使用 WithoutBroadcasting 属性,将特定事件类型排除在广播之外。
被排除的事件不会被广播,但仍会保存到 agent_conversation_messages 表中。因此前端可以在流结束后获取工具的全部数据。此机制对通过队列(broadcastOnQueue)和同步(broadcast / broadcastNow)方式均生效。

队列

使用 queue() 方法可以将提示放入队列进行异步处理。

工具

使用工具可以让 AI 调用代码中的函数。可以通过 make:tool 命令生成工具类。
在智能体的 tools() 方法中注册工具。

相似度检索工具

可以轻松添加使用向量嵌入的相似度检索工具。
也可以指定选项。
也可以通过闭包定义自定义的检索逻辑。
可以通过 withDescription() 自定义工具的说明。

文件存储工具

使用 FileStorage 工具工厂可以让智能体访问 Laravel 文件系统磁盘all 方法返回一套用于在指定磁盘上列出、读取、生成 URL、写入、删除和复制文件的工具。
若只希望允许只读访问,则使用 readOnly 方法。
这些方法返回 Illuminate\Support\Collection,因此可以进一步筛选要提供的工具。

MCP 工具

如果应用程序中使用了 Laravel MCP,可以将 Model Context Protocol 服务器公开的工具提供给智能体。使用 Laravel MCP 客户端可以连接远程或本地的 MCP 服务器,并将其工具直接传递给智能体。
要使用 MCP 工具,应用程序中需要已安装 Laravel MCP 包。
MCP 客户端的 tools 方法返回一个集合,因此可以使用 ... 展开运算符将其展开到智能体的 tools 数组中。
AI SDK 会自动包装各个 MCP 工具,使智能体像调用其他工具一样调用它们。也可以使用命名 MCP 客户端
或者,也可以连接本地 MCP 服务器
关于创建 MCP 客户端及认证(如 Bearer 令牌或 OAuth)的更多信息,请参阅 MCP 客户端文档

提供商工具

AI 提供商原生实现的特殊工具。

Web 检索

为智能体添加网络检索功能。支持 Anthropic、OpenAI、Gemini、OpenRouter。
可以选择性地指定检索结果数、允许的域名或位置信息。

Web 抓取

获取指定 URL 内容的工具。支持 Anthropic、Gemini。

文件搜索

从向量存储中搜索文档的工具。支持 OpenAI、Gemini。
也可以使用 FileSearchQuery 指定复杂过滤条件。

子智能体

也可以从另一个智能体的 tools() 方法返回智能体。将智能体注册为工具后,父智能体可以将特定任务委派给子智能体,并将其结果整合到原始响应中。适合通用智能体访问具有专业指令、工具、模型配置或提供商设置的特化智能体。 例如,客户支持智能体将有关退款政策的问题委派给退款专门智能体的示例。
若要自定义子智能体对父智能体的展示方式,可以在子智能体上实现 CanActAsTool 接口,并定义作为工具时使用的名称与说明。
对于未实现 CanActAsTool 的子智能体,Laravel 会将类名用作工具名称,并自动生成通用的描述文本。每个子智能体的调用都是独立进行的,不会继承父智能体的对话历史。

中间件

可以为智能体添加中间件以拦截提示和响应。
在智能体上实现 HasMiddleware 接口,并通过 middleware() 方法注册中间件。
以下是中间件类的实现示例。
使用 then() 可以添加响应后的处理。

匿名智能体

不定义类,也可以使用 agent() 助手函数创建匿名智能体。
也可以创建带结构化输出的匿名智能体。

智能体配置(PHP 属性)

可以使用 PHP 属性以声明式方式定义智能体的默认配置。
也提供了用于模型选择的快捷属性。

提供商选项

实现 HasProviderOptions 接口可传递提供商特定的选项。

人工审批(Human Tool Approval)

使用工具审批需要一个能持久化对话历史的 Conversational 智能体。为了恢复被暂停的调用,RemembersConversations trait 提供了所需的持久化功能。
对于删除文件、汇款等敏感或不可撤销的操作,可以要求在执行前获得人工审批。若要将工具设为审批对象,请实现 Approvable 契约并使用 InteractsWithApprovals trait。审批对象工具默认需要审批。
如果希望根据工具调用的参数动态判断是否需要审批,可以在工具中定义 needsApproval 方法。该方法可以返回布尔值,或包含审批理由的 Approval 实例。
也可以在智能体的 tools 方法中返回工具时覆盖审批要求。
当调用需要审批的工具时,智能体会在执行前暂停。通过检查响应的 pendingApprovals,可以查看每次工具调用的 ID、工具名称、参数和审批理由。
要恢复智能体,需要继续对话,并传入包含各待审批工具调用决定的 Decisions 实例。决定可以进行调用的批准、拒绝,或在执行前编辑参数。
布尔值 truefalse 可作为批准和拒绝的简写形式。所有待处理的工具调用都必须有决定。指定未知、缺失或已解决的工具调用 ID 会抛出 ApprovalMismatchException。对于没有显式决定的调用,可通过 approveRemainingrejectRemaining 方法指定默认决定。
以带结果的方式拒绝(如 Decision::reject('未获批准。'))时,结果会返回给模型继续响应。若不带结果拒绝,则在记录拒绝时生成循环停止。 工具审批在 promptstreamqueuebroadcastbroadcastNowbroadcastOnQueue 方法中都受支持。 在流式传输和广播过程中,暂停以 tool_approval_request 事件表示。若使用 Vercel AI SDK 流协议,审批请求和结果会以协议原生的工具审批部件形式发送。 对于队列化的智能体,结果响应会传递给 then 回调,Laravel 也会派发 ToolApprovalRequested 事件。 在请求模型继续之前,Laravel 会保存已批准工具的执行结果。若之后生成失败,审批已然解决。请不要重发相同的审批决定,而是使用普通文本提示继续对话。

完整的审批流程

以下路由展示了完整的审批流程。GET 路由返回聊天界面,POST 路由接收来自聊天界面的新文本提示或审批决定。此示例假设应用程序的 User 模型使用了 HasConversations trait。
若响应的状态为 awaiting_approval,聊天界面应显示待审批项,并以工具调用 ID 为键,将用户的选择发送到相同的端点。
对于普通聊天消息,则改为发送 message 值。
审批流程能在给予 AI 智能体强大操作权限的同时,在执行前插入人工检查。对于文件删除、支付处理、写入外部 API 等不可撤销的操作,请积极使用。

图像生成

使用 Image 类可以生成图像。OpenAI、Gemini、xAI 提供商均支持。
可以指定质量、纵横比和超时。
也可以附加参考图像进行加工。

保存图像

通过队列生成图像


语音合成(TTS)

使用 Audio 类可以将文本转换为语音。OpenAI、ElevenLabs 提供商均支持。
也可以指定声音的性别、具体的语音 ID 或说话方式的指令。

保存音频

通过队列生成音频


转录(STT)

使用 Transcription 类可以将音频文件转换为文本。OpenAI、ElevenLabs、Mistral 提供商均支持。

说话人分离(Diarization)

使用 diarize() 可以获取按说话人分离的转录内容。

通过队列进行转录


文本摘要(Text Summarization)

使用 Laravel Stringable 类提供的 summarize 方法可以总结文本。默认摘要不超过 3 句话,并使用所配置提供商中最便宜的文本模型。
也可以指定摘要句数上限、提供商、模型和超时。Str 类也提供了静态方法版本。

嵌入(Embeddings)

可以将文本转换为向量表示,用于相似度检索等场景。
也可以指定提供商、模型和维度数。

多模态嵌入(Multimodal Embeddings)

Embeddings::for 方法不仅接受字符串,也接受图像、音频、文档和视频输入,因此可以为非文本内容生成嵌入。Gemini 支持图像、音频、文档和视频的嵌入,VoyageAI 支持图像和视频的嵌入。
多模态输入使用与附件相同的文件类。这些文件可以从本地路径、文件系统磁盘、远程 URL 或 Base64 编码内容创建。图像、文档和视频也可以从上传的文件创建,文档也可以从原始字符串内容创建。
VoyageAI 不允许在同一请求中混合使用远程 URL 媒体和 Base64 编码的媒体。本地、存储、上传的文件将作为 Base64 编码的内容发送,而文本输入可以与任一媒体源组合。请查阅各提供商的文档以了解可用的多模态模型和输入。

向量检索(pgvector)

以下是使用 PostgreSQL 和 pgvector 扩展进行向量检索的配置示例。
1

创建迁移

2

设置模型

3

相似度检索查询

也可以使用底层方法。

嵌入的缓存

可以缓存相同文本的嵌入,避免重复生成。 config/ai.php 中进行默认缓存配置。
也可以对每次请求分别控制缓存。

重排序

可以按与查询的相关度对检索结果进行重排。支持 Cohere、Jina 提供商。
通过 limit() 可以限制返回件数。

集合的重排序

可以直接对 Eloquent 集合进行重排。

文件管理

可以将文件上传到 AI 提供商,稍后再引用。
也可以从字符串或表单上传处理。

引用已保存的文件

可以使用已上传的文件 ID 将其附加到智能体。

获取和删除文件

指定提供商

指定提供商特定选项

通过 withProviderOptions 方法可以传入提供商特定的上传选项。例如可以设置 OpenAI 的文件 purpose
若需要为不同的提供商指定不同选项,可以传入闭包。

向量存储

使用向量存储可以将文档托管在提供商侧管理。

向存储添加文件

也可以附加元数据。

从存储删除文件


故障转移

将多个提供商以数组形式指定后,第一个提供商失败时会自动回退到下一个提供商。

测试

Laravel AI SDK 提供了测试用的 fake 功能,可以在不调用实际 API 的情况下进行测试。

智能体的测试

队列化的断言也已提供。
使用 preventStrayPrompts() 可以在调用未在 fake 中定义的提示时抛出异常。
对返回结构化输出的智能体进行 fake 时,可以以数组形式指定响应。智能体将返回包含指定数据的结构化响应。
对于结构化输出智能体,如果未显式传入 fake 数据地调用 fake(),Laravel 会根据智能体定义的 schema 自动生成符合要求的 fake 数据。
匿名智能体的测试使用 AnonymousAgent::fake()

图像生成的测试

语音合成的测试

转录的测试

嵌入的测试

重排序的测试

文件的测试

向量存储的测试

也可以对存储的文件操作进行断言。

事件

Laravel AI SDK 会派发以下事件。通过监听这些事件,可用于日志记录、监控等场景。
  • PromptingAgent — 提示发送前
  • AgentPrompted — 提示发送后
  • StreamingAgent — 开始流式传输时
  • AgentStreamed — 流式传输完成后
  • InvokingTool — 工具调用前
  • ToolInvoked — 工具调用后
  • ToolApprovalRequested — 请求工具审批时
  • ToolApprovalResolved — 工具审批解决后
  • GeneratingImage — 图像生成前
  • ImageGenerated — 图像生成后
  • GeneratingAudio — 音频生成前
  • AudioGenerated — 音频生成后
  • GeneratingTranscription — 转录前
  • TranscriptionGenerated — 转录后
  • GeneratingEmbeddings — 嵌入生成前
  • EmbeddingsGenerated — 嵌入生成后
  • Reranking — 重排序前
  • Reranked — 重排序后
  • StoringFile — 文件保存前
  • FileStored — 文件保存后
  • FileDeleted — 文件删除后
  • CreatingStore — 存储创建前
  • StoreCreated — 存储创建后
  • AddingFileToStore — 向存储添加文件前
  • FileAddedToStore — 向存储添加文件后
  • RemovingFileFromStore — 从存储删除文件前
  • FileRemovedFromStore — 从存储删除文件后
最后修改于 2026年8月2日