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,155 @@
|
||||
# Interactions API Sample Agent
|
||||
|
||||
This sample agent demonstrates the Interactions API integration in ADK. The
|
||||
Interactions API provides stateful conversation capabilities, allowing chained
|
||||
interactions using `previous_interaction_id` instead of sending full
|
||||
conversation history.
|
||||
|
||||
## Features Tested
|
||||
|
||||
1. **Basic Text Generation** - Simple conversation without tools
|
||||
1. **Google Search Tool** - Web search using `GoogleSearchTool` with
|
||||
`bypass_multi_tools_limit=True`
|
||||
1. **Multi-Turn Conversations** - Stateful interactions with context retention
|
||||
via `previous_interaction_id`
|
||||
1. **Custom Function Tool** - Weather lookup using `get_current_weather`
|
||||
|
||||
## Important: Tool Compatibility
|
||||
|
||||
The Interactions API does **NOT** support mixing custom function calling tools
|
||||
with built-in tools (like `google_search`) in the same agent. To work around
|
||||
this limitation:
|
||||
|
||||
```python
|
||||
# Use bypass_multi_tools_limit=True to convert google_search to a function tool
|
||||
GoogleSearchTool(bypass_multi_tools_limit=True)
|
||||
```
|
||||
|
||||
This converts the built-in `google_search` to a function calling tool (via
|
||||
`GoogleSearchAgentTool`), which allows it to work alongside custom function
|
||||
tools.
|
||||
|
||||
## How to Run
|
||||
|
||||
### Prerequisites
|
||||
|
||||
```bash
|
||||
# From the adk-python root directory
|
||||
uv sync --all-extras
|
||||
source .venv/bin/activate
|
||||
|
||||
# Set up authentication (choose one):
|
||||
# Option 1: Using Google Cloud credentials
|
||||
export GOOGLE_CLOUD_PROJECT=your-project-id
|
||||
|
||||
# Option 2: Using API Key
|
||||
export GOOGLE_API_KEY=your-api-key
|
||||
```
|
||||
|
||||
### Running Tests
|
||||
|
||||
```bash
|
||||
cd contributing/samples
|
||||
|
||||
# Run automated tests with Interactions API
|
||||
python -m interactions_api.main
|
||||
```
|
||||
|
||||
## Key Differences: Interactions API vs Standard API
|
||||
|
||||
### Interactions API (`use_interactions_api=True`)
|
||||
|
||||
- Uses stateful interactions via `previous_interaction_id`
|
||||
- Only sends current turn contents when chaining interactions
|
||||
- Returns `interaction_id` in responses for chaining
|
||||
- Ideal for long conversations with many turns
|
||||
- Context caching is not used (state maintained via interaction chaining)
|
||||
|
||||
### Standard API (`use_interactions_api=False`)
|
||||
|
||||
- Uses stateless `generate_content` calls
|
||||
- Sends full conversation history with each request
|
||||
- No interaction IDs in responses
|
||||
- Context caching can be used
|
||||
|
||||
## Code Structure
|
||||
|
||||
```
|
||||
interactions_api/
|
||||
├── __init__.py # Package initialization
|
||||
├── agent.py # Agent definition with Interactions API
|
||||
├── main.py # Test runner
|
||||
├── test_interactions_curl.sh # cURL-based API tests
|
||||
├── test_interactions_direct.py # Direct API tests
|
||||
└── README.md # This file
|
||||
```
|
||||
|
||||
## Agent Configuration
|
||||
|
||||
```python
|
||||
from google.adk.agents.llm_agent import Agent
|
||||
from google.adk.models.google_llm import Gemini
|
||||
from google.adk.tools.google_search_tool import GoogleSearchTool
|
||||
|
||||
root_agent = Agent(
|
||||
model=Gemini(
|
||||
model="gemini-2.5-flash",
|
||||
use_interactions_api=True, # Enable Interactions API
|
||||
),
|
||||
name="interactions_test_agent",
|
||||
tools=[
|
||||
GoogleSearchTool(bypass_multi_tools_limit=True), # Converted to function tool
|
||||
get_current_weather, # Custom function tool
|
||||
],
|
||||
)
|
||||
```
|
||||
|
||||
## Example Output
|
||||
|
||||
```
|
||||
============================================================
|
||||
TEST 1: Basic Text Generation
|
||||
============================================================
|
||||
|
||||
>> User: Hello! What can you help me with?
|
||||
<< Agent: Hello! I can help you with: 1) Search the web...
|
||||
[Interaction ID: v1_abc123...]
|
||||
PASSED: Basic text generation works
|
||||
|
||||
============================================================
|
||||
TEST 2: Function Calling (Google Search Tool)
|
||||
============================================================
|
||||
|
||||
>> User: Search for the capital of France.
|
||||
[Tool Call] google_search_agent({'request': 'capital of France'})
|
||||
[Tool Result] google_search_agent: {'result': 'The capital of France is Paris...'}
|
||||
<< Agent: The capital of France is Paris.
|
||||
[Interaction ID: v1_def456...]
|
||||
PASSED: Google search tool works
|
||||
|
||||
============================================================
|
||||
TEST 3: Multi-Turn Conversation (Stateful)
|
||||
============================================================
|
||||
|
||||
>> User: Remember the number 42.
|
||||
<< Agent: I'll remember that number - 42.
|
||||
[Interaction ID: v1_ghi789...]
|
||||
|
||||
>> User: What number did I ask you to remember?
|
||||
<< Agent: You asked me to remember the number 42.
|
||||
[Interaction ID: v1_jkl012...]
|
||||
PASSED: Multi-turn conversation works with context retention
|
||||
|
||||
============================================================
|
||||
TEST 5: Custom Function Tool (get_current_weather)
|
||||
============================================================
|
||||
|
||||
>> User: What's the weather like in Tokyo?
|
||||
[Tool Call] get_current_weather({'city': 'Tokyo'})
|
||||
[Tool Result] get_current_weather: {'city': 'Tokyo', 'temperature_f': 68, ...}
|
||||
<< Agent: The weather in Tokyo is 68F and Partly Cloudy.
|
||||
[Interaction ID: v1_mno345...]
|
||||
PASSED: Custom function tool works with bypass_multi_tools_limit
|
||||
|
||||
ALL TESTS PASSED (Interactions API)
|
||||
```
|
||||
Reference in New Issue
Block a user