abc小站

2026-10-10

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 签名;标注「推断」「我的理解」之处为作者解读,请以官方文档为准。