daytona-adk
Google ADK plugin for secure code execution in Daytona sandboxed environments. This plugin enables ADK agents to execute Python, JavaScript, and TypeScript code, run shell commands, upload scripts and datasets, and read outputs from files in isolated sandboxes.
Installation
pip install daytona-adk
Configuration
You must configure credentials for both Daytona (sandbox infrastructure) and Google Gemini (the LLM model used by ADK agents).
Daytona API Key
Get your API key from Daytona Dashboard.
You can configure it in one of three ways:
-
Set the
DAYTONA_API_KEYenvironment variable:export DAYTONA_API_KEY="your-daytona-api-key"
-
Add it to a
.envfile in your project root:DAYTONA_API_KEY=your-daytona-api-key
-
Pass the API key directly when instantiating
DaytonaPlugin:from daytona_adk import DaytonaPlugin plugin = DaytonaPlugin(api_key="your-daytona-api-key")
Google API Key (for Gemini LLM)
Get your API key from Google AI Studio.
This key is required to access Google's Gemini models (e.g., gemini-2.0-flash, gemini-1.5-pro).
You need to set it as an environment variable:
export GOOGLE_API_KEY="your-google-api-key"
Or add it to your .env file:
GOOGLE_API_KEY=your-google-api-key
Quick Start
import asyncio
from google.adk.agents import Agent
from google.adk.runners import InMemoryRunner
from daytona_adk import DaytonaPlugin
async def main():
# Create the Daytona plugin
plugin = DaytonaPlugin()
# Create an agent with Daytona tools
agent = Agent(
model="gemini-2.0-flash",
name="agent_with_sandbox",
tools=plugin.get_tools(),
)
# Run with InMemoryRunner
async with InMemoryRunner(
app_name="my_app",
agent=agent,
plugins=[plugin],
) as runner:
response = await runner.run_debug(
"Execute this Python code: print('Hello from Daytona!')"
)
print(response)
if __name__ == "__main__":
asyncio.run(main())
Usage Patterns
Using with App (Recommended)
from google.adk.agents import Agent
from google.adk.apps import App
from google.adk.runners import InMemoryRunner
from daytona_adk import DaytonaPlugin
plugin = DaytonaPlugin()
agent = Agent(
model="gemini-2.0-flash",
name="agent_with_sandbox",
tools=plugin.get_tools(),
)
app = App(
name="my_app",
root_agent=agent,
plugins=[plugin],
)
async with InMemoryRunner(app=app) as runner:
response = await runner.run_debug("Execute Python: print('Hello!')")
Using with Runner Directly
from google.adk.agents import Agent
from google.adk.runners import InMemoryRunner
from daytona_adk import DaytonaPlugin
plugin = DaytonaPlugin()
agent = Agent(
model="gemini-2.0-flash",
name="agent_with_sandbox",
tools=plugin.get_tools(),
)
async with InMemoryRunner(
app_name="my_app",
agent=agent,
plugins=[plugin],
) as runner:
response = await runner.run_debug("Run command: echo 'Hello!'")
Available Tools
The plugin provides the following tools to ADK agents:
| Tool | Description |
|---|---|
execute_code_in_daytona |
Execute Python, JavaScript, or TypeScript code |
execute_command_in_daytona |
Run shell commands |
upload_file_to_daytona |
Upload scripts or data files to the sandbox |
read_file_from_daytona |
Read script outputs or generated files |
start_long_running_command_daytona |
Start background processes (servers, watchers) |
Tool Parameters
execute_code_in_daytona
code(required): The code snippet to executelanguage(required): Programming language -python(default),javascript, ortypescriptenv: Environment variables as key-value pairsargv: Command line argumentstimeout: Timeout in seconds
execute_command_in_daytona
command(required): The shell command to executecwd: Working directoryenv: Environment variablestimeout: Timeout in seconds
upload_file_to_daytona
file_path(required): Destination path for the filecontent(required): File content to upload
read_file_from_daytona
file_path(required): Path of the file to read
start_long_running_command_daytona
command(required): The command to starttimeout: Timeout in seconds
Plugin Configuration
DaytonaPlugin(
api_key="your-api-key", # Daytona API key (or use DAYTONA_API_KEY env var)
plugin_name="daytona_plugin", # Plugin identifier
sandbox_name="my-sandbox", # Optional sandbox name
env_vars={"KEY": "value"}, # Environment variables for the sandbox
labels={"env": "dev"}, # Custom labels
auto_stop_interval=15, # Auto-stop after N minutes (0 to disable)
auto_delete_interval=60, # Auto-delete stopped sandbox after N minutes
)
Examples
See the examples/ directory for complete working examples:
Usage Patterns:
patterns/with_app.py- Using DaytonaPlugin with the App pattern (recommended)patterns/with_runner.py- Using DaytonaPlugin with Runner directly
Specific Use Cases:
multi_language_execution.py- Execute Python, JavaScript, and TypeScript codefile_operations.py- Upload scripts, execute them, and read output fileslong_running_process.py- Start and manage background processes
Architecture
packages/adk-plugin/
├── daytona_adk/
│ ├── __init__.py # Package exports
│ ├── plugin.py # DaytonaPlugin (extends BasePlugin)
│ └── tools.py # ADK tool implementations
├── examples/
│ ├── patterns/
│ │ ├── with_app.py # App pattern example
│ │ └── with_runner.py # Runner pattern example
│ ├── multi_language_execution.py # Multi-language code execution
│ ├── file_operations.py # Script upload and file reading
│ └── long_running_process.py # Background process management
├── tests/
│ └── test_tools.py # Tool unit tests
└── pyproject.toml
Key Components
-
DaytonaPlugin: Extends
BasePlugin- Creates and manages sandbox lifecycle
- Provides tools via
get_tools() - Implements lifecycle callbacks
-
Tools: ADK tool implementations using
BaseTool- Each tool wraps Daytona SDK operations
- Shared sandbox instance for state persistence
License
Apache 2.0 - See LICENSE file for details.
References
Metadata
Release files for daytona-adk 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| daytona_adk-0.2.0.tar.gz | 15.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| daytona_adk-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 28.5 kB
Release files / daytona_adk-0.2.0.tar.gz
| Download URL | daytona_adk-0.2.0.tar.gz |
|---|---|
| Size | 15.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1ef467b8118e526f975e24fc2122d366205e5df86e63f498390a54c047955a41
|
|
BLAKE2b-256 checksum How to use checksums |
3a14b5e50d768cf441c6d23ce0e1159ebafe8d65c9f3faa62a93cdfd54513e25
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 6, 2026.
Transparency logRelease files / daytona_adk-0.2.0-py3-none-any.whl
| Download URL | daytona_adk-0.2.0-py3-none-any.whl |
|---|---|
| Size | 12.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
eede5e2e100c8d400bdc92736506246994cf50c05cf7564c717e00a7efceacfa
|
|
BLAKE2b-256 checksum How to use checksums |
fbae53ec66c597c4fca78e5d05b76c243940c18a203a5e360d39168e757dbee1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 6, 2026.
Transparency log