第9章 Genkit Dart 1.0 正式发布:用 Dart 和 Flutter 构建生产级 AI Agent 应用
发布 Genkit Dart 1.0:用 Dart 和 Flutter 构建生产级 agentic 应用
我们正式发布 Genkit Dart 的稳定版 1.0,这是一个开源框架,让你能用 Dart 和 Flutter 构建 AI 驱动的功能和 agentic 工作流。 Chris Gill 2026 年 10 月 8 日 · 6 分钟阅读 rss_feed 分享到 X 分享到 Bluesky 分享到 LinkedIn Dart 和 Flutter 让你用一套代码库为移动、Web 和桌面构建高质量应用。借助 Genkit Dart,你可以在全栈 agentic 应用中延续同样的开发效率。 今天,我们正式发布 Genkit Dart 1.0——Google 开源框架的首个稳定、可用于生产环境的版本,用于在 Dart 中构建 AI 功能和 agents。自今年年初的 预览版发布 以来,Dart 和 Flutter 社区的反馈帮助我们打磨了 API,并扩充了面向生产工作负载的工具集。 要开始使用,只需把 genkit 加入你的项目: shell dart pub add genkit
你还可以安装 agent skill,让 Antigravity、Claude Code、Codex 等 AI 编程助手掌握最新的 Genkit Dart API 和最佳实践: shell npx skills add genkit-ai/skills
为什么选择 Genkit Dart Genkit 提供跨模型提供商的统一 API、服务端与客户端之间的端到端类型安全,以及用于测试和调试 AI 工作流的本地工具。 一个 API 调用任意模型 Genkit 通过单一接口支持 Google Gemini、Anthropic Claude、OpenAI 以及 OpenAI 兼容模型。你只需把模型提供商注册为插件,就能随意切换模型,无需重写应用逻辑: dart final ai = Genkit(plugins: [googleAI(), anthropic()]); final prompt = 'Suggest a weekend getaway from San Francisco.'; final fromGemini = await ai.generate( model: googleAI.gemini('gemini-flash-latest'), prompt: prompt, ); final fromClaude = await ai.generate( model: anthropic.model('claude-sonnet-5-5'), prompt: prompt, );
用 flows 实现端到端类型安全 Genkit 允许你把 AI 逻辑封装成 flow:强类型、可观测的函数,易于测试,还能直接部署为 HTTP 端点。借助 schemantic 包,你只需在 Dart 中定义一次数据 schema,就能从模型生成结构化输出,并在后端和 Flutter 应用之间共享完全一致的类型: dart // shared/lib/models.dart (used by both server and app) @Schema() abstract class $TripRequest { String get destination; int get days; } // ...plus an Itinerary schema for the result. // server/bin/server.dart final planTrip = ai.defineFlow( name: 'planTrip', inputSchema: TripRequest.$schema, outputSchema: Itinerary.$schema, fn: (request, _) async { final response = await ai.generate( model: googleAI.gemini('gemini-flash-latest'), prompt: 'Plan a ${request.days}-day trip to ${request.destination}.', outputSchema: Itinerary.$schema, ); return response.output!; }, ); await (GenkitRouter()..addAction(planTrip)).serve(port: 8080); // POST /planTrip // app/lib/main.dart final planTrip = defineRemoteAction( url: 'https://api.example.com/planTrip', // Your Genkit endpoint inputSchema: TripRequest.$schema, outputSchema: Itinerary.$schema, ); final itinerary = await planTrip( input: TripRequest(destination: 'Kyoto', days: 5), );
Dart 能跑的地方都能运行 你的 AI 逻辑是标准 Dart 代码,因此可以借助热重载快速迭代,也能根据架构灵活选择运行位置: 直接在 Flutter 中运行:在应用内直接调用模型,适合快速原型开发或自带密钥(bring-your-own-key)的场景(切勿在发布的客户端应用中内嵌私密 API 密钥)。 在 Dart 服务器上运行:把复杂 flow 和敏感提示词留在后端,再通过 defineRemoteAction 从 Flutter 端调用,如上例所示。 在 Flutter 中使用远程模型:AI 逻辑保留在 Flutter 应用里,模型请求则经由轻量的 Genkit 后端路由,以保护 API 密钥并实施鉴权: dart // server/bin/server.dart final genkit = GenkitRouter() ..addAction( googleAI().model('gemini-flash-latest'), path: '/gemini', // Runs before the model; throw a GenkitException to reject the request. contextProvider: (request) async => {'user': await verifyUser(request.headers['authorization'])}, ); await genkit.serve(port: 8080); // app/lib/main.dart final ai = Genkit(); final gemini = ai.defineRemoteModel( name: 'gemini', url: 'https://api.example.com/gemini', headers: (context) async => {'Authorization': 'Bearer ${await getIdToken()}'}, ); final response = await ai.generate( model: gemini, prompt: 'Suggest a packing list for Kyoto in April.', );
用 Developer UI 测试和调试 Genkit 自带本地 Developer UI,可用于测试 flow、试验提示词,以及逐步查看执行 trace。通过 Genkit CLI 随 Dart 进程一起启动: shell genkit start -- dart run bin/server.dart
在 Genkit Developer UI 中查看 agent 的模型与工具调用 为 agentic 工作流而生 预览版发布之后,我们为 Genkit Dart 新增了一系列面向多步 agentic 工作流的能力,包括 human-in-the-loop 中断、生成中间件、提示词管理和生产环境遥测。 用 human-in-the-loop 中断为模型提供工具 工具让模型可以调用你的 Dart 函数来获取数据或触发动作,比如搜索航班或预订酒店。当某个操作需要用户确认时,工具可以返回 .interrupt(...)(而非 .response(...))来暂停生成循环: dart final bookHotel = ai.defineTool( name: 'bookHotel', description: 'Books a hotel room for the user.', inputSchema: HotelBooking.$schema, fn: (input, ctx) async { // Ask the user to confirm before charging their card. if (ctx.resumed == null) { return .interrupt({'hotel': input.hotelName, 'total': input.totalPrice}); } final confirmation = await hotels.book(input); return .response(confirmation.id); }, );
把确认环节放在工具内部,可以确保模型无法绕过它。当 generate 以 FinishReason.interrupted 返回时,Flutter 应用可以提示用户确认,并从暂停处继续执行。 用中间件扩展生成过程 中间件直接挂载到 generate 循环中,可以拦截模型调用、注入工具,或修改请求与响应。配合 genkit 和 genkit_middleware,你可以把自动重试、动态加载 SKILL.md 、工具审批规则等现成能力附加到任意 generate 调用上: dart final ai = Genkit(plugins: [googleAI(), SkillsPlugin(), ToolApprovalPlugin()]); final response = await ai.generate( model: googleAI.gemini('gemini-flash-latest'), prompt: 'Move my Kyoto hotel check-in to Friday.', tools: [findBookings, updateBooking], use: [ retry(maxRetries: 3), skills(skillPaths: ['./skills']), toolApproval(approved: ['findBookings', 'use_skill']), ], );
你还可以通过 defineGenerateMiddleware 编写自定义中间件,处理日志、缓存、模型回退等横切逻辑。 用 Dotprompt 管理提示词 Dotprompt 让你在 .prompt 文件中统一管理提示词模板、模型配置和输入/输出 schema。Genkit 会自动加载 prompts/ 目录下的提示词,让你在 Dart 中像调用函数一样使用它们: dotprompt --- model: googleai/gemini-flash-latest input: schema: destination: string --- Write a friendly, two-sentence introduction to {{destination}} for a first-time visitor.
dart final introPrompt = await ai.prompt('destinationIntro'); final response = await introPrompt({'destination': 'Kyoto'});
在生产环境监控应用 准备好部署后,genkit_otel 包可以按照 OpenTelemetry GenAI 语义规范导出 trace、token 用量和延迟指标,直接接入你现有的可观测性后端: dart import 'package:dartastic_opentelemetry/dartastic_opentelemetry.dart'; import 'package:genkit/telemetry.dart'; import 'package:genkit_otel/genkit_otel.dart'; await OTel.initialize(); configureInstrumentation(GenAiInstrumentation());
下一步:有状态 agents 与生成式 UI 在稳定版 1.0 核心之外,我们正在通过 package:genkit/experimental.dart 开发更高层的 agentic API,欢迎提前试用并参与设计反馈。 有状态 agents 通过一个 defineAgent 调用,把模型、工具、系统指令和状态组合在一起。借助 session store,对话可以跨轮次和应用重启持久化;你还可以用 remoteAgent 把任务委派给子 agent,或通过 HTTP 暴露 agent 并与 Flutter 应用连接: dart import 'package:genkit/experimental.dart'; final travelAgent = ai.defineAgent( name: 'travelAgent', model: googleAI.gemini('gemini-flash-latest'), system: 'You help users plan and book trips.', tools: [searchFlights, bookHotel], store: FirestoreSessionStore(collection: 'sessions'), ); final chat = travelAgent.chat(sessionId: 'user-123'); final response = await chat.send(text: 'Find me a weekend in Lisbon.');
基于 A2UI 的生成式 UI 让 agent 能流式输出可交互的 UI 界面,而非纯文本。借助 genkit_a2ui,agent 可以输出日期选择器、表单、确认卡片等组件,Flutter 应用会以原生 widget 的形式增量渲染。详情请参阅 A2UI 指南。 开始使用 Genkit Dart 1.0 已在 pub.dev 上线。感谢 Dart 和 Flutter 社区的每一位成员——感谢大家在预览阶段的构建、反馈问题并提交 pull request,助力 Genkit Dart 走到 1.0。 快速上手:阅读 快速入门指南。 浏览示例:查看 GitHub 上的 示例应用。 加入社区:在 Discord 上与团队交流。 保持关注:在 X 和 LinkedIn 上关注 Genkit。 提供反馈:在 GitHub 仓库 提交 issue。 期待看到大家用 Genkit Dart 1.0 构建出的精彩作品! 更多 Flutter 内容 Material 与 Cupertino 正式解耦 为什么把 Material 和 Cupertino 从 Flutter 核心中分离,能加速问题修复和新功能开发 Craig Labenz 2026 年 9 月 9 日 · 4 分钟阅读 参与 Flutter Web WebAssembly 周 立即启用 Wasm 编译,网页性能最高提升 2 到 5 倍 Kevin Moore 2026 年 8 月 17 日 · 4 分钟阅读