【文章翻譯】Announcing Genkit Dart 1.0: Build production-ready agentic apps with Dart and Flutter

【文章內容使用 Gemini 2.5 Flash 自動翻譯產生】

原文:https://flutter.dev/blog/announcing-genkit-dart-1-0

宣布 Genkit Dart 1.0:使用 Dart 和 Flutter 建構正式發行的代理應用程式

宣布 Genkit Dart 的穩定 1.0 版本發佈,這是一個用於使用 Dart 和 Flutter 建構由 AI 驅動的功能和代理工作流程的開源框架。

Announcing Genkit Dart 1.0

Dart 和 Flutter 讓您可以從單一程式碼庫為行動裝置、網頁和桌面建構高品質的應用程式。藉助 Genkit Dart,您可以將同樣的生產力帶到全端代理應用程式中。

今天,我們宣布 Genkit Dart 1.0,這是 Google 的開源框架的第一個穩定、可正式發行的版本,用於使用 Dart 建構由 AI 驅動的功能和代理。自今年稍早發佈 預覽版 以來,Dart 和 Flutter 社群的回饋幫助我們改進了 API 並擴展了用於正式發行工作負載的工具套件。

若要開始使用,請將 genkit 加入您的專案:

1
dart pub add genkit

您也可以安裝代理技能,為 Antigravity、Claude Code 和 Codex 等 AI 程式碼助理提供最新的 Genkit Dart API 和最佳實踐知識:

1
npx skills add genkit-ai/skills

為什麼選擇 Genkit Dart

Genkit 提供跨模型供應商的統一 API、伺服器和用戶端之間的端對端型別安全,以及用於測試和偵錯 AI 工作流程的本機工具。

使用一個 API 使用任何模型

Genkit 透過單一介面支援 Google Gemini、Anthropic Claude、OpenAI 和與 OpenAI 相容的模型。您可以將模型供應商註冊為 Plugin,並且可以在不重寫應用程式邏輯的情況下切換模型:

1
2
3
4
5
6
7
8
9
10
11
12
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,
);

使用流程實現端對端型別安全

Genkit 讓您可以將 AI 邏輯包裝到流程中:強型別、可觀察的函數,易於測試並部署為 HTTP 端點。使用 schemantic 套件,您可以一次在 Dart 中定義資料模式,從模型生成結構化輸出,並在後端和 Flutter 應用程式之間共用這些精確的型別:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// 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 伺服器上:執行複雜的流程並將敏感的提示保留在後端,然後使用 defineRemoteAction 從 Flutter 呼叫它們,如上所示。
  • 在 Flutter 中使用遠端模型:將您的 AI 邏輯保留在 Flutter 應用程式中,同時透過輕量級 Genkit 後端路由模型請求,該後端保護您的 API 金鑰並強制執行授權:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 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.',
);

使用開發人員 UI 進行測試和偵錯

Genkit 包含一個本機開發人員 UI,用於測試流程、嘗試提示以及逐步檢查執行追蹤。使用 Genkit CLI 與您的 Dart 程序一起啟動它:

1
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(...) 來暫停生成循環:

1
2
3
4
5
6
7
8
9
10
11
12
13
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 呼叫:

1
2
3
4
5
6
7
8
9
10
11
12
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 中將它們作為可呼叫函數來調用:

1
2
3
4
5
6
7
---
model: googleai/gemini-flash-latest
input:
schema:
destination: string
---
Write a friendly, two-sentence introduction to {{destination}} for a first-time visitor.
1
2
final introPrompt = await ai.prompt('destinationIntro');
final response = await introPrompt({'destination': 'Kyoto'});

監控您正式發行的應用程式

當您準備部署時,genkit_otel 套件會使用 OpenTelemetry GenAI 語義約定匯出追蹤、令牌使用量和延遲指標,並直接與您現有的可觀察性後端整合:

1
2
3
4
5
6
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 應用程式:

1
2
3
4
5
6
7
8
9
10
11
12
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 應用程式會將其逐步渲染為原生 Widget。請查看 A2UI 指南 以了解更多資訊。

開始使用

Genkit Dart 1.0 現已在 pub.dev 上提供。感謝 Dart 和 Flutter 社群中的每一個人,他們透過預覽版進行建構、報告問題並貢獻拉取請求,幫助 Genkit Dart 達到 1.0 版本。

我們迫不及待想看到您使用 Genkit Dart 1.0 建立的成果!

更多來自 Flutter 的內容

材質和 Cupertino 解耦已實現