You've already forked adk-python
mirror of
https://github.com/encounter/adk-python.git
synced 2026-03-30 10:57:20 -07:00
215 lines
6.1 KiB
Markdown
215 lines
6.1 KiB
Markdown
|
|
# Runner Debug Helper Example
|
||
|
|
|
||
|
|
This example demonstrates the `run_debug()` helper method that simplifies agent interaction for debugging and experimentation in ADK.
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
The `run_debug()` method reduces agent interaction boilerplate from 7-8 lines to just 2 lines, making it ideal for:
|
||
|
|
|
||
|
|
- Quick debugging sessions
|
||
|
|
- Jupyter notebooks
|
||
|
|
- REPL experimentation
|
||
|
|
- Writing examples
|
||
|
|
- Initial agent development
|
||
|
|
|
||
|
|
## Files Included
|
||
|
|
|
||
|
|
- `agent.py` - Agent with 2 tools: weather and calculate
|
||
|
|
- `main.py` - 8 examples demonstrating all features
|
||
|
|
- `README.md` - This documentation
|
||
|
|
|
||
|
|
## Setup
|
||
|
|
|
||
|
|
### Prerequisites
|
||
|
|
|
||
|
|
Set your Google API key:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
export GOOGLE_API_KEY="your-api-key"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Running the Example
|
||
|
|
|
||
|
|
```bash
|
||
|
|
python -m contributing.samples.runner_debug_example.main
|
||
|
|
```
|
||
|
|
|
||
|
|
## Features Demonstrated
|
||
|
|
|
||
|
|
1. **Minimal Usage**: Simple 2-line agent interaction
|
||
|
|
2. **Multiple Messages**: Processing multiple messages in sequence
|
||
|
|
3. **Session Persistence**: Maintaining conversation context
|
||
|
|
4. **Separate Sessions**: Managing multiple user sessions
|
||
|
|
5. **Tool Calls**: Displaying tool invocations and results
|
||
|
|
6. **Event Capture**: Collecting events for programmatic inspection
|
||
|
|
7. **Advanced Configuration**: Using RunConfig for custom settings
|
||
|
|
8. **Comparison**: Before/after boilerplate reduction
|
||
|
|
|
||
|
|
## Part Types Supported
|
||
|
|
|
||
|
|
The `run_debug()` method properly displays all ADK part types:
|
||
|
|
|
||
|
|
| Part Type | Display Format | Use Case |
|
||
|
|
|-----------|---------------|----------|
|
||
|
|
| `text` | `agent > {text}` | Regular text responses |
|
||
|
|
| `function_call` | `agent > [Calling tool: {name}({args})]` | Tool invocations |
|
||
|
|
| `function_response` | `agent > [Tool result: {response}]` | Tool results |
|
||
|
|
| `executable_code` | `agent > [Executing {language} code...]` | Code blocks |
|
||
|
|
| `code_execution_result` | `agent > [Code output: {output}]` | Code execution results |
|
||
|
|
| `inline_data` | `agent > [Inline data: {mime_type}]` | Images, files, etc. |
|
||
|
|
| `file_data` | `agent > [File: {uri}]` | File references |
|
||
|
|
|
||
|
|
## Tools Available in Example
|
||
|
|
|
||
|
|
The example agent includes 2 tools to demonstrate tool handling:
|
||
|
|
|
||
|
|
1. **`get_weather(city)`** - Returns mock weather data for major cities
|
||
|
|
2. **`calculate(expression)`** - Evaluates mathematical expressions safely
|
||
|
|
|
||
|
|
## Key Benefits
|
||
|
|
|
||
|
|
### Before (7-8 lines)
|
||
|
|
|
||
|
|
```python
|
||
|
|
from google.adk.sessions import InMemorySessionService
|
||
|
|
from google.genai import types
|
||
|
|
|
||
|
|
APP_NAME = "default"
|
||
|
|
USER_ID = "default"
|
||
|
|
session_service = InMemorySessionService()
|
||
|
|
runner = Runner(agent=agent, app_name=APP_NAME, session_service=session_service)
|
||
|
|
session = await session_service.create_session(
|
||
|
|
app_name=APP_NAME, user_id=USER_ID, session_id="default"
|
||
|
|
)
|
||
|
|
content = types.Content(role="user", parts=[types.Part.from_text("Hi")])
|
||
|
|
async for event in runner.run_async(
|
||
|
|
user_id=USER_ID, session_id=session.id, new_message=content
|
||
|
|
):
|
||
|
|
if event.content and event.content.parts:
|
||
|
|
print(event.content.parts[0].text)
|
||
|
|
```
|
||
|
|
|
||
|
|
### After (2 lines)
|
||
|
|
|
||
|
|
```python
|
||
|
|
runner = InMemoryRunner(agent=agent)
|
||
|
|
await runner.run_debug("Hi")
|
||
|
|
```
|
||
|
|
|
||
|
|
## API Reference
|
||
|
|
|
||
|
|
```python
|
||
|
|
async def run_debug(
|
||
|
|
self,
|
||
|
|
user_messages: str | list[str],
|
||
|
|
*,
|
||
|
|
user_id: str = 'debug_user_id',
|
||
|
|
session_id: str = 'debug_session_id',
|
||
|
|
run_config: Optional[RunConfig] = None,
|
||
|
|
quiet: bool = False,
|
||
|
|
verbose: bool = False,
|
||
|
|
) -> List[Event]:
|
||
|
|
```
|
||
|
|
|
||
|
|
### Parameters
|
||
|
|
|
||
|
|
- `user_messages`: Single message string or list of messages (required)
|
||
|
|
- `user_id`: User identifier for session tracking (default: 'debug_user_id')
|
||
|
|
- `session_id`: Session identifier for conversation continuity (default: 'debug_session_id')
|
||
|
|
- `run_config`: Optional advanced configuration
|
||
|
|
- `quiet`: Whether to suppress output to console (default: False)
|
||
|
|
- `verbose`: Whether to show detailed tool calls and responses (default: False)
|
||
|
|
|
||
|
|
### Usage Examples
|
||
|
|
|
||
|
|
```python
|
||
|
|
# Minimal usage
|
||
|
|
runner = InMemoryRunner(agent=agent)
|
||
|
|
await runner.run_debug("What's the weather?")
|
||
|
|
|
||
|
|
# Multiple queries
|
||
|
|
await runner.run_debug(["Query 1", "Query 2", "Query 3"])
|
||
|
|
|
||
|
|
# Custom session
|
||
|
|
await runner.run_debug(
|
||
|
|
"Hello",
|
||
|
|
user_id="alice",
|
||
|
|
session_id="debug_session"
|
||
|
|
)
|
||
|
|
|
||
|
|
# Capture events without printing
|
||
|
|
events = await runner.run_debug(
|
||
|
|
"Process this",
|
||
|
|
quiet=True
|
||
|
|
)
|
||
|
|
|
||
|
|
# Show tool calls with verbose mode
|
||
|
|
await runner.run_debug(
|
||
|
|
"What's the weather?",
|
||
|
|
verbose=True # Shows [Calling tool: ...] and [Tool result: ...]
|
||
|
|
)
|
||
|
|
|
||
|
|
# With custom configuration
|
||
|
|
from google.adk.agents.run_config import RunConfig
|
||
|
|
config = RunConfig(support_cfc=False)
|
||
|
|
await runner.run_debug("Query", run_config=config)
|
||
|
|
```
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### Common Issues and Solutions
|
||
|
|
|
||
|
|
1. **Tool calls not showing in output**
|
||
|
|
- **Issue**: Tool invocations and responses are not displayed
|
||
|
|
- **Solution**: Set `verbose=True` to see detailed tool interactions:
|
||
|
|
|
||
|
|
```python
|
||
|
|
await runner.run_debug("Query", verbose=True)
|
||
|
|
```
|
||
|
|
|
||
|
|
2. **Import errors when running tests**
|
||
|
|
- **Issue**: `ModuleNotFoundError: No module named 'google.adk'`
|
||
|
|
- **Solution**: Ensure you're using the virtual environment:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
source .venv/bin/activate
|
||
|
|
python -m pytest tests/
|
||
|
|
```
|
||
|
|
|
||
|
|
3. **Session state not persisting between calls**
|
||
|
|
- **Issue**: Agent doesn't remember previous interactions
|
||
|
|
- **Solution**: Use the same `user_id` and `session_id` across calls:
|
||
|
|
|
||
|
|
```python
|
||
|
|
await runner.run_debug("First query", user_id="alice", session_id="debug")
|
||
|
|
await runner.run_debug("Follow-up", user_id="alice", session_id="debug")
|
||
|
|
```
|
||
|
|
|
||
|
|
4. **Output truncation issues**
|
||
|
|
- **Issue**: Long tool responses are truncated with "..."
|
||
|
|
- **Solution**: This is by design to keep debug output readable. For full responses, use:
|
||
|
|
|
||
|
|
```python
|
||
|
|
events = await runner.run_debug("Query", quiet=True)
|
||
|
|
# Process events programmatically for full content
|
||
|
|
```
|
||
|
|
|
||
|
|
5. **API key errors**
|
||
|
|
- **Issue**: Authentication failures or missing API key
|
||
|
|
- **Solution**: Ensure your Google API key is set:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
export GOOGLE_API_KEY="your-api-key"
|
||
|
|
```
|
||
|
|
|
||
|
|
## Important Notes
|
||
|
|
|
||
|
|
`run_debug()` is designed for debugging and experimentation only. For production use requiring:
|
||
|
|
|
||
|
|
- Custom session/memory services (Spanner, Cloud SQL)
|
||
|
|
- Fine-grained event processing
|
||
|
|
- Error recovery and resumability
|
||
|
|
- Performance optimization
|
||
|
|
|
||
|
|
Use the standard `run_async()` method instead.
|