# ADKの便利で実践的な使い方
🧪 エージェントのテストで、本番APIを叩くわけにはいきません。ADKのEnvironment Simulation機能を使えば、ツール呼び出しをインターセプトし、制御されたレスポンスに差し替えることで、本番システムに影響を与えずにエッジケースを再現できます。
📌 タイトル:Environment Simulation
🔗 URL:
🧩 概要
ADKのEnvironment Simulatorは、エージェント実行中のツール呼び出しをインターセプトし、制御されたレスポンスに置き換えます。エージェントのコードを一切変更せずに、エラー注入、固定レスポンス、条件付き注入、確率的障害、レイテンシシミュレーションが可能です。CallbackまたはPluginとして統合でき、注入設定→モック戦略→実ツール実行の優先順位で動作します。
🛠 使い方
Callbackとしての統合例です。
`google.adk.agents` から `LlmAgent` を、` から `EnvironmentSimulationFactory` を、同パッケージの `environment_simulation_config` から `EnvironmentSimulationConfig`、`InjectedError`、`InjectionConfig`、`ToolSimulationConfig` をインポートします。`EnvironmentSimulationConfig` の `tool_simulation_configs` に `ToolSimulationConfig` のリストを渡し、各ツールに対する注入設定を定義します。例えば `tool_name="get_user_profile"` に対して `InjectionConfig` で `InjectedError(injected_http_error_code=503, error_message="Service temporarily unavailable.")` を設定すると、503エラーが注入されます。作成した `config` を `EnvironmentSimulationFactory.create_callback(config)` でコールバックに変換し、`LlmAgent` の `before_tool_callback` パラメータに渡します。
固定レスポンスの注入:
`InjectionConfig` の `injected_response` パラメータに辞書(例: `{"status": "ok", "order_id": "ORD-9999"}`)を渡すことで、ツール呼び出しに対して固定のレスポンスを返すことができます。
引数に基づく条件付き注入:
`InjectionConfig` の `match_args` パラメータに引数パターン(例: `{"item_id": "ITEM-404"}`)を指定すると、ツール呼び出しの引数が一致した場合のみ注入が発動します。`injected_error` に `InjectedError(injected_http_error_code=404, error_message="Item not found.")` を設定すれば、特定の引数でのみ404エラーを返すことができます。
確率的な障害シミュレーション:
`InjectionConfig` の `injection_probability` に確率値(例: `0.3` で30%)を設定し、`random_seed`(例: `42`)で再現性を確保します。`injected_error` に `InjectedError(injected_http_error_code=500, error_message="Internal server error.")` を指定すると、指定確率でランダムに500エラーが発生します。
レイテンシのシミュレーション:
`InjectionConfig` の `injected_latency_seconds` に遅延秒数(例: `5.0`)を設定し、`injected_response` にレスポンス(例: `{"result": "slow but successful"}`)を指定すると、指定秒数の遅延後にレスポンスが返されます。
Mock Strategyモードでは、ツールスキーマから自動的にレスポンスを生成します。
`environment_simulation_config` から `MockStrategy` をインポートし、`ToolSimulationConfig` の `mock_strategy_type` に `MockStrategy.MOCK_STRATEGY_TOOL_SPEC` を設定します。これにより、`tool_name`(例: `"create_order"`)で指定したツールのスキーマから自動的にレスポンスが生成されます。
🏗 実践的な使い方
**API障害時のエージェント回復力テスト**: 503エラーや500エラーを注入して、エージェントがリトライやフォールバックを適切に行うかを検証します。本番システムに影響を与えることなく、障害シナリオを再現できます。
**条件付き注入によるエッジケーステスト**: `match_args`を使って特定の引数パターンでのみエラーを発生させます。例えば「存在しない商品ID」「在庫切れの商品」など、特定条件下でのエージェントの振る舞いをピンポイントでテストできます。
**確率的障害でのリアルなテスト**: `injection_probability`を使って30%の確率でエラーを発生させ、不安定なAPIとのやり取りをシミュレートします。`random_seed`を固定すれば再現性のあるテストになります。
**環境データの提供によるリアルなモック生成**: `environment_data`にDBスナップショットなどのコンテキストを渡すと、Mock Strategyがよりリアルなレスポンスを生成します。
DBスナップショットなどのコンテキストデータ(例: 商品リストの辞書)を `json.dumps()` でJSON文字列に変換し、`EnvironmentSimulationConfig` の `environment_data` パラメータに渡します。Mock Strategyはこの環境データを参照して、よりリアルなレスポンスを生成します。
**注入とモック戦略の組み合わせ**: 特定の条件ではエラーを注入し、それ以外はMock Strategyで自動生成するという組み合わせが可能です。注入設定が先に評価され、マッチしなければモック戦略にフォールバックします。
💡 ユースケース
🔧 外部API障害時のエージェント回復力の検証
🎯 特定条件下でのエッジケース再現テスト
📉 不安定なAPIとのやり取りの確率的シミュレーション
⏱ レイテンシの高いAPIでのタイムアウト処理の検証
⚠️ 注意点
- `injected_latency_seconds`の上限は120秒です。
- `InjectionConfig`はエラーとレスポンスのどちらか一方のみ指定可能で、両方同時には設定できません。
- `tool_name`は登録されたツール名と完全一致する必要があります。タイポに注意してください。
- Mock Strategyはツールスキーマに依存するため、スキーマが不十分だと生成されるレスポンスの質が下がります。
✨ Environment Simulationは、本番環境を汚さずにエッジケースを再現できる強力なテスト基盤です。エラー注入と条件付きモックを組み合わせて、あらゆる障害シナリオに対するエージェントの耐性を検証しましょう!
#
ADK# #
AIAgent#