Genkit Dart 1.0:Flutter 开发者终于有了稳定版的 AI 框架
Google 宣布 Genkit Dart 1.0 稳定可用于生产:一套 API 接多家模型,前后端共享 schema 做到端到端类型安全,工具调用还能中断等人确认。
如果你是一个 Flutter 开发者,想在自己的 App 里加一个 AI 助手,会遇到什么问题?
我猜,第一个问题是:用什么框架?
过去,这个问题不太好回答。
很多 AI 应用框架,首先照顾的是 Python 和 JavaScript 开发者,Dart 往往排在后面。(这是我的个人观察。)
2026 年 10 月 8 日,Google 宣布 Genkit Dart 1.0 发布稳定版。
Google 官方博客称,它已经可以用于生产环境。
也就是说,Dart 和 Flutter 开发者终于有了一个正式的、稳定版的 AI 应用框架。
今天就来介绍一下,它解决了哪些问题,其中有两个设计,我觉得特别值得一说:端到端的类型安全,以及可以暂停等人审批的工具调用。
一、先看它是什么
Genkit Dart 的定位,是一个用来搭建 AI 应用和 agent 的框架。
安装只要一行命令。
dart pub add genkit
装好以后,你用同一套 API,就可以接入 Gemini、Claude、OpenAI,以及其他兼容的模型。
这一点很实用。
模型更新得太快了,今天这家便宜,明天那家更强。
如果每换一家模型,就要重写一遍调用代码,那就太累了。
一套 API 接多家模型,换模型的时候,改动就可以集中在少数地方。(这是我的推断,具体改动多少,取决于你的代码怎么组织。)
它能运行的位置也比较灵活,官方列了三种:Flutter 应用所在的设备本机、Dart 写的服务端,以及远程的模型代理。
二、端到端类型安全:前后端说同一种语言
下面说第一个设计。
先解释一下,什么叫"类型安全"。
假定你的服务端有一个接口,接收"城市名"和"天数",返回一份旅行计划。
客户端调用的时候,如果把"天数"写成了字符串 "三天",会发生什么?
在很多项目里,这种错误要等到程序真正运行、请求真正发出去以后,才会暴露出来。
运气不好的话,它会一直藏到用户手里。
类型安全的意思是,数据长什么样子,事先写清楚,写错了,在编码阶段就会被发现,不必等到运行时。
Dart 本身就是一门有类型的语言,所以单看一端,做到这一点并不难。
难的是"端到端"。
前端和后端是两份代码,往往是两个人写的。
后端改了一个字段,前端不知道,类型检查也帮不上忙,因为两边各有一份自己的定义。
这就像两个人各拿一份地图,一个人在自己那份上改了路名,另一个人手里的地图并不会跟着变。
Genkit Dart 的做法是,让两边看同一份地图。
Google 官方博客称,flows 和 schemantic 共享 schema。
这句话需要拆开来理解。
flow 是 Genkit 里的一个概念,你可以把它理解成一段定义好输入、输出的 AI 处理流程。
服务端用 defineFlow 定义一个 flow,这个 flow 可以直接作为 HTTP 端点对外提供。
客户端----比如 Flutter App----则用 defineRemoteAction 去调用它。
关键在于,输入和输出的结构,由同一份 schema 描述。(据我理解,schemantic 就是用来描述这份数据结构的工具;具体用法请以官方文档为准。)
画成示意图,就是下面这样。
(示意,不是真实代码)
同一份 schema(输入长什么样、输出长什么样)
/ \
服务端:defineFlow ---- 作为 HTTP 端点 ---- 客户端:defineRemoteAction
这样一来,后端改了数据结构,前端就会在编码阶段看到类型对不上,而不是等用户点了按钮才报错。(这是根据"共享 schema"做出的推断。)
对于一个人同时写 Flutter 前端和 Dart 后端的小团队来说,这可能是 Genkit Dart 最大的吸引力:前后端终于说同一种语言,用同一份定义。
三、工具调用可以中断:让 agent 先停一下,等人点头
再说第二个设计。
现在的 agent,不只是聊天,还会调用工具。
查天气是一个工具,搜航班是一个工具,订酒店也是一个工具。
前两个工具,就算调错了,大不了再查一次。
但是,订酒店不一样。
它会花钱,可能还不能退。
你放心让一个 AI 自己做决定,直接把钱付出去吗?
我相信,大多数人不放心。
怎么解决呢?
Genkit Dart 的答案是:工具可以用 .interrupt 停下来,等人审批,然后再 resume 继续执行。
Google 官方示例里,正好有一个 trip planner(旅行规划),里面演示了 bookHotel 的中断。
我们可以设想一下这个过程。(下面的步骤是我根据 .interrupt 和 resume 的作用做的示意,不是官方示例的原文。)
(示意流程)
1. 用户:帮我规划三天的行程,顺便把酒店订了。
2. agent:查景点、排路线(这些工具直接执行)
3. agent:准备调用 bookHotel
4. bookHotel 触发 .interrupt ---- 流程暂停
5. 界面弹出确认:要预订这家酒店吗?
6. 用户点"确认"
7. resume ---- 流程从暂停处继续,完成预订
这就像公司里的报销流程。
员工可以自己买文具、订会议室,但是超过一定金额的支出,必须先停下来,等领导签字。
签了字,流程继续;不签,就到此为止。
中断的意义在于,它把"AI 能不能做这件事"和"这件事要不要做"分开了。
AI 负责准备好一切,人只负责最后那一下确认。
除了 .interrupt,Genkit Dart 还提供了 middleware(中间件),官方列了三个:retry、skills 和 toolApproval。
从名字看,retry 用于失败重试,toolApproval 用于工具审批。(这是我从名字做的推断,具体行为请以官方文档为准。)
如果要做审批,看起来既可以在单个工具上用 .interrupt,也可以用 toolApproval 这样的中间件统一处理。两种做法具体怎么取舍,官方文档会讲得更清楚。
四、其他值得一提的功能
除了上面两点,Genkit Dart 1.0 还有几样东西,简单列一下。
(1)Developer UI
本地开发时,可以用下面的命令启动一个开发者界面。
genkit start -- dart run ...
后面的 ... 换成你自己的启动参数。
有了这个界面,调试 flow 和 prompt 的时候,不必每次都把整个 App 跑起来。(这是我对开发者界面用途的一般理解。)
(2)Dotprompt
Genkit Dart 支持 Dotprompt。
简单说,就是把 prompt 写在单独的文件里,而不是混在代码字符串里,方便单独修改和管理。
(3)OpenTelemetry
genkit_otel 可以把运行数据接入 OpenTelemetry。
OpenTelemetry 是一个通用的可观测性标准。接上以后,AI 调用就可以和应用的其他监控数据放在一起看,比如一次请求慢在哪里。
对于"可用于生产"这个说法,这一项很重要。上线以后出了问题,你得能看到发生了什么。
(4)给 coding agent 装技能
如果你平时用 coding agent 写代码,可以用下面这行命令,给它装上 Genkit 相关的技能。
npx skills add genkit-ai/skills
这样,你让 agent 帮你写 Genkit Dart 代码的时候,它手里就多了一份参考。
(5)实验功能
还有两个功能仍处于实验阶段:defineAgent 和 A2UI generative UI。
前者从名字看,是用来直接定义 agent 的;后者跟"由 AI 生成界面"有关。
既然标着实验,就意味着接口以后可能会变,生产环境用之前要想清楚。
五、它适合谁
最后说说,谁应该关注它。
我觉得,主要是三类人。
第一类,Flutter 开发者。想在 App 里加 AI 功能,又不想为此另学一门语言、另搭一套 Python 服务。
第二类,用 Dart 写服务端的团队。前后端共享 schema,能少踩很多"字段对不上"的坑。
第三类,要做"会花钱、会改数据"的 agent 的人。工具中断加人工审批,是让这类 agent 敢上线的前提。
当然,也要说清楚边界。
1.0 是一个稳定的起点,不代表所有功能都已经成熟,defineAgent 和 A2UI 就还在实验阶段。
另外,本文对各个功能的介绍,都来自 Google 官方博客的发布文章。实际用起来体验如何,还要等更多开发者的反馈。
总结
Genkit Dart 1.0 的意义,可以用一句话概括。
Dart 和 Flutter 开发者终于有了一个稳定版的 AI 框架:一套 API 接多家模型,前后端共享同一份 schema,危险的工具调用可以停下来等人点头。
如果你正好在用 Flutter,想给 App 加一个真正能办事的 AI 助手,可以先运行 dart pub add genkit,再把官方的 trip planner 示例跑一遍,亲眼看看 bookHotel 是怎么停下来等你确认的。
(完)
来源:Flutter 官方博客:Announcing Genkit Dart 1.0(2026-10-08)。文中关于 Genkit Dart 1.0 的事实只取自该来源;两段代码块(共享 schema、bookHotel 中断流程)为示意,不是真实 API 签名;标注「推断」「我的理解」之处为作者解读,请以官方文档为准。