dart-genkit について
Genkit Dart SDK を使って AI ワークフローやエージェントを構築する Dart 開発者向けのガイドです。型安全性と可観測性を重視し、構造化プロンプト、モデル、カスタムツール、フローの構成を扱います。
主な機能
- 01構造化プロンプトとモデル呼び出し
- 02入出力スキーマ付きツールの定義
- 03スキーマに基づくフローの構成
- 04テレメトリーとエラー処理の指針
- 05エージェントの判断とツール呼び出しの追跡
活用シーン
- 01型安全な AI ワークフローの構築
- 02エージェントへの独自タスクツールの追加
- 03開発中のエージェント実行トレースの確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dhruvanbhalara/ skills --skill dart-genkitインストール後、Claude Code で/dart-genkitを入力して読み込まれたか確認します。
詳細
Genkit Dart による AI エンジニアリング
Genkit Dart SDK を使用して、構造化された、型安全で、可観測な AI 搭載ワークフローとエージェントを構築します。
目次
プロジェクトのセットアップ
- Dart プロジェクトの
pubspec.yamlに Genkit パッケージを追加します。dependencies: genkit: ^0.1.0-preview # Replace with the latest version google_generative_ai: ^0.4.0 - 環境変数に API 認証情報(Gemini API キーなど)を設定します。
export GEMINI_API_KEY="your_api_key_here"
プロンプトとモデルの定義
Genkit は、構造化プロンプトを使用して、モデルの呼び出しとプロンプトの構造をコアアプリケーションロジックから分離します。
import 'package:genkit/genkit.dart';
import 'package:google_generative_ai/google_generative_ai.dart';
void main() async {
// Initialize Genkit
final ai = Genkit(
model: 'gemini-1.5-flash',
apiKey: String.fromEnvironment('GEMINI_API_KEY'),
);
// Invoke the model with a simple prompt
final response = await ai.generate(
prompt: 'Explain the concept of monads in Dart.',
);
print(response.text);
}
カスタムツールの作成
Genkit のエージェントは、タスク(データベースクエリ、ウェブスクレイピング、数学的計算など)を実行するためにツールを利用します。
import 'package:genkit/genkit.dart';
// 1. Define schemas for input and output
final additionInputSchema = Schema.object({
'a': Schema.number(description: 'First number'),
'b': Schema.number(description: 'Second number'),
});
// 2. Define the tool
final addTool = ai.defineTool(
name: 'addNumbers',
description: 'Adds two numbers together.',
inputSchema: additionInputSchema,
action: (input) async {
final a = input['a'] as num;
final b = input['b'] as num;
return {'result': a + b};
},
);
フローのオーケストレーション
フローは、構造化された入出力スキーマ、組み込みのテレメトリ、エラー処理をサポートする実行可能なパイプラインです。
import 'package:genkit/genkit.dart';
// Define the input and output schemas
final jokeRequestSchema = Schema.object({
'topic': Schema.string(description: 'The topic for the joke'),
});
final jokeResponseSchema = Schema.object({
'setup': Schema.string(),
'punchline': Schema.string(),
});
// Define the Flow
final jokeFlow = ai.defineFlow(
name: 'jokeFlow',
inputSchema: jokeRequestSchema,
outputSchema: jokeResponseSchema,
action: (input) async {
final topic = input['topic'] as String;
final response = await ai.generate(
prompt: 'Tell me a structured joke about $topic.',
responseSchema: jokeResponseSchema,
);
return response.structuredOutput!;
},
);
void main() async {
// Run the flow
final result = await jokeFlow.run({'topic': 'coding'});
print('Setup: ${result['setup']}');
print('Punchline: ${result['punchline']}');
}
ベストプラクティス
- 網羅的なスキーマ定義:LLM が正しく構造化された引数を生成できるよう、ツールとフローには常に明示的な
inputSchemaとoutputSchemaを定義します。 - 環境の分離:API キーをハードコードしないでください。環境変数または安全な認証情報ストレージを使用します。
- トレースの可観測性:開発時には Genkit のトレース可観測性を有効にし、エージェントの意思決定ツリーやツールの呼び出しを調査できるようにします。
- エラー処理:ツールの実行を標準的な
try-catchブロックで囲み、エージェントが自己修正できるよう、エラーの詳細を適切に返します。
コメント
Markdown 対応