简介
Laravel AI SDK 为你提供了一套统一、表达力强的 API,用来与 OpenAI、Anthropic、Gemini 等 AI 提供商进行交互。借助 AI SDK,你可以构建带工具调用和结构化输出的智能体、生成图像、进行文本转语音与语音转文本、创建向量嵌入等,全部通过一致而符合 Laravel 风格的接口完成。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() 方法向智能体发送消息。
make() 可以让容器解析依赖并生成实例。
prompt() 的参数中覆盖提供商、模型和超时时间。
会话上下文
实现Conversational 接口并定义 messages() 方法后,就可以把历史会话传给 AI。
使用 RemembersConversations trait 可以让会话历史自动保存到数据库并自动读取。
forUser() 开始一段会话,并使用返回的 conversationId 通过 continue() 继续对话。
结构化输出
实现HasStructuredOutput 接口,并在 schema() 方法中定义 JSON Schema,就能把 AI 响应作为结构化数据接收。
嵌套对象
对象数组
anyOf(多个 schema 中任选其一)
如果一个值可能匹配多个 schema 之一,可以使用anyOf 方法。
附件
通过attachments 参数可以把文档或图像传给智能体。
流式响应
使用stream() 方法可以按分块返回响应,非常适合把长响应实时推送到前端。
then() 回调在流式传输完成后执行处理逻辑。
Vercel AI SDK 协议
如果前端使用 Vercel AI SDK,可以调用usingVercelDataProtocol()。
广播
可以把流事件推送到 Laravel Echo 等广播频道。broadcastOnQueue() 可以通过队列进行广播。
跳过体积过大的事件
某些广播平台会把单条 WebSocket 消息限制在约 10KB。如果工具调用结果等数据量较大的流事件超出此上限,就会导致广播失败。你可以使用WithoutBroadcasting Attribute 把特定类型的事件排除在广播之外。
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 指定更复杂的过滤条件。
子智能体(Sub-agent)
智能体也可以从其他智能体的tools() 方法中返回。把智能体注册为工具后,父智能体就能把特定任务委派给子智能体,并把结果整合到最终响应中。这在通用智能体需要访问具有专门指令、工具、模型配置或提供商配置的专用智能体时非常有用。
例如,可以让一个客服智能体把关于退款政策的问题委派给专门处理退款的智能体。
CanActAsTool 接口,并为工具定义名称和描述。
CanActAsTool 的子智能体,Laravel 会以类名作为工具名,并自动生成一段通用描述。每次调用子智能体都是独立的,不会继承父智能体的会话历史。
中间件
你可以为智能体添加中间件,用来拦截提示词或响应。HasMiddleware 接口,并在 middleware() 方法中注册中间件。
then() 可以在响应之后追加处理逻辑。
匿名智能体
如果不想定义类,可以使用agent() 辅助函数创建匿名智能体。
智能体配置(PHP Attribute)
可以使用 PHP Attribute 以声明式的方式为智能体设置默认值。提供商选项
实现HasProviderOptions 接口后,可以传入提供商特有的选项。
图像生成
使用Image 类可以生成图像。OpenAI、Gemini、xAI 提供商均支持。
保存图像
通过队列生成图像
语音合成(TTS)
使用Audio 类可以把文本转换为语音。OpenAI 和 ElevenLabs 提供商支持。
保存音频
通过队列生成音频
语音识别(STT)
使用Transcription 类可以把音频文件转换为文本。OpenAI、ElevenLabs 和 Mistral 提供商支持。
说话人分离(Diarization)
使用diarize() 可以得到按说话人分离的转写结果。
通过队列进行语音识别
嵌入向量(Embeddings)
可以把文本转换成向量表示,用于相似度搜索等场景。向量检索(pgvector)
下面是使用 PostgreSQL 和 pgvector 扩展做向量检索的配置示例。1
创建迁移
2
配置模型
3
相似度查询
缓存嵌入向量
可以对相同文本的嵌入向量进行缓存,避免重复生成。 在config/ai.php 中设置默认的缓存行为。
重排序(Reranking)
可以按照与查询的相关度对检索结果重新排序。Cohere 和 Jina 提供商支持。limit() 可以限制返回数量。
对集合进行重排序
可以直接对 Eloquent 集合进行重排序。文件管理
可以把文件上传到 AI 提供商,之后再引用它们。引用已保存的文件
用上传得到的文件 ID 就可以把文件附加到智能体上。获取与删除文件
指定提供商
指定提供商专属选项
withProviderOptions 方法允许你传入提供商特有的上传选项。例如可以设置 OpenAI 文件的 purpose。
向量库(Vector Stores)
向量库允许你在提供商侧管理文档。向向量库添加文件
从向量库中移除文件
故障切换(Failover)
以数组方式指定多个提供商时,如果第一个提供商失败,会自动切换到下一个。测试
Laravel AI SDK 提供了测试用的 fake 能力,可以在不调用真实 API 的情况下进行测试。智能体的测试
preventStrayPrompts() 后,如果调用了 fake 中未定义的提示词,就会抛出异常。
如果对结构化输出的智能体调用
fake() 时没有显式传入 fake 数据,Laravel 会根据智能体定义的 schema 自动生成符合结构的 fake 数据。AnonymousAgent::fake()。
图像生成的测试
语音合成的测试
语音识别的测试
嵌入向量的测试
重排序的测试
文件的测试
向量库的测试
事件
Laravel AI SDK 会派发以下事件。你可以监听这些事件用于日志记录、监控等场景。智能体相关
智能体相关
PromptingAgent— 发送提示词之前AgentPrompted— 发送提示词之后StreamingAgent— 开始流式响应时AgentStreamed— 流式响应完成后InvokingTool— 工具调用之前ToolInvoked— 工具调用之后
图像、音频、语音识别相关
图像、音频、语音识别相关
GeneratingImage— 生成图像之前ImageGenerated— 生成图像之后GeneratingAudio— 生成音频之前AudioGenerated— 生成音频之后GeneratingTranscription— 语音识别之前TranscriptionGenerated— 语音识别之后
嵌入与重排序相关
嵌入与重排序相关
GeneratingEmbeddings— 生成嵌入向量之前EmbeddingsGenerated— 生成嵌入向量之后Reranking— 重排序之前Reranked— 重排序之后
文件与向量库相关
文件与向量库相关
StoringFile— 保存文件之前FileStored— 保存文件之后FileDeleted— 删除文件之后CreatingStore— 创建向量库之前StoreCreated— 创建向量库之后AddingFileToStore— 向量库中新增文件之前FileAddedToStore— 向量库中新增文件之后RemovingFileFromStore— 从向量库移除文件之前FileRemovedFromStore— 从向量库移除文件之后