@googledevs: 构建自主的、全栈 AI 应用从未如此简单!宣布 Genkit Agents API(TS 和 Go 预览版)。Sa…
摘要
Google 宣布了适用于 TypeScript 和 Go 的 Genkit Agents API(预览版),这是一个开源框架,通过处理消息历史、流式传输、工具循环和持久化,简化了构建全栈对话式 AI 应用的过程。
查看缓存全文
缓存时间: 2026/07/07 14:19
构建基于智能体的全栈 AI 应用从未如此简单!隆重推出 Genkit Agents API(TS 和 Go 预览版)。告别重新搭建消息历史、流式传输和工具循环的繁琐工作。取而代之,您可以在服务器上定义智能体,然后从前端无缝驱动它!获取灵感,点击这里查看:— # 使用 Genkit 构建智能体全栈应用 来源:https://developers.googleblog.com/build-agentic-full-stack-apps-with-genkit/ ## 宣布 Genkit Agents:对话式 AI 的全栈基础 Genkit (https://genkit.dev/) 是一个开源框架,用于为任何平台构建全栈、AI 驱动的智能体应用,支持 TypeScript、Go、Dart 和 Python。一些最具吸引力的 AI 功能是对话式的,比如一个能记住工单的客服助手,或者一个能跨多轮对话工作的智能副驾。每个这样的功能都不仅仅需要一次 generate() 调用,而如今构建这样一个功能意味着要手动连接消息历史、工具循环、流式传输、持久化以及前端协议。这种重复性的工作在每个项目中都会出现,并且与你应用的独特性几乎没有关系。 Genkit 通过 Agents API (https://genkit.dev/docs/agents/overview/) 解决了这个问题,该 API 将所有这一切打包在一个接口之后。你在服务器上定义一个智能体,然后用同一个 chat() API 驱动它,无论它是在进程内运行还是在 HTTP 端点后面运行。 > Agents API 目前在 TypeScript 和 Go 中处于预览阶段。它可能在次要版本发布中引入破坏性变更。 ### 定义智能体 一个智能体首先需要一个名称和系统提示。随着功能扩展,你可以添加工具、状态和会话存储。 import genkitx "github.com/firebase/genkit/go/genkit/exp" g := genkit.Init(ctx, genkit.WithPlugins(&googlegenai.GoogleAI{}), genkit.WithExperimental(), // 启用 Agents API 等预览功能。 ) assistant := genkitx.DefineAgent(g, "assistant", aix.InlinePrompt{ ai.WithModelName("googleai/gemini-flash-latest"), ai.WithSystem("You are a helpful assistant."), }, ) out, err := assistant.RunText(ctx, "Hello. What can you do?") if err != nil { log.Fatal(err) } fmt.Println(out.Message.Text()) Go 复制 同一个智能体对象非常灵活,可以处理一次性回复、流式交互、暂停的工具调用以及多轮对话。随着功能增加,你无需转向不同的抽象。 ### 状态存在于你想要的地方 每次对话都需要在轮次之间保持连续性,由你来决定谁拥有它的所有权。添加一个 store,智能体就变成了服务器管理。服务器将消息、自定义状态和工件作为快照持久化保存,客户端通过传回会话 ID 来继续对话。选择这种模式用于持久聊天应用、共享设备,以及任何客户端不应承载整个对话的工作流。 import firebasex "github.com/firebase/genkit/go/plugins/firebase/exp" import genkitx "github.com/firebase/genkit/go/genkit/exp" store, err := firebasex.NewFirestoreSessionStore[WeatherState](ctx, g, firebasex.WithCollection("snapshots"), firebasex.WithCheckpointInterval(10), ) if err != nil { log.Fatal(err) } weatherAgent := genkitx.DefineAgent(g, "weatherAgent", aix.InlinePrompt{ ai.WithSystem("Answer weather questions. Ask for a location when one is missing."), ai.WithTools(getWeather), }, aix.WithSessionStore(store), ) Go 复制 你配置的存储决定了快照的存放位置。对于生产环境,Firestore 提供了一个托管的、多实例的数据库,多个服务器实例可以共享。Genkit 还提供了用于本地开发的轻量级存储,并允许你实现自己的存储,下面的章节会介绍。 如果不使用存储,智能体就是客户端管理的:服务器返回完整状态,客户端在下一轮次将其传回。当你的应用已经拥有持久化能力,或者你需要无状态服务器部署时,使用这种模式。 每个成功的服务器管理轮次都会写入一个快照,因此你可以通过 sessionId 恢复最新状态,或者通过 snapshotId 从历史中的某个精确点分支。分支功能允许用户从任何保存的时刻探索替代方案,而不会干扰原始线程。 // 继续会话中的最新状态。 out, err := weatherAgent.RunText(ctx, "Continue where we left off.", aix.WithSessionID[WeatherState]("user-session-123"), ) // 或者从某个特定的保存点分支。 branch, err := weatherAgent.RunText(ctx, "Revise this plan for a smaller budget.", aix.WithSnapshotID[WeatherState](approvedPlanSnapshotID), ) Go 复制 除了消息历史,智能体还携带另外两种状态。自定义状态是你的类型化应用数据,是驱动下一轮次的紧凑控制值和 UI 值,例如工作流状态、任务列表或选中的实体。工件是生成的输出结果,用户可以独立检查、下载或版本控制,例如报告、补丁或行程安排。工具通过活动会话更新其中任何一种状态,并且 Genkit 会在变化发生时将其流式传输到客户端。 ## 通过 HTTP 提供服务 每个智能体本身已经是可服务的动作,因此将其放在 HTTP 端点后面只需几行代码。路由助手返回的描述符可以挂载到标准的 http.ServeMux 上,它们会自动为你设置交互端点以及快照和中止配套端点。 import genkitx "github.com/firebase/genkit/go/genkit/exp" mux := http.NewServeMux() for _, route := range genkitx.AllAgentRoutes(g) { mux.HandleFunc(route.Pattern(), route.Handler()) } log.Fatal(http.ListenAndServe(":8080", mux)) Go 复制 下面的客户端使用的就是同一个有线协议,因此 JavaScript 或 Go 后端可以用相同的方式服务任何客户端。 ## 丰富的客户端,实现全栈集成 连接服务器和客户端的桥梁是远程智能体。remoteAgent() 返回一个句柄,其**chat() 接口**与本地智能体相同,因此你在后端测试中驱动智能体的代码与在浏览器中驱动它的代码是一样的。无需设计单独的请求和响应协议,也无需发明流式格式。 我们推出了一个 JavaScript 客户端,因此 Web 前端可以与同一个智能体端点通信。以下是从 TypeScript 前端连接到远程智能体的示例。 import { remoteAgent } from 'genkit/beta/client'; const agent = remoteAgent({ url: 'http://localhost:8080/api/weatherAgent', }); const chat = agent.chat(); const res = await chat.send('Weather in Tokyo?'); console.log(res.text); JavaScript 复制 客户端通过智能体路由使用同一个有线协议进行通信,因此它对 JavaScript 或 Go 后端的工作方式相同。它每请求解析动态身份验证头,应用流式状态更新,并使用会话 ID、快照 ID 或客户端管理状态(取决于你的智能体使用哪种)继续下一轮次。 流式传输内置在同一个接口中。sendStream() 为你提供一个块流和一个最终响应,每个块可以在生成时携带文本、自定义状态或工件。 const turn = agent.chat().sendStream('Write a long report.'); for await (const chunk of turn.stream) { if (chunk.text) process.stdout.write(chunk.text); if (chunk.custom) updateStatus(chunk.custom); if (chunk.artifact) renderArtifact(chunk.artifact); } const res = await turn.response; JavaScript 复制 如果你已经有使用 Vercel AI SDK UI (https://ai-sdk.dev/docs/ai-sdk-ui) 库的应用,@genkit-ai/vercel-ai 包为其 useChat hook 提供了一个适配器。GenkitChatTransport 适配器将 useChat 连接到你的 Genkit 智能体,因此你可以使用 Vercel 的 AI Elements (https://elements.ai-sdk.dev/) 组件来组装界面,同时在后端获得 Genkit 的所有好处。 ## 内置人工审批 工具可以使智能体暂停并将控制权交还给用户。模型决定需要外部输入,工具中断,客户端在继续轮次之前批准、拒绝或提供缺失的值。这就是如何在支付、部署或任何你不想自动运行的操作之前,将人工纳入循环的方式。 import genkitx "github.com/firebase/genkit/go/genkit/exp" import "github.com/firebase/genkit/go/ai/exp/tool" runShell := genkitx.DefineInterruptibleTool(g, "run_shell", "Run a shell command after a safety check.", func(ctx context.Context, input ShellInput, confirm *Confirmation) (ShellOutput, error) { if isRisky(input.Command) { if confirm == nil { return ShellOutput{}, tool.Interrupt(ShellInterrupt{ Command: input.Command, Reason: "The command can modify files.", }) } else if !confirm.Approved { return ShellOutput{}, errors.New("user rejected shell command execution") } } return execute(input.Command) }, ) Go 复制 该轮次以 interrupted 原因和响应中的暂停请求结束。一旦用户回答,客户端恢复,运行时根据会话历史验证恢复的有效负载,因此工具无法被欺骗以伪造输入运行。 ## 工作比请求更持久 有些轮次耗时比用户愿意等待的时间更长。借助服务器管理状态,客户端可以分离轮次,关闭标签页,稍后通过快照 ID 重新连接。智能体在服务器上继续工作,将进度写入待处理的快照,其他会话可以轮询、等待或中止该快照。 const chat = reportAgent.chat({ sessionId: 'report-123' }); const task = await chat.detach('Write the quarterly market report.'); // 持久化此快照,以便任何客户端稍后可以重新连接到该工作。 savePendingSnapshot(task.snapshotId); for await (const snapshot of task.poll({ intervalMs: 1000 })) { renderStatus(snapshot.status); if (snapshot.status === 'completed') renderMessages(snapshot.state.messages); } JavaScript 复制 这使得冗长的研究任务、多步骤计划和工具密集型工作流变得实用,而无需保持连接打开或构建单独的任务队列。 ## 协调专业智能体 当单个提示无法很好地完成所有事情时,你可以将工作分散到专业智能体,并让编排器组合它们的结果。Agents 中间件为每个子智能体注入一个委托工具,因此编排器模型可以将请求的部分路由到正确的专业智能体。使用 Genkit,子智能体给你完全的控制权,并能够实现你自己的编排逻辑。 import middlewarex "github.com/firebase/genkit/go/plugins/middleware/exp" coordinator := genkit.DefineAgent(g, "coordinator", aix.InlinePrompt{ ai.WithSystem("Delegate to specialists, inspect their results, then answer the user."), ai.WithUse( &middlewarex.Agents{ Agents: []aix.AgentRef{researcher.Ref(), coder.Ref()}, MaxDelegations: 5, ArtifactStrategy: middlewarex.ArtifactStrategySession, }, &middlewarex.Artifacts{Readonly: true}, ), }, ) Go 复制 委托在编排器的流中显示为普通工具活动,专业智能体的工件可以合并到父会话中,以便最终答案可以建立在每个专业智能体产生的结果之上。 ### 何时使用 ADK Genkit 智能体是一种应用原语,旨在存在于全栈的、面向用户的应用内部。当以下情况时,可以考虑使用 Agent Development Kit (ADK) (https://google.github.io/adk-docs/): - 多智能体编排是整个系统,而不仅仅是某个功能。 ADK 专为复杂的智能体拓扑而构建,而 Genkit 的委托中间件有意设计得更轻量,并未内置到智能体抽象的核心中。 - 你想要托管的运行时,而不仅仅是一个库。 ADK 与 Gemini Enterprise Agent Platform 上的 Agent Runtime 配对使用,用于托管、扩展和管理会话。 ## 选择你的持久化方式 服务器管理的智能体通过会话存储来保存快照,Genkit 提供了多种存储方式,以便你匹配运行环境: - 内存:用于测试、演示和单进程实验。 - 文件:用于本地开发和需要快照在重启后依然存在的单主机应用。 - Firestore:用于 Google Cloud 或 Firebase 上的生产应用,需要托管的、多实例的数据库,无需编写存储代码。 - 自定义:当你需要使用自己的数据库、授权机制或特定的保留策略时。你可以使用 store 接口实现自己的持久化层。 ## 在开发者 UI 中测试和探索 智能体在 Genkit 开发者 UI (https://genkit.dev/docs/devtools/) 中是一等公民。新的 Agent Runner 允许你开始对话、发送轮次、查看流式输出和状态更新、驱动工具中断以及检查快照,所有这些都无需编写客户端。这是在你构建智能体时进行测试,以及在调试时重现对话的最快方式。 ## 开始使用 Agents API 将对话式全栈 AI 中重复的管道工作变成了配置而不是重建。在服务器上定义一个智能体,当需要持久化时给它一个存储,然后通过 remoteAgent() 从你的前端使用相同的 chat() 接口驱动它。 前往全栈智能体文档 (https://genkit.dev/docs/agents/overview/) 深入了解,或者如果你对框架不熟悉,可以从开始使用 Genkit (https://genkit.dev/docs/get-started/) 入手。该 API 处于测试阶段,因此我们期待你的反馈:在 GitHub 上提交 issue (https://github.com/genkit-ai/genkit/issues),告诉我们你构建了什么以及你希望改进什么。 祝你编码愉快!🚀
相似文章
@googledevs:构建智能体应用很简单,但让它们达到生产就绪状态却很难。推出 Genkit Middleware:一种可组合的方式……
Google 发布 Genkit Middleware,这是一个用于 Genkit 开源框架的可组合中间件系统,可为智能体应用添加重试、回退、人工审核和全链路可观测性。现已支持 TypeScript、Go 和 Dart,Python 支持即将推出。
@googledevs: 智能体开发正在向前推进。传统上,生产扩展需要手动基础设施设置和…
Google宣布在Gemini API中正式推出Managed Agents,实现零基础设施开销的智能体开发。文章还重点介绍了AGENTS.md,这是一种为AI编码智能体提供上下文的开放格式,已被超过6万个开源项目采用。
Google的GenKit提供了一种将AI轻松“接入”现有应用的方法
Google的GenKit提供了一种将AI功能集成到现有应用中的简便方法,简化了开发流程。
@googledevs:使用 @golang 构建生产级的多代理应用 Go 2.0 的 Agent Development Kit 运行单个代理…
Google 宣布推出 Go 2.0 的代理开发套件(ADK),引入了基于图的工作流引擎、人在回路(human-in-the-loop)原语以及动态编排,用于构建生产级的多代理应用程序。
Genkit 中间件(10分钟阅读)
Google 宣布 Genkit 中间件,这是一种可组合的钩子,可拦截 AI 生成调用,实现重试、回退、工具审批和技能,用于构建可靠的智能代理应用。