🤖 なぜ今ADK for Kotlinなのか
AIエコシステムはクラウド中心からエッジ(Edge)へ急速にシフトしています。特にGoogleがGemini NanoをAndroidに搭載して以来、1億4000万台以上のデバイスでオンデバイスAIが可能になりました。
しかし、「クラウド+オンデバイス」ハイブリッドエージェントの構築は想像以上に困難です。状態管理、コンテキスト受け渡し、エラーハンドリング、モデル間のオーケストレーション…これらをすべて自前で実装しようとすると、プロジェクトが迷走します。
ADK(Agent Development Kit) は、この複雑なオーケストレーションをフレームワークレベルで処理してくれるオープンソースツールです。既にJava、Go、Python 2.0ベータが提供されていましたが、今回Kotlin 0.1.0とAndroid専用ライブラリが追加されました。
💡 ポイント: ADKは単なるLLM呼び出しラッパーではありません。マルチエージェント間の協調、ツール定義、オンデバイス/クラウドモデルの自動ルーティングをサポートする本格的なエージェントフレームワークです。
🧩 ADK for Android:アプリ内にAIエージェントを組み込む
ADK for Androidは、Androidアプリ内部で直接AIエージェントを実行できるよう設計されています。特にML Kit GenAI APIと**Gemini Nano(オンデバイス)**をデフォルトモデルとしてサポートします。
依存関係の追加
// build.gradle.kts (Module: app)
implementation("com.google.adk:google-adk-kotlin-core-android:0.1.0")
基本的なエージェント生成例
val orchestrator = LlmAgent(
name = "genius_orchestrator",
model = Gemini(apiKey = apiKey, name = MODEL_NAME),
instruction = Instruction("""
あなたは旅行の専門アシスタントです。
まず`get_trip_details`を呼び出して旅程全体を把握してください。
その後、旅程の状態に合わせたウェルカムメッセージを生成してください。
""".trimIndent()),
tools = listOf(GetTripDetailsTool(tripId)),
subAgents = listOf(carRentalPipeline, hotelPipeline),
disallowTransferToPeers = true,
disallowTransferToParent = true
)
解説:
model:使用するLLMを指定(Geminiクラウド、またはオンデバイスNano)instruction:エージェントの役割と行動ルールを自然言語で定義tools:エージェントが使用できる外部関数/APIsubAgents:サブエージェントへのタスク委譲が可能
🔧 @ToolアノテーションでLLMに機能を付与する
ADK for Kotlinの最も強力な機能の1つは、@ToolアノテーションによってLLMが呼び出せる関数を簡単に定義できる点です。KSP(コンパイル時プロセッシング)で自動生成されます。
build.gradle.ktsの設定
dependencies {
implementation("com.google.adk:google-adk-kotlin-core:0.1.0")
ksp("com.google.adk:google-adk-kotlin-processor:0.1.0")
}
ツールサービスの定義
class ImprobabilityDriveService {
/**
* 特定の事象の「不可能性(improbability)」を計算します。
*/
@Tool
fun calculateImprobability(
@Param("不可能性を計算する事象の説明。例:'コップ1杯のお茶が空中に現れること'")
event: String
): String {
return "'$event'の不可能性は約42:1です。"
}
}
Tips:
@ParamのdescriptionはLLMに関数の用途を説明する重要なヒントになります。実サービスでは日本語よりも英語の方がモデル性能に有利な場合があります。
サブエージェントとメインエージェントの接続
// サブエージェント:宇宙船コンピュータ
val heartOfGoldAgent = LlmAgent(
name = "HeartOfGold",
description = "Heart of Gold宇宙船コンピュータ。不可能性ドライブのクエリを処理します。",
model = Gemini(apiKey = apiKey, name = "gemini-2.5-flash"),
instruction = Instruction("""
あなたはHeart of Goldの船内コンピュータです。
明るく親切な性格で、少々うっとうしいかもしれません。
無限不可能性ドライブにアクセスできます。
""".trimIndent()),
tools = ImprobabilityDriveService().generatedTools()
)
// メインエージェント:ミッションコントロール
val rootAgent = LlmAgent(
name = "MissionControl",
description = "宇宙クエリのための中央ルーター。HeartOfGoldにルーティングします。",
subAgents = listOf(heartOfGoldAgent),
model = Gemini(apiKey = apiKey, name = "gemini-2.5-flash"),
instruction = Instruction("""
あなたはミッションコントロールです。すべての通信の中央ハブです。
ユーザーの質問を最も適切なエージェントにルーティングすることが主な業務です。
- 質問が不可能性、無限不可能性ドライブ、Heart of Goldに関するものであれば`HeartOfGold`に転送してください。
- それ以外の場合は、プロフェッショナルながらやや緊張した態度で直接応答してください。
""".trimIndent())
)
この例では、ユーザーが「お茶が空中に現れる確率は?」と尋ねると、MissionControlがHeartOfGoldにタスクを委譲し、HeartOfGoldがcalculateImprobability関数を呼び出して結果を返します。
⚠️ 注意点と制限事項
- 0.1.0は実験的バージョンです。 プロダクションに即適用するよりも、PoC(概念実証)レベルで取り組むことをお勧めします。
- オンデバイスモデルの性能差: Gemini Nanoはクラウドモデルよりも推論能力が限定的です。複雑な推論が必要なタスクはクラウドモデルにフォールバックする戦略が必要です。
- KSPへの依存:
@Tool機能を使用するにはKSPプラグインが必須です。コンパイル時にコードが生成されるため、ビルド時間が若干増加する可能性があります。 - プライバシーと機能のトレードオフ: オンデバイス処理はプライバシーに有利ですが、モデルの知識範囲が限定されます。機密性の低いタスクはクラウドに送るハイブリッド設計が現実的です。
🇯🇵 日本市場における適用コンテキスト
日本のAndroidアプリ市場でAIエージェントを導入する際、以下のシナリオが考えられます。
- 金融アプリ: ユーザーの取引履歴をオンデバイスで分析し、機密情報をサーバーに送信せずにパーソナライズされた財務アドバイスを提供
- ショッピングアプリ: 商品検索時にオンデバイスでユーザーの嗜好を分析し、価格比較などの重い処理はクラウドエージェントが担当
- ヘルスケア: 健康データをデバイス内でのみ処理し、GDPR/個人情報保護法に対応
参考: 日本のフィンテック/ヘルスケア領域では データローカライゼーション の問題が特に重要です。ADKのオンデバイスアーキテクチャは、こうした規制要件を自然に満たせる強力な武器になります。
🚀 次のステップとしての学習方向
- 公式GitHubリポジトリからデモアプリをクローンし、実際にビルドしてみる
- 簡単なTODOアプリにADKを組み込み、音声コマンドでタスクを追加/編集するエージェントを作成
@Toolを活用して外部API(天気、ニュース、カレンダー)と連携する複合エージェントを実装- オンデバイスモデル(Gemini Nano)とクラウドモデル間の 自動ルーティングロジック をカスタマイズする方法を学ぶ
参考資料: 本記事はGoogle公式開発者ブログの ADK for Kotlin & Android発表記事 を基に、日本の開発者向けに再構成しています。
合わせて読みたい記事
- CSSで完璧な円グラフを作成する:セマンティクスとアクセシビリティを考慮した実践ガイド
- Holotron-12B:H Companyの新しいコンピュータ使用AIモデル、NVIDIA Nemotronベースで推論効率2倍向上

