# ADKの便利で実践的な使い方
## 🏢 アプリケーション単位で状態を分離!ADKのApps機能
複数のエージェントワークフローを管理するとき、状態やアーティファクトが混ざってしまう…ADKの **Apps** を使えば、`app_name` によるネームスペースでState/Artifact/Memoryを完全に分離できます!🏗️
## 📌 タイトル
Apps(アプリケーション)
## 🔗 URL
## 🧩 概要
App クラスは、ADKエージェントワークフローのトップレベルコンテナです。ルートエージェントを中心に、ライフサイクル管理、共有リソースの一元設定、状態スコープの定義を担います。
主な役割:
- **一元設定**:APIキーやDBクライアントなどの共有リソースを一箇所で管理
- **ライフサイクル管理**:スタートアップ/シャットダウンフック
- **状態スコープ**:`app:*` プレフィックスで明示的なデータ境界
- **デプロイ単位**:バージョニングとテストの正式な単位
さらに、Context Caching、Context Compaction、Resumability、Pluginsの設定もAppレベルで行えます。
## 🛠 使い方
`google.adk.agents.llm_agent` から `Agent`、`google.adk.apps` から `App`、`google.adk.runners` から `InMemoryRunner` をインポートします。`Agent` を `model='gemini-flash-latest'`、`name='assistant'`、`description='汎用アシスタント'` で作成します。次に `App` を `name="my_app"` で作成し、`root_agent` を渡します。オプションで `plugins`、`context_cache_config`、`events_compaction_config`、`resumability_config` も指定可能です。最後に `InMemoryRunner(app=app)` でランナーを作成し、`await "こんにちは!")` で実行します。
## 🏗 実践的な使い方
**マルチテナントSaaSでのデータ分離:**
`app_name` をテナントごとに変えることで、State/Artifact/Memoryの完全な分離を実現できます。
`create_tenant_app(tenant_id: str, root_agent: Agent) -> App` 関数を定義し、テナントごとに独立した `App` を作成します。`name=f"saas_{tenant_id}"` でテナント固有のネームスペースを設定し、`plugins` に全テナント共通の `SecurityGuardPlugin()` とテナント別の `TenantLoggingPlugin(tenant_id)` を渡します。テナントAでは `create_tenant_app("tenant_a", support_agent)` で App を作成し `InMemoryRunner` で実行すると、State は `"app:saas_tenant_a:*"` に保存されテナントBからは見えません。テナントBも同様に `"app:saas_tenant_b:*"` に保存され、テナントAからは見えません。
**環境別の設定分離:**
開発環境では `App` を `name="myservice_dev"` で作成し、`plugins` に `DebugLoggingPlugin()` を、`events_compaction_config` に `EventsCompactionConfig(compaction_interval=10, overlap_size=3)` を設定します。本番環境では `name="myservice_prod"` で作成し、`plugins` に `SecurityGuardPlugin()`、`BigQueryAnalyticsPlugin()`、`RateLimitPlugin()` を設定し、`events_compaction_config` は `EventsCompactionConfig(compaction_interval=5, overlap_size=2)` とより頻繁なコンパクションを行います。
## 💡 ユースケース
- 🏢 **マルチテナントSaaS**:テナントごとにAppを分離し、データの混在を完全防止
- 🔧 **環境分離**:dev/staging/prodで異なるプラグインと設定を適用
- 📦 **マイクロサービス**:サービスごとに独立したAppとしてデプロイ・バージョニング
- 🧪 **A/Bテスト**:同じエージェントを異なるApp設定で実行し、効果を比較
- 🔄 **ライフサイクル管理**:DB接続プールやキャッシュの初期化/クリーンアップを一元管理
## ⚠️ 注意点
- `app_name` はState/Artifact/Memoryのネームスペースに使われるため、一意で変更しないようにしてください
- App名を変更すると、過去のStateやArtifactにアクセスできなくなります
- 複数のAppが同じルートエージェントを共有する場合、エージェントのステートレス性を確保してください
- PluginsはAppレベルで設定するため、テナント共通とテナント固有のプラグインを適切に分離しましょう
## ✨ まとめ
Appクラスは、ADKエージェントのデプロイと運用における「境界」を明確にする仕組みです。マルチテナント分離、環境別設定、ライフサイクル管理…Appを適切に設計することで、スケーラブルで安全なエージェントアプリケーションを構築できます!
#
ADK# #
AIAgent#