跳到正文
Hacker News· khalidkhair·· 7 天前AI 评分58

Google 发布 Genkit Dart 1.0,用 Dart 和 Flutter 构建智能体应用

Genkit Dart 1.0: Build production-ready agentic apps with Dart and Flutter

AI 导读

Google 发布 Genkit Dart 1.0,这是其面向 Dart 和 Flutter 的开源 AI 应用框架首个稳定版本,可通过 dart pub add genkit 安装。

正文 · AI 翻译

宣布 Genkit Dart 稳定版 1.0 发布,这是一个开源框架,用于使用 Dart 和 Flutter 构建 AI 驱动的功能和智能体工作流。

2026年10月8日 · 6 分钟阅读

Announcing Genkit Dart 1.0

Dart 和 Flutter 让你能够从单一代码库为移动端、Web 和桌面端构建高质量应用。借助 Genkit Dart,你可以将同样的生产力带到全栈、智能体应用中。

今天,我们宣布 Genkit Dart 1.0,这是 Google 开源框架的首个稳定、可用于生产环境的版本,用于在 Dart 中构建 AI 驱动的功能和智能体。自今年早些时候我们的 预览版发布 以来,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 逻辑封装到 flows 中:强类型、可观测的函数,易于测试并可作为 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 中:直接从你的应用调用模型,用于快速原型设计或自带密钥体验(切勿在已发布的客户端应用中嵌入私有 API 密钥)。
  • 在 Dart 服务器上:运行复杂的 flows,并将敏感提示保留在后端,然后如上所示使用 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 包含一个本地开发者 UI,用于测试流程、试验 提示词,并逐步检查执行轨迹。使用 Genkit CLI 将其与你的 Dart 进程一起启动:

shell

genkit start -- dart run bin/server.dart
Inspecting an agent's model and tool calls in the Genkit Developer UI
在 Genkit 开发者 UI 中检查智能体的模型和工具调用

为智能体工作流而构建

自预览版发布以来,我们为 Genkit Dart 扩展了专为 多步骤智能体工作流设计的能力,包括人在回路中断、 生成中间件、提示词管理和生产遥测。

通过人在回路中断为模型提供工具

工具让模型可以调用你的 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 文件中一起管理提示词模板、模型配置和输入/输出模式。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 语义 约定导出轨迹、 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());

下一步:有状态智能体和生成式 UI

除了稳定的 1.0 核心之外,我们正在 package:genkit/experimental.dart 导入下开发更高级的智能体 API, 以便你可以提前试用它们, 并帮助塑造其设计。

有状态智能体将模型、工具、系统指令和状态组合成 单次 defineAgent 调用。对话通过会话存储跨轮次和应用 重启持久保留,你可以使用 remoteAgent 将任务 委托给子智能体,或通过 HTTP 暴露智能体以连接你的 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让智能体能够流式传输交互式 UI 界面, 而非纯文本。借助 genkit_a2ui, 智能体可以发出日期选择器、表单和确认卡片等组件, 你的 Flutter 应用会将其作为原生组件逐步渲染。查看 A2UI 指南了解更多。

开始使用

Genkit Dart 1.0 现已在 pub.dev 上发布。感谢 Dart 和 Flutter 社区中的每一位, 你们使用预览版进行构建、报告问题并贡献拉取请求, 帮助 Genkit Dart 达到 1.0。

我们迫不及待想看到你用 Genkit Dart 1.0 构建的作品!

更多来自 Flutter

来源:Hacker News · flutter.dev