// build.gradle.kts (Module: app)
implementation("com.google.adk:google-adk-kotlin-core-android:0.1.0")
// 基本的なエージェント生成
val orchestrator = LlmAgent(
name = "genius_orchestrator",
model = Gemini(apiKey = apiKey, name = MODEL_NAME),
instruction = Instruction("""
あなたは旅行の専門アシスタントです。
まず`get_trip_details`を呼び出して旅程全体を把握してください。
その後、旅程の状態に合わせたウェルカムメッセージを生成してください。
""".trimIndent()),
tools = listOf(GetTripDetailsTool(tripId)),
subAgents = listOf(carRentalPipeline, hotelPipeline),
disallowTransferToPeers = true,
disallowTransferToParent = true
)

🧠 ADKのコアアーキテクチャ:クラウド-エッジオーケストレーション
ADKが特別な理由は、オーケストレーター(Orchestrator)パターンをフレームワークレベルで内蔵している点です。I/Oセッションでデモされた旅行アシスタントアプリを例に説明します。
- ユーザーが旅行中に問題に遭遇すると、クラウドオーケストレーターがユーザーと対話し問題を把握
- 予約確認が必要な場合、オンデバイスサブエージェントにタスクを委譲
- サブエージェントは**Gemini Nano(オンデバイス)**を使用して、ユーザーのローカルドキュメントからデータを抽出
- 検証エージェントが複数の分析結果を比較し、最終応答を生成
このプロセス全体で機密性の高い個人データは決してデバイスの外に出ません。
ADK 0.1.0が提供する機能
| 機能領域 | 詳細項目 |
|---|---|
| エージェント | LlmAgent生成、サブエージェント委譲、ツールバインディング |
| ツールと統合 | @Toolアノテーション、KSPコード生成、ML Kit GenAI API |
| ランタイムと観測可能性 | エージェント実行制御、コンテキスト管理、エラーハンドリング |
| 開発者体験 | Kotlin DSL、Android Studio互換、Gradle依存関係 |
| Androidモデル | Gemini Nano(オンデバイス)、Geminiクラウド、ML Kit |
🧪 実践Tips:@Tool設計時の注意点
- 関数名は動詞+名詞形式で明確に:
calculateImprobability(○)、doStuff(×) - パラメータ説明はLLMが理解できるよう十分詳細に:
@Param("不可能性を計算する事象の説明。例:'コップ1杯のお茶が空中に現れること'") - 戻り値は文字列に統一: LLMがパースしやすいようJSON文字列を返すのも良い方法です
- 冪等性(Idempotency)を考慮: 同じ入力に対して同じ結果を返すよう設計することで、LLMの予測可能性が高まります

✨ まとめ:今すぐ始めるべき理由
ADK for Kotlin/Androidはまだ0.1.0アルファ版ですが、AIエージェントをモバイルアプリに統合するパラダイムを変える可能性を秘めています。
- プライバシー: オンデバイス処理によるデータ保護
- パフォーマンス: クラウド往復時間の排除(レイテンシー低減)
- コスト: クラウドAPI呼び出し回数の最小化
- オフラインサポート: ネットワークなしでも基本的なエージェント動作が可能
今すぐGitHubからプロジェクトをクローンし、簡単なPoCから始めてみてください。半年後には、この技術がAndroidアプリ開発の標準になっているかもしれません。
参考: 本記事は Google Developers Blog - ADK for Kotlin & Android: Building AI agents を基に、日本の開発者視点で再解釈しました。