chore: import upstream snapshot with attribution
Continuous Integration / Pre-commit Linter (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.10) (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.11) (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.12) (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.13) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.10) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.11) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.12) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.13) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.14) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.10) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.11) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.12) (push) Has been cancelled
Copybara PR Handler / close-imported-pr (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.13) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.14) (push) Has been cancelled
Continuous Integration / Pre-commit Linter (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.10) (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.11) (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.12) (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.13) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.10) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.11) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.12) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.13) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.14) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.10) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.11) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.12) (push) Has been cancelled
Copybara PR Handler / close-imported-pr (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.13) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.14) (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
# Cache Analysis Research Assistant
|
||||
|
||||
## Overview
|
||||
|
||||
This sample demonstrates ADK context caching features using a comprehensive research assistant agent designed to test both Gemini 2.0 Flash and 2.5 Flash context caching capabilities. The sample showcases the difference between explicit ADK caching and Google's built-in implicit caching.
|
||||
|
||||
### Key Features
|
||||
|
||||
- **App-Level Cache Configuration**: Context cache settings applied at the App level following ADK best practices.
|
||||
- **Large Context Instructions**: Over 4,200 tokens in system instructions to trigger context caching thresholds.
|
||||
- **Comprehensive Tool Suite**: 7 specialized research and analysis tools.
|
||||
- **Multi-Model Support**: Compatible with any Gemini model, automatically adapting the experiment type.
|
||||
- **Performance Metrics**: Detailed token usage tracking, including `cached_content_token_count`.
|
||||
|
||||
## Sample Inputs
|
||||
|
||||
- `Hello, what can you do for me?`
|
||||
|
||||
*General question that does not trigger function calls, serving as a baseline query.*
|
||||
|
||||
- `What is artificial intelligence and how does it work in modern applications?`
|
||||
|
||||
*General question exploring domain knowledge without specific tool requests.*
|
||||
|
||||
- `Use benchmark_performance with system_name='E-commerce Platform', metrics=['latency', 'throughput'], duration='standard', load_profile='realistic'.`
|
||||
|
||||
*Specific request triggering the benchmark_performance tool with explicit parameters.*
|
||||
|
||||
- `Call analyze_user_behavior_patterns with user_segment='premium_customers', time_period='last_30_days', metrics=['engagement', 'conversion'].`
|
||||
|
||||
*Specific request triggering data analysis tools with required parameters.*
|
||||
|
||||
## Graph
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
Agent[Agent: cache_analysis_assistant] --> Tool1[Tool: analyze_data_patterns]
|
||||
Agent --> Tool2[Tool: research_literature]
|
||||
Agent --> Tool3[Tool: generate_test_scenarios]
|
||||
Agent --> Tool4[Tool: benchmark_performance]
|
||||
Agent --> Tool5[Tool: optimize_system_performance]
|
||||
Agent --> Tool6[Tool: analyze_security_vulnerabilities]
|
||||
Agent --> Tool7[Tool: design_scalability_architecture]
|
||||
```
|
||||
|
||||
## How To
|
||||
|
||||
### 1. Cache Configuration
|
||||
|
||||
Context caching is configured at the App level using `ContextCacheConfig`. This ensures that the agent's extensive system instructions and tool definitions are cached for repeated invocations.
|
||||
|
||||
```python
|
||||
from google.adk.agents.context_cache_config import ContextCacheConfig
|
||||
from google.adk.apps.app import App
|
||||
|
||||
cache_analysis_app = App(
|
||||
name="cache_analysis",
|
||||
root_agent=cache_analysis_agent,
|
||||
context_cache_config=ContextCacheConfig(
|
||||
min_tokens=4096,
|
||||
ttl_seconds=600, # 10 minutes for research sessions
|
||||
cache_intervals=3, # Maximum invocations before cache refresh
|
||||
),
|
||||
)
|
||||
```
|
||||
|
||||
### 2. Run Cache Experiments
|
||||
|
||||
The `run_cache_experiments.py` script automates the execution of prompts and compares caching performance between models:
|
||||
|
||||
```bash
|
||||
# Test any Gemini model - script automatically determines experiment type
|
||||
python run_cache_experiments.py <model_name> --output results.json
|
||||
|
||||
# Examples:
|
||||
python run_cache_experiments.py gemini-2.5-flash --output gemini_2_5_results.json
|
||||
|
||||
# Run multiple iterations for averaged results
|
||||
python run_cache_experiments.py gemini-2.5-flash --repeat 3 --output averaged_results.json
|
||||
```
|
||||
|
||||
### 3. Direct Agent Usage
|
||||
|
||||
You can also run or debug the agent directly using the ADK CLI:
|
||||
|
||||
```bash
|
||||
# Run the agent directly
|
||||
adk run contributing/samples/cache_analysis/agent.py
|
||||
|
||||
# Web interface for debugging
|
||||
adk web contributing/samples/cache_analysis
|
||||
```
|
||||
|
||||
### 4. Experiment Types
|
||||
|
||||
The script automatically adapts the experiment based on the specified model name:
|
||||
|
||||
#### Models with "2.5" (e.g., `gemini-2.5-flash`)
|
||||
|
||||
- **Explicit Caching**: ADK explicit caching + Google's implicit caching.
|
||||
- **Implicit Only**: Google's built-in implicit caching alone.
|
||||
- **Measures**: The added benefit and performance differences of explicit caching over built-in implicit caching.
|
||||
|
||||
#### Other Models (e.g., `gemini-2.0-flash`)
|
||||
|
||||
- **Explicit Caching**: ADK explicit caching enabled.
|
||||
- **Uncached**: Caching completely disabled.
|
||||
- **Measures**: Baseline performance and cost benefits of context caching.
|
||||
|
||||
### 5. Expected Results
|
||||
|
||||
- **Performance Improvements**: Simple text agents typically see a 30-70% latency reduction with caching. Tool-heavy agents may experience slight cache setup overhead but still provide significant cost benefits.
|
||||
- **Cost Savings**: Up to 75% reduction in input token costs for cached content (paying only 25% of normal input cost).
|
||||
- **Token Metrics**: Successful cache hits are indicated by non-zero `cached_content_token_count` values.
|
||||
|
||||
### 6. Troubleshooting
|
||||
|
||||
#### Zero Cached Tokens
|
||||
|
||||
If `cached_content_token_count` is always `0`:
|
||||
|
||||
- Verify model names match exactly (e.g., `gemini-2.5-flash`).
|
||||
- Check that the `min_tokens` threshold (4,096 tokens) is met by the prompt and system instructions.
|
||||
- Ensure proper App-based configuration is used rather than passing standalone agents without App wrappers.
|
||||
|
||||
#### Session Errors
|
||||
|
||||
If you encounter "Session not found" errors:
|
||||
|
||||
- Verify `runner.app_name` is used for session creation.
|
||||
- Ensure correct initialization of `InMemoryRunner` with the `App` object.
|
||||
Reference in New Issue
Block a user