简介
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_conversations 和 agent_conversation_messages 表,用于保存对话历史。配置
环境变量
在.env 文件中设置所使用 AI 提供商的 API 密钥。
config/ai.php 中配置。
自定义 Base URL
如果需要通过代理服务,可以为每个提供商配置自定义 URL。OpenAI-Compatible 提供商
在使用 LM Studio、vLLM、Together、Fireworks、本地网关等兼容 OpenAI 的 API 时,可以使用openai-compatible 驱动配置提供商。url 是必需的,如果指定了 key,会作为 Bearer 令牌发送。
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 包。
tools 方法返回一个集合,因此可以使用 ... 展开运算符将其展开到智能体的 tools 数组中。
提供商工具
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)
对于删除文件、汇款等敏感或不可撤销的操作,可以要求在执行前获得人工审批。若要将工具设为审批对象,请实现Approvable 契约并使用 InteractsWithApprovals trait。审批对象工具默认需要审批。
needsApproval 方法。该方法可以返回布尔值,或包含审批理由的 Approval 实例。
tools 方法中返回工具时覆盖审批要求。
pendingApprovals,可以查看每次工具调用的 ID、工具名称、参数和审批理由。
Decisions 实例。决定可以进行调用的批准、拒绝,或在执行前编辑参数。
true、false 可作为批准和拒绝的简写形式。所有待处理的工具调用都必须有决定。指定未知、缺失或已解决的工具调用 ID 会抛出 ApprovalMismatchException。对于没有显式决定的调用,可通过 approveRemaining 或 rejectRemaining 方法指定默认决定。
Decision::reject('未获批准。'))时,结果会返回给模型继续响应。若不带结果拒绝,则在记录拒绝时生成循环停止。
工具审批在 prompt、stream、queue、broadcast、broadcastNow、broadcastOnQueue 方法中都受支持。
在流式传输和广播过程中,暂停以 tool_approval_request 事件表示。若使用 Vercel AI SDK 流协议,审批请求和结果会以协议原生的工具审批部件形式发送。
对于队列化的智能体,结果响应会传递给 then 回调,Laravel 也会派发 ToolApprovalRequested 事件。
在请求模型继续之前,Laravel 会保存已批准工具的执行结果。若之后生成失败,审批已然解决。请不要重发相同的审批决定,而是使用普通文本提示继续对话。
完整的审批流程
以下路由展示了完整的审批流程。GET 路由返回聊天界面,POST 路由接收来自聊天界面的新文本提示或审批决定。此示例假设应用程序的 User 模型使用了 HasConversations trait。
awaiting_approval,聊天界面应显示待审批项,并以工具调用 ID 为键,将用户的选择发送到相同的端点。
message 值。
图像生成
使用Image 类可以生成图像。OpenAI、Gemini、xAI 提供商均支持。
保存图像
通过队列生成图像
语音合成(TTS)
使用Audio 类可以将文本转换为语音。OpenAI、ElevenLabs 提供商均支持。
保存音频
通过队列生成音频
转录(STT)
使用Transcription 类可以将音频文件转换为文本。OpenAI、ElevenLabs、Mistral 提供商均支持。
说话人分离(Diarization)
使用diarize() 可以获取按说话人分离的转录内容。
通过队列进行转录
文本摘要(Text Summarization)
使用 LaravelStringable 类提供的 summarize 方法可以总结文本。默认摘要不超过 3 句话,并使用所配置提供商中最便宜的文本模型。
Str 类也提供了静态方法版本。
嵌入(Embeddings)
可以将文本转换为向量表示,用于相似度检索等场景。多模态嵌入(Multimodal Embeddings)
Embeddings::for 方法不仅接受字符串,也接受图像、音频、文档和视频输入,因此可以为非文本内容生成嵌入。Gemini 支持图像、音频、文档和视频的嵌入,VoyageAI 支持图像和视频的嵌入。
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(),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— 从存储删除文件